QA@IT

Win32APIのWNDCLASSEX構造体について

3316 PV

ちゃんとした書籍を所持していないため,ネットで調べただけなのですが,どのサイトを調べてもWNDCLASSEX構造体が何のためにあるのかが,わかりません.
自分はメンバ変数の内容を見て,思うに,ボタンやテキストボックスなどを配置しているウインドウについての設定及び,そのウインドウのコントロール化における,マウスポインタの仕様などなどを決めているものだと思ってます.

また,もしこの考えが間違っていないとするならばウインドウ一つにつき,WNDCLASSEX構造体は一つ必要なのでしょうか?

回答

基本的にはその通りですが例外もあります。

最近はVisual Studioなどの開発ツールを使ってGUIを設計することが多いですが、Win32 APIを使ってウィンドウを作成したり、ウィンドウの設定を変更する際にはWNDCLASSEXを引数として与える必要があります。
用途としてはeida_227さんの書かれている通りで、ウィンドウに対してアイコンやマウスカーソル、メニューなどを指定する際に使用します。特に重要なのはウィンドウプロシージャの設定で、この関数でウィンドウに対して送られる全メッセージを処理することになります。

さて、ウィンドウ毎に必要なのはその通りですが、Windowsの場合、ボタンやエディットボックス、ラベルといった各要素も「見た目や機能がボタンになっているウィンドウ」、「見た目や機能がラベルになっているウィンドウ」となります。

Visual Studioをお持ちであればスタート>Visual Studio.NETツール>Spy++を起動して、ウィンドウの一覧を見てみるとウィンドウの子要素として様々なウィンドウ(ボタンやラベル)があるのが見えて面白いかと思います。

さて、例外です。
WNDCLASSEXは見た目やメッセージを処理する関数を定義するわけですが、ボタンの見た目はどれも一緒ですので、WNDCLASSEXも同じもの(Button)を再利用します。
つまり、同じ見た目のウィンドウを複数作るのであれば、WNDCLASSEXは一度だけ登録して、複数回CreateWindowEx APIを呼ぶことになりますね。

編集 履歴 (0)
  • ご回答ありがとうございます。
    もしWin32APIをクラスに実装する際にはウインドウに限らず、ボタンでもラベルでもWNDCLASSEXは在っても大丈夫という事でしょうか?
    -
  • ButtonやLabelといったWNDCLASSEXはOS側が最初から登録済みの為、RegisterClassExを呼ぶ必要はありません。
    となるとWNDCLASSEX自体が不要な為、ボタンや、ラベルを表すクラスにWNDCLASSEXを持たせるのはあまり意味が無い気がします。
    持たせるのであればCreateWindowExに渡す為のクラス名(文字列)でしょうか。
    -
  • これで個人的には満足なクラス設計が出来そうです。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。