|
分類:[C/C++]
WMPやWinampのような、非矩形スキンの実装方法について質問です。 Windows2000以降のみの対応と考えているため、メインのウィンドウに関し ては、レイヤードウィンドウにすることで簡単に実現できることは分かるの ですが、問題はウィンドウ内部に配置するボタン類です。内部のボタン類も、 描画だけであればAlphaBlendを使えば良いと思いますが、ヒットテストの実 現方法で悩んでいます。
一応自分なりに考えてみましたが、どれも違う気がします。
1.全てのボタン類を子ウィンドウとして生成する。 ボタン類を全てレイヤードウィンドウとして生成すれば、マウスメッセージ はウィンドウごとに受け取れる上、透明部分を除外したヒットテストも勝手 にやってくれるので、希望の動作は最も簡単に実現できそうですが、ウィン ドウだらけになって重くなりそうですし(作成予定のプログラムは性質上ボ タンが多くなります)、なによりWMPやWinampのウィンドウをSpy++で見ても そのような子ウィンドウは見当たりません。
2.ボタン用の子ウィンドウを1枚だけ重ねる。 メインウィンドウと同サイズのレイヤードウィンドウをメインウィンドウの 上に重ね、ボタン類はその中の所定位置にAlphaBlendで描画します。子ウィ ンドウにマウスメッセージが来たら、ボタンを描画した先の矩形範囲(複数) とマウス座標とのヒットテストを自前で行えば、とりあえずは出来そうです。 しかし、ボタン画像を描画する矩形範囲同士は(実際には透明になる部分で あっても)重ねることが出来ません。また、やはりWMPやWinampにそのような 子ウィンドウはないようです。
3.パーツごとのリージョンを作成。 ボタン画像からリージョンを作成し、PtInRegionでヒットテストする。リー ジョンを使うならレイヤードウィンドウを使う意味がなくなるので、これは 無いだろうと思いました。
今では様々なアプリで普通にスキンが使用されており、常識的な手法なのか もしれませんが、当方ビジュアル面のプログラムに関しては全くの素人で、 この程度の想像しかできません。 スキン対応プログラムの開発経験がある方、または知識のある方がおられま したら、ご教授ください。 また関連情報のあるサイト、書籍などがあれば紹介していただけると助かり ます。
|