2005年2月18日

GDI+ と VC++ と日本語

 GDI+を使ってみた。GDI+ はWindowsXPから使えるようになった2DグラフィックAPIである。XP以前でも、gdiplus.dllを入れれば利用可能である。(98以降か、NT4.0sp6以降)

 昔はJPEGを読もうと思うと一苦労で、フリーソフトではSusieのプラグインを利用するのが一般的であったと思う。また、商用ではImageGearが有名だろうか(ボクがそれしか知らないだけかも)。今使うなら、GDI+がオススメかと思う。

 で、猫でもわかるプログラミングを見ながらMFCに移植しつつファイルを読ませて表示してみた。結構カンタンに表示できた。しかし、一部のファイルが読めない。読めない条件が分からない。しばらくして、ファイル名に漢字というか日本語というか2バイト文字というかMBCSがあると読めないことに気付いた。もともと GDI+ はUNICODEで渡さなきゃならんので、mbstowcs() は通している。しかし読めない。Imageクラスのコンストラクタでも、FromFile()関数でも読めない。Bitmapクラスでも同じ。なんでだゴルァ。ボクは猫未満か?

 「GDI+ 日本語」とかでググってもわからない。みんなちゃんと使えてるのかよ。それともGDI+をVC++で使う日本人はボクだけかよ。英語の文章も読もうかと思ったけど multi byte string のネタを英語で語るやつなんかいねぇよ。

 と、途方にくれているところで、過去の苦い経験を思い出した。mbstowcs() の前に setlocale() を呼んどかなきゃならんことを。デフォルトでOSのエンコードを採用してくれよと思うのだが、setlocale(LC_ALL,""); が必須なのである。VC6のせいなのだろうか。VC.NETでは直っているのだろうか。Windowsの仕様なのだろうか。

 全体的にVC++の話はググっても情報が少ない。Win32APIの関数名でググっても、VBとかDelphiから利用する話が多い。なので今回はググられそうなキーワードをちりばめつつ書いてみた。もしお役に立てたのであれば、清き1クリックをキボンとあいまいな表現で乞うテスト。




Posted by rukihena at 23:23:29
コメント

こんにちは
まさに、あなたのページの内容と同じ所ではまっていました。また僕も同じように”猫でも分かるプログラミング”を見ながら僕の場合はそのままwin32でとりあえず丸写し
したのですが、開くものと開かないものがあり???でした。本当に役に立ちました
やっとこれからGDI+のスタートラインに立った気がします
でわ!

Posted by jigokuneko at 2005年2月27日 13:58

> setlocale(LC_ALL,"");
これはVC++のせい(実装の仕様)というのが一番近いと思います。

CやC++の標準規格では,setlocaleする前は「Cロケール」と言う中立的なものに設定されていることになっています。
OSのデフォルトを使うような実装があってもなんら問題は無いわけですから。

Posted by Anonymous at 2006年3月15日 00:25

コメントありがとうございます。
今更ドキュメントを確認したのですが、

> プログラムの起動時には、次の文と同等の処理が実行されます。
> setlocale( LC_ALL, "C" );

って書いてありますね。

http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_setlocale.2c_._wsetlocale.htm

Posted by るきへな at 2006年3月15日 00:44

そういうことだったんですか、ほんとに助かりました。

Posted by haru at 2007年3月 2日 00:33

こんなもんでしたか?
普段僕はファイル名をアルファベットだけにして回避してますが。。。
お勉強になりました。

Posted by Anonymous at 2008年7月11日 14:06