Dec 26, 2005

またまたドハマリ、「イメージリストコントロールを使い、Windows XP上で32ビットアンチエイリアシングビッ

ポスト @ 14:22:14 | プログラミング,ATL/WTL

いやもうなんで自分はここまで本筋じゃないところでハマるのか。元バイトで現在取締役社長のKさん(先日「うちの社は取締役が自分だけなんで『代表』つきませんから!」と指摘されました。すみませんでした。笑)からも「いずみさんていつも関係ないところでハマってますよね」と冷酷に指摘されてるのですが、今回の旅先での作業もまたまた大ハマリ。涙

今回のテーマは、「背景に画像などを持ってて、その上にアンチエイリアシングのかかったフォントやグラフィックでデジタル時計を表示するActiveXコントロール・XP上で動けばよい」です。
で、Win2000以上でなら、GDI+を使えばαブレンディングは比較的カンタンにできるのですけれど、「XPではイメージリストが32bitαチャンネルをサポートしている」というのをMSDN斜め読みしてるときに見つけ、「じゃー旅先で書いておきますよ」と決めたのです。
Kさんは「いずみさんなら2時間でできますよね」とまたまたお得意のプレッシャー。「えーそんなのムリだよー」と行っておいたのですが、確かにコード書いて2時間で時計は出来上がりました(^^;;)。

だがしかし。

そうです、ぜんぜん透過表示されないんです

結局トータルで4時間くらい試行錯誤したんですが解決せず、本日出勤してからぐぐりまくって1時間でようやく解決…ほっ。

とりあえず備忘録的に(笑)、ここにHow Toを書いておくことにします。

(1)イメージリストでαチャンネルを有効にするには、コントロールDLLにマニフェストリソースを付加しなければならない(よく考えるとアタリマエ^^;;)
(2)DLLに付加するマニフェストのリソースIDは、CREATEPROCESS_MANIFEST_RESOURCE_IDではなくISOLATIONAWARE_MANIFEST_RESOURCE_ID
(3)コンパイルスイッチで/DISOLATION_AWARE_ENABLEDが必要
(4)イメージリストのCreate()ではまず空のを作成するAPIで、フラグにILC_COLOR32が必要
(5)Create()の後にAdd()する32bitαチャンネルつきビットマップの生成では、フラグにLR_CREATEDIBSECTIONのみを指定
(6)Draw()で描画する際のフラグは、MSDNの記述に惑わされることなくILD_TRANSPARENTのみを指定

さすがに(4)(5)ははじめから守ってますが、いやはや、とんだ大ハマリでした…涙

Trackback

No Trackbacks

Track from Your Website

http://blog.izumichan.com/trackback/tb.php?id=133

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。