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

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

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

Re[1]: 非矩形スキンの実装方法


(過去ログ 31 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■15065 / inTopicNo.1)  非矩形スキンの実装方法
  
□投稿者/ 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でヒットテストする。リー
ジョンを使うならレイヤードウィンドウを使う意味がなくなるので、これは
無いだろうと思いました。


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

引用返信 編集キー/
■15066 / inTopicNo.2)  Re[1]: 非矩形スキンの実装方法
□投稿者/ れい (433回)-(2008/03/03(Mon) 20:41:28)
No15065 (lasvegas777 さん) に返信
> 今では様々なアプリで普通にスキンが使用されており、常識的な手法なのか
> もしれませんが、当方ビジュアル面のプログラムに関しては全くの素人で、
> この程度の想像しかできません。

私は3の方法で実装しました。
1はレイヤードはトップレベルしかできないのでだめです。
2はちょっと意味が理解できませんでした。

引用返信 編集キー/
■15085 / inTopicNo.3)  Re[1]: 非矩形スキンの実装方法
□投稿者/ シャノン (307回)-(2008/03/04(Tue) 11:03:04)
No15065 (lasvegas777 さん) に返信
C++じゃできないのが難点だけど、WPFなら簡単に作れそう。
引用返信 編集キー/
■15165 / inTopicNo.4)  Re[2]: 非矩形スキンの実装方法
□投稿者/ lasvegas777 (2回)-(2008/03/05(Wed) 21:41:41)
No15066 (れい さん) に返信
> 私は3の方法で実装しました。
> 1はレイヤードはトップレベルしかできないのでだめです。
リージョンでしたか。
レイヤードウィンドウが使えるようになっても、この辺は以前からの
手法を使わなければならないのですね・・・
ありがとうございました。

No15085 (シャノン さん) に返信
> C++じゃできないのが難点だけど、WPFなら簡単に作れそう。
事情によりC++です。場合によってはC+SDKかもしれません。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -