Home > Archives > 2009-07
2009-07
ウィンドウの形状を変える4
- 2009-07-17 (金)
- 技術
●レイヤードウィンドウで行こう.楽だし.
2つの方法で,それぞれ猫型ウィンドウ表示ができましたが,リージョンを使う方法だと,画像を拡大したり反転したりして表示したくなったときの対応方法を考えるのが面倒そうなので,レイヤードウィンドウの方法を採用することにしました.
あと,猫をドラッグで移動させたくなったのですが,自分で
マウス押下されたらウィンドウ移動操作状態に入る → ドラッグ中はマウス移動に合わせてウィンドウ移動さす → マウスボタン離されたらウィンドウ移動操作状態終了
という処理を書くのが面倒なので,ウィンドウプロシージャ内で,
case WM_NCHITTEST:
{ //クライアント領域へのマウスイベントは全てタイトルバーに発生したことにしてしまう.
//利点:左ドラッグでのウィンドウ移動を勝手にやってくれる.
//欠点:クライアント領域へのマウスイベント通知はこなくなる.
LRESULT ret = DefWindowProc( hWnd, message, wParam, lParam );
return ( ret == HTCLIENT ? HTCAPTION : ret );
}
break;
として,ウィンドウの移動はシステム側に勝手にやってもらうようにしました.
(クライアント領域でマウス押下したのに,タイトルバーの上でマウス押下されたことにでっちあげる.)
背景透過しました.右向き猫は左向きの画像をStretchBltで反転描画で使いまわし.
- Comments (Close): 0
- Trackbacks (Close): 0
ウィンドウ形状を変える3
- 2009-07-17 (金)
- 技術
●レイヤードウィンドウでウィンドウ形状を変える
【使うAPI】
SetWindowLong, SetLayeredWindowAttributes
【要約】
拡張ウィンドウスタイルでレイヤードウィンドウ指定 → SetLayeredWindowAttributesで調整.
ウィンドウをレイヤードウィンドウにする(?)には,SetWindowLongで拡張ウィンドウスタイルにWS_EX_LAYEREDを設定します.
SetWindowLong( hWnd, GWL_EXSTYLE, GetWindowLong( hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED );
(ウィンドウ生成時にCreateWindowExを使って指定してもOK.)
で,SetLayeredWindowAttributes関数で透過色(今回は白なのでRGB(255,255,255))を設定するだけです.この関数はウィンドウの透明度も設定できるので,猫を半透明にすることも可能です.
あとは猫の画像を描画すれば,勝手に指定した色の部分が透過されます.
(この辺はVisualStudioのバージョンとかで変わるのかもしれませんが)ビルドしようとすると,レイヤードウィンドウ関係の定数が「定義されていません」と言われます.
なにやらwindows.hあたりで#ifdefで定義するかしないかが切り替えられているようです.
windows.hをインクルードする前に
#define _WIN32_WINNT 0x0500
とかすると(本当にこれでいいのだろうか?)レイヤードウィンドウ関係の定数を定義させることができます.
レイヤードウィンドウを使うと,ウィンドウを猫型にするための処理はたったこれだけなので,
途中で猫の透明度を変えたりとかしないのであれば,ウィンドウプロシージャのWM_CREATEメッセージに対する処理あたりで,SetWindowLongとSetLayerdWindowAttributesを一度コールするだけでOK.
(4)ウィンドウ形状を変える4
- Comments (Close): 0
- Trackbacks (Close): 0
Home > Archives > 2009-07