C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 31 を表示中)
■15065 / )  非矩形スキンの実装方法
□投稿者/ lasvegas777 (1回)-(2008/03/03(Mon) 20:22:33)

分類:[C/C++] 

WMPやWinampのような、非矩形スキンの実装方法について質問です。
Windows2000以降のみの対応と考えているため、メインのウィンドウに関し
ては、レイヤードウィンドウにすることで簡単に実現できることは分かるの
ですが、問題はウィンドウ内部に配置するボタン類です。内部のボタン類も、
描画だけであればAlphaBlendを使えば良いと思いますが、ヒットテストの実
現方法で悩んでいます。

一応自分なりに考えてみましたが、どれも違う気がします。

1.全てのボタン類を子ウィンドウとして生成する。
ボタン類を全てレイヤードウィンドウとして生成すれば、マウスメッセージ
はウィンドウごとに受け取れる上、透明部分を除外したヒットテストも勝手
にやってくれるので、希望の動作は最も簡単に実現できそうですが、ウィン
ドウだらけになって重くなりそうですし(作成予定のプログラムは性質上ボ
タンが多くなります)、なによりWMPやWinampのウィンドウをSpy++で見ても
そのような子ウィンドウは見当たりません。

2.ボタン用の子ウィンドウを1枚だけ重ねる。
メインウィンドウと同サイズのレイヤードウィンドウをメインウィンドウの
上に重ね、ボタン類はその中の所定位置にAlphaBlendで描画します。子ウィ
ンドウにマウスメッセージが来たら、ボタンを描画した先の矩形範囲(複数)
とマウス座標とのヒットテストを自前で行えば、とりあえずは出来そうです。
しかし、ボタン画像を描画する矩形範囲同士は(実際には透明になる部分で
あっても)重ねることが出来ません。また、やはりWMPやWinampにそのような
子ウィンドウはないようです。

3.パーツごとのリージョンを作成。
ボタン画像からリージョンを作成し、PtInRegionでヒットテストする。リー
ジョンを使うならレイヤードウィンドウを使う意味がなくなるので、これは
無いだろうと思いました。


今では様々なアプリで普通にスキンが使用されており、常識的な手法なのか
もしれませんが、当方ビジュアル面のプログラムに関しては全くの素人で、
この程度の想像しかできません。
スキン対応プログラムの開発経験がある方、または知識のある方がおられま
したら、ご教授ください。
また関連情報のあるサイト、書籍などがあれば紹介していただけると助かり
ます。

返信 編集キー/


管理者用

- Child Tree -