2011年6月3日金曜日

SS_BITMAPでうまくいかないパターン

 SS_BITMAPを指定したstatic controlに
CreateCompatibleBitmapで作成したHBITMAPを
STM_SETIMAGEで設定してもうまく表示されない現象に遭遇した。
 LoadImageしたHBITMAPだとうまく表示されるのに何でだよ。
それじゃあと思い、
LoadImageなHBITMAPに
CreateCompatibleDCなHDCをSelectObjectしてSTM_SETIMAGEすると表示されなくなる。
 SelectObjectがいかんのか? と、
とりあえずHBITMAPはSTM_SETIMAGEしておいて、
表示更新するときだけSelectObjectでHDCと関連付けしてBitBltなどで書き換え、
その後、SelectObject解除としたらうまく表示できた。
中でなにやってるのか知らないけど、SelectObjectに注意されたし。
 
 アニメーションさせようと、
とりあえずstatic controlにDIBSectionで作成したHBITMAPを渡しておいて
あとはピクセルを書き換えたらオッケーかなあとおもっていたが、
描画内容は反映されなかった。
意味ねえ。コピーがとられるだけなのかな。
 結局、一定周期おきにstatic controlからGetDCしてBitBltしてやる方法を取ることに。
すげえ遠回りしてこれかよ!
この方法の場合SS_BITMAPを指定する必要すらなし。
でもサイズ設定がおもうようにいかないのと、描画がずれたりするっぽいのでとりあえず一回STM_SETIMAGEしておくのが無難そう。


In version 6 of the Microsoft Win32 controls, a bitmap passed to a static control using the STM_SETIMAGE message was the same bitmap returned by a subsequent STM_SETIMAGE message. The client is responsible to delete any bitmap sent to a static control.

With Windows XP, if the bitmap passed in the STM_SETIMAGE message contains pixels with nonzero alpha, the static control takes a copy of the bitmap. This copied bitmap is returned by the next STM_SETIMAGE message. The client code may independently track the bitmaps passed to the static control, but if it does not check and release the bitmaps returned from STM_SETIMAGE messages, the bitmaps are leaked.


STM_SETIMAGE Message (Windows)
 とかなんとかでSTM_SETIMAGEしたときの戻り値をDeleteObjectしたらエラー出た。
コピーとるんじゃないのかよ! 
いまひとつ良くわからないが、
セットするHBITMAPはHDCにSelectObjectされているとちゃんと表示してくれないというのだけが確定してる。自分の環境では。
 
 それからstatic control上でカーソル位置を取得に
SetTimerを使い、一定周期おきにGetCursorPosすることで方法をとった。
SS_NOTIFYを指定してWM_NOTIFYがこないかなと期待したが、
代わりにWM_COMMANDがくるらしく、しかもMOUSEMOVEは飛んでこないっぽい。
いい方法ではないが仕方なし。

0 件のコメント: