Google

2007年9月5日水曜日

PopClock作成の軌跡~その4

画像の描画が出来るようになりました。

次は・・・オフスクリーン描画というものをやってみたす。
ウィンドウと同じ大きさの描画領域を用意して、そこにいったん描画して、最後にそれをウィンドウに描画するというもの。
ちっこい画像を次々描画していくより、でっかい画像1つを1回パンッと描画する方が
タイミング的にも画面がちらつかないという利点があるのだそうな。

手順としては、
GetDC関数でウィンドウのDCを取得して、そのウィンドウのDCを元にCreateCompatibleBitmap関数でウィンドウへと同じように描画できる画像領域BMPが出来る。
そしてそのBMPを、予めCreateCompatibleDCで作っておいた別箇DCに割り付けることで
そのDCに対してBitBlt等で描画することが出来る。
ひとしきり描画を行ったところで、1描画の最後にウィンドウDCに対して作成DCを描画(BitBltでOK)することによってオフスクリーン描画終了。
と、こんな感じ。

ループ毎に繰り返し描画を行うにあたって、前回描画した分はクリアする必要が出てくるわけですが。
方法としては、ウィンドウを作る時のパラメータ(WNDCLASS型内のhbrBackground)で背景色を指定しておいて、InvalidateRect関数のところでクリアするように指定する・・・のが多分通常なんだけど。
毎回画面真っ白とか真っ黒とかにしか出来なくて、透明ウィンドウってのがWindowsMobile上で出来ないみたいなのよね。

で、とった方法が、
プログラム起動時のToday画面を別画像でコピー保存しておいて
その画像を毎回背景として最初に描画する・・・という方法す。
GetDCの引数をGetDesktopWindow()で行うことで、デスクトップ自体のDCがとれて
オフスクリーンの時の要領で描画領域用意しておいてソコに描画しておく、と。
あとはその用意したDCを毎回書いていく、って感じ。

というわけでオフスクリーン描画によるちらつき防止と、デスクトップをプリントスクリーンして透明ウィンドウもどきをやった、というお話でした。

なにげにこの透明ウィンドウもどきをやることで、横画面に切替した瞬間えらいことになったりするわけですが・・・現状解決策見つかってなかったりする・・・orz。

0 件のコメント: