hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
OwnerDraw/ODOverview - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

オーナードロー(OwnerDraw)について

オーナードローとは何か

はじめに

オーナードロー(ownerdraw)とはボタン、コンボボックス、リストボックスなどの見ためを自由に変更するときに使用する手法です。
ここではオーナードローを行う具体的な方法の説明の前にオーナードローとはどういうものなのか、またそのことを理解するために必要な Windows の仕組みの一部を説明します。

HSP のオブジェクトとコントロール

いきなりですが HSP で使えるボタンとはどういうものだと思いますか。

HSP で扱えるオブジェクト・・・ボタンや入力ボックス、コンボボックス、リストボックスなどは Windows では『コントロール』と呼ばれるものです。
Windows のウィンドウの上に配置されているいろいろな小物、ボタン、入力ボックス、ツールバーやステータスバー、タブやスクロールバーなどはほとんどコントロールです。
(例外もあります。ウィンドウの右上の最小化、最大化、閉じるボタンやツールバー上のボタンはウィンドウやコントロールの部品扱いで独立したコントロールではありません。
またスクロールバーにもコントロールのものとウィンドウの部品扱いのものがあります。)

ではコントロールとはなんでしょうか。
実はコントロールの正体は『ウィンドウ』です。
コントロールとは一つ一つが独立したウィンドウなのです。

ウィンドウとコントロール

ところでウィンドウは HSP でも普通に使っています。
HSP のウィンドウとコントロールはどこが違うのでしょうか、ここでは見た目を比べてみましょう。

screen 命令で作った HSP のウィンドウは周りに枠があり、上のほうにアイコン、タイトル、3 つのボタンが描かれた領域があり、 その下に各種命令を使って自由に書き込みが出来る白一色の領域があります。
また bgscr 命令で作った場合は枠や上部の領域がなくなりますね。

ではコントロール、例えば button 命令で作ったボタンを見てみましょう。
周囲には立体的に見えるように明暗をつけた枠が描かれ、その内側は灰色(違う色の環境もあるかもしれませんが)で塗りつぶされ、 ボタンに設定された文字列が書かれています。

見た目に違うところがあるとわかっても、どこがどう違うとまとめて説明することは難しそうですね、でも気にしないで下さい。
ここで理解して欲しいことは、

  1. 「ウィンドウの中には何も描かれておらず HSP のプログラムが自由に書き換えられる領域と、あらかじめ何か(枠やある色の背景、直接書いたわけではない文字列など)が描かれており HSP のプログラムが自由に書き換えることはできない領域がある。」
  2. 「コントロールの中にはあらかじめ何かが描かれており HSP のプログラムが自由に書き換えることはできない領域しか存在しない。」

という二点です。
(ここでいう『自由に書き換えられる』というのは直接その領域に絵でも文字列でも自由に書き込めるということを言っています。
また『HSP のプログラムが自由に書き換えることはできない』というのは普通のやりかたでの話です。)

コントロールの描画

さてこの文章を読んでいる人はオーナードローとは何かを知りたい人でしょうからこう思ったかもしれません。

  • 「コントロールの『HSP のプログラムが自由に書き換えることはできない』領域を自由に書き換えるための方法、それがオーナードローなのでは。」

残念ながら違います。
確かに HSP の標準命令だけでは『HSP のプログラムが自由に書き換えることはできない』領域に描画することは難しいです。
ただ、それは HSP に限った話で、実は HSP のウィンドウの『HSP のプログラムが自由に書き換えられる領域』に描画することと、ウィンドウやコントロールの『HSP のプログラムが自由に書き換えることはできない領域』に描画することは同じことでしかないのです。

問題点は『あらかじめ何かが描かれており HSP のプログラムが自由に書き換えることはできない領域』の『あらかじめ何かが描かれており』のところです。
そこに描かれているものは誰が描いたのでしょうか。
そこをはっきりさせないままHSP のプログラムがコントロールに描画したとしてもその誰かに上から描画されてしまっては意味がありません。

でももう予想できているかもしれませんね、その誰かとは Windows です。
画面に表示されるウィンドウの枠やタイトル、コントロール内の全ての領域などは Windows があらかじめ決められた見ためになるように自動的に描画しているのです。

オーナードロー

ここまで辛抱強くこの文章を読んできた人にはもうおわかりでしょう。

オーナードローとは Windows が自動的にコントロールを描画するのを止めさせてプログラムのみがコントロールに描画するような状態のことを言うのです。
コントロールを表示する時に Windows ではなくそのコントロールを使用するプログラム(コントロールの所有者・オーナー)がコントロールを描画(ドロー)するため、これをオーナードローと呼びます。
(ここまではコントロールについて説明してきましたが例外的にメニュー項目もオーナードローにできます。
基本の考え方はコントロールと同じです。)

オーナードローを使いコントロールを描画する際の基本的な流れ

ここでは実際にオーナードローを使いコントロールの見た目を変更する場合の基本的な流れを説明します。
といっても流れ自体は単純です。以下のような流れになります。

1  対象のコントロールをオーナードロー状態にする。
2  必要な設定を行う。
3  描画を行うタイミングを待つ。
4  コントロールを描画する。
5  3,4 を繰り返す。


それぞれの流れについてもう少し詳しく説明します。

1 : 対象のコントロールをオーナードロー状態にする

  • オーナードロースタイルが用意されているコントロールの場合
    一部のコントロールはあらかじめオーナードロー状態にするためのスタイル設定が用意されています。
    オーナードロースタイルが用意されているコントロールはコントロール作成時に設定するか、 作成後にスタイルを変更することによってオーナードロー状態に出来ます。
    オーナードロースタイルが用意されているのは次のコントロールです。
    • メニュー項目(コントロールではないですがオーナードロースタイルが用意されています)
    • リストボックス
    • コンボボックス
    • ボタン
    • スタティックコントロール
    • ヘッダーコントロール
    • タブコントロール
    • リストビューコントロール
       
  • オーナードロースタイルが用意されていないコントロール
    ウィンドウのサブクラス化という方法を使って Windows がコントロールを描画するのを止めさせます。
    (ここではこれ以上詳しくは説明しません。)

2 : 必要な設定を行う

コンボボックスなどのコントロールは項目ごとに別々に描画を行うことが出来ます。
そうしたものの場合は描画を行う前に描画する項目の大きさを設定しておく必要があります。

3 : 描画を行うタイミングを待つ

コントロールを描画するのに適当な間隔で常に描画を繰り返すのでは無駄な作業が多くなり システムにかける負荷も大きくなってしまいます。
これを避けて必要なときにのみコントロールの描画を行うには Windows の仕組みを利用します。

基本的に Windows は画面を描き換える必要のある状況になったときに 描き換える必要のある部分のみを描画する、という方法で画面を表示しています。
その際に描き換える必要のある部分にプログラムが使っている普通のウィンドウがあるときは そのプログラムに対してウィンドウメッセージという知らせを送ってきます。

コントロールをオーナードロースタイルにしているときは、描き換える必要のある部分に そのコントロールがあるときにもプログラムにウィンドウメッセージが送られてくるので その知らせが送られてきたときにだけ描画を行うようにします。

4 : コントロールを描画する

コントロールを描画します。
(と書くと簡単そうですが、プログラムを組む際はここが一番大変になります。)

5 : 3,4 を繰り返す。

コントロールを描画したあとは 3 に戻り、再び描画が必要となるまで待ちます。

naznyark --2006-01-08 (日) 00:19:27

コメント

  • こんなものかな? 根本的に大間違いなら削除だな。 -- naznyark? 2006-01-06 (金) 00:09:07
  • アクセント加えてみました -- kz3 2006-01-06 (金) 02:53:22
  • kz3さん、ありがとうございます。とても読みやすくなりました。 -- naznyark? 2006-01-07 (土) 00:16:05

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-05-10 (金) 17:08:50 (212d)