たまにはVC++ |
『メニューにビットマップを表示する(オーナードロー)』
2002.Jul.12
|
オーナードローとは? |
オーナー(親)がドロー(描画)するという意味です。
どういう事かというと、通常、メニューを表示させる場合は「何をどうやって表示する」なんて考えないハズです。
一番簡単なのは、リソースから引っ張ってくりゃIDの管理だけで済みます。
しかし「オーナードロー」は、メニューに表示する文字から、マウスポインタが上にある時のメニューの選択色、バックグラウンド
全て「親」つまり貴方が作らなくてはいけません。
親は、まず元となるメニューを作り、メニューが表示されようとした時、文字やビットマップを描画し、選択されたら背景色を青くしたり、また元に戻して・・・。
最初の内は結構難しいです。
でも慣れてくれば、ワンパターンな処理なので、サブルーチン化すれば大体オーケーでしょう。
|
コードは? |
ではオーナードローメニューのサンプルソースです。
サンプルソース(HTML形式)
結構長く見えますね。でもやってる事は単純です。
|
実行結果 |
上の「メニュー」というヤツをクリックしても、同様の結果とないります。
メニュー毎の処理は書いていません。
細かい解説は特にしません。
分かる方なら見れば大体分かると思います。
表示しているビットマップは、リソースのビットマップでありアイコンではありません。
元画像はこんな感じで、
これを切り取るような感じでメニューに貼り付けています。
アイコンファイルを使うか、ビットマップの背景色を黒くするか(BitBlt時にSRCINVERTコピー)、イメージリストコントロールを使えば、背景を透過させれます。
あと、選択状態のアイコンにフレームを付ける処理をしていますが、DrawFrameControl関数を使ってしまうと、淵が大きすぎてなんか変です。
ここでは3回の塗りつぶしを行っていますが、普通はLineToとかでもいいと思います。
文字の表示が面倒臭いと思いますが、みんな似たような感じでセコセコやっているみたいです。
|
終わり |
うーん、ソースコード中には「6月25日作成」と書いてあるのですが、公開に半月以上かかってしまいましたね。
オーナードローって結構難しくて、完成した時思わず「やった!」なんて叫んでしまいました。
そんな経験ありませんか?
今回のサンプルソース
c03.lzh (3.66KB)
|