たまにはVC++

『メニューにビットマップを表示する(オーナードロー)』
2002.Jul.12

オーナードローとは?

オーナー(親)がドロー(描画)するという意味です。
どういう事かというと、通常、メニューを表示させる場合は「何をどうやって表示する」なんて考えないハズです。
一番簡単なのは、リソースから引っ張ってくりゃIDの管理だけで済みます。

しかし「オーナードロー」は、メニューに表示する文字から、マウスポインタが上にある時のメニューの選択色、バックグラウンド
全て「親」つまり貴方が作らなくてはいけません。
親は、まず元となるメニューを作り、メニューが表示されようとした時、文字やビットマップを描画し、選択されたら背景色を青くしたり、また元に戻して・・・。
最初の内は結構難しいです。
でも慣れてくれば、ワンパターンな処理なので、サブルーチン化すれば大体オーケーでしょう。

コードは?

ではオーナードローメニューのサンプルソースです。

サンプルソース(HTML形式)

結構長く見えますね。でもやってる事は単純です。
実行結果



上の「メニュー」というヤツをクリックしても、同様の結果とないります。
メニュー毎の処理は書いていません。

細かい解説は特にしません。
分かる方なら見れば大体分かると思います。
表示しているビットマップは、リソースのビットマップでありアイコンではありません。
元画像はこんな感じで、



これを切り取るような感じでメニューに貼り付けています。
アイコンファイルを使うか、ビットマップの背景色を黒くするか(BitBlt時にSRCINVERTコピー)、イメージリストコントロールを使えば、背景を透過させれます。
あと、選択状態のアイコンにフレームを付ける処理をしていますが、DrawFrameControl関数を使ってしまうと、淵が大きすぎてなんか変です。
ここでは3回の塗りつぶしを行っていますが、普通はLineToとかでもいいと思います。

文字の表示が面倒臭いと思いますが、みんな似たような感じでセコセコやっているみたいです。

終わり
うーん、ソースコード中には「6月25日作成」と書いてあるのですが、公開に半月以上かかってしまいましたね。
オーナードローって結構難しくて、完成した時思わず「やった!」なんて叫んでしまいました。
そんな経験ありませんか?

今回のサンプルソース
c03.lzh (3.66KB)



[先頭ページへ] [次のページへ]

リンクフリー  Copyright (C) K_Yaguchi