hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
オーナードロー(ownerdraw)とはボタン、コンボボックス、リストボックスなどの見ためを自由に変更するときに使用する手法です。
ここではオーナードローを行う具体的な方法の説明の前にオーナードローとはどういうものなのか、またそのことを理解するために必要な Windows の仕組みの一部を説明します。
いきなりですが HSP で使えるボタンとはどういうものだと思いますか。
HSP で扱えるオブジェクト・・・ボタンや入力ボックス、コンボボックス、リストボックスなどは Windows では『コントロール』と呼ばれるものです。
Windows のウィンドウの上に配置されているいろいろな小物、ボタン、入力ボックス、ツールバーやステータスバー、タブやスクロールバーなどはほとんどコントロールです。
(例外もあります。ウィンドウの右上の最小化、最大化、閉じるボタンやツールバー上のボタンはウィンドウやコントロールの部品扱いで独立したコントロールではありません。
またスクロールバーにもコントロールのものとウィンドウの部品扱いのものがあります。)
ではコントロールとはなんでしょうか。
実はコントロールの正体は『ウィンドウ』です。
コントロールとは一つ一つが独立したウィンドウなのです。
ところでウィンドウは HSP でも普通に使っています。
HSP のウィンドウとコントロールはどこが違うのでしょうか、ここでは見た目を比べてみましょう。
screen 命令で作った HSP のウィンドウは周りに枠があり、上のほうにアイコン、タイトル、3 つのボタンが描かれた領域があり、
その下に各種命令を使って自由に書き込みが出来る白一色の領域があります。
また bgscr 命令で作った場合は枠や上部の領域がなくなりますね。
ではコントロール、例えば button 命令で作ったボタンを見てみましょう。
周囲には立体的に見えるように明暗をつけた枠が描かれ、その内側は灰色(違う色の環境もあるかもしれませんが)で塗りつぶされ、
ボタンに設定された文字列が書かれています。
見た目に違うところがあるとわかっても、どこがどう違うとまとめて説明することは難しそうですね、でも気にしないで下さい。
ここで理解して欲しいことは、
という二点です。
(ここでいう『自由に書き換えられる』というのは直接その領域に絵でも文字列でも自由に書き込めるということを言っています。
また『HSP のプログラムが自由に書き換えることはできない』というのは普通のやりかたでの話です。)
さてこの文章を読んでいる人はオーナードローとは何かを知りたい人でしょうからこう思ったかもしれません。
残念ながら違います。
確かに HSP の標準命令だけでは『HSP のプログラムが自由に書き換えることはできない』領域に描画することは難しいです。
ただ、それは HSP に限った話で、実は HSP のウィンドウの『HSP のプログラムが自由に書き換えられる領域』に描画することと、ウィンドウやコントロールの『HSP のプログラムが自由に書き換えることはできない領域』に描画することは同じことでしかないのです。
問題点は『あらかじめ何かが描かれており HSP のプログラムが自由に書き換えることはできない領域』の『あらかじめ何かが描かれており』のところです。
そこに描かれているものは誰が描いたのでしょうか。
そこをはっきりさせないままHSP のプログラムがコントロールに描画したとしてもその誰かに上から描画されてしまっては意味がありません。
でももう予想できているかもしれませんね、その誰かとは Windows です。
画面に表示されるウィンドウの枠やタイトル、コントロール内の全ての領域などは Windows があらかじめ決められた見ためになるように自動的に描画しているのです。
ここまで辛抱強くこの文章を読んできた人にはもうおわかりでしょう。
オーナードローとは Windows が自動的にコントロールを描画するのを止めさせてプログラムのみがコントロールに描画するような状態のことを言うのです。
コントロールを表示する時に Windows ではなくそのコントロールを使用するプログラム(コントロールの所有者・オーナー)がコントロールを描画(ドロー)するため、これをオーナードローと呼びます。
(ここまではコントロールについて説明してきましたが例外的にメニュー項目もオーナードローにできます。
基本の考え方はコントロールと同じです。)
ここでは実際にオーナードローを使いコントロールの見た目を変更する場合の基本的な流れを説明します。
といっても流れ自体は単純です。以下のような流れになります。
1 対象のコントロールをオーナードロー状態にする。 2 必要な設定を行う。 3 描画を行うタイミングを待つ。 4 コントロールを描画する。 5 3,4 を繰り返す。
それぞれの流れについてもう少し詳しく説明します。
コンボボックスなどのコントロールは項目ごとに別々に描画を行うことが出来ます。
そうしたものの場合は描画を行う前に描画する項目の大きさを設定しておく必要があります。
コントロールを描画するのに適当な間隔で常に描画を繰り返すのでは無駄な作業が多くなり
システムにかける負荷も大きくなってしまいます。
これを避けて必要なときにのみコントロールの描画を行うには Windows の仕組みを利用します。
基本的に Windows は画面を描き換える必要のある状況になったときに
描き換える必要のある部分のみを描画する、という方法で画面を表示しています。
その際に描き換える必要のある部分にプログラムが使っている普通のウィンドウがあるときは
そのプログラムに対してウィンドウメッセージという知らせを送ってきます。
コントロールをオーナードロースタイルにしているときは、描き換える必要のある部分に
そのコントロールがあるときにもプログラムにウィンドウメッセージが送られてくるので
その知らせが送られてきたときにだけ描画を行うようにします。
コントロールを描画します。
(と書くと簡単そうですが、プログラムを組む際はここが一番大変になります。)
コントロールを描画したあとは 3 に戻り、再び描画が必要となるまで待ちます。