2

Windows API は、WNDCLASS / WNDCLASSEX構造に依存する「クラス」を使用することを理解しています。

私はWindows API Hello Worldアプリケーションをうまく使いこなし、このクラスが私たち自身のウィンドウだけでなく、「EDIT」、「BUTTON」などのWindowsコアコントロールでも使用されていることを理解しています。 WndProc (関数を定義できます)

このクラスに関するドキュメントは見つかりますが、概念を説明するものは見つかりません。

これまでのところ、私が見つけた唯一のことはこれでした:

ウィンドウ クラスは、C++ クラスとは何の関係もありません。

これは本当に役に立ちません(それが何でないかは教えてくれますが、それが何であるか教えてくれません)。実際、WNDCLASSEX を C++ クラスに関連付けて、「WNDCLASSEX」がコントロールタイプを表していると考えたくなるから です。それで、私の最初の質問は、それは何ですか?

次に、クラスで WndProc を定義できることを理解しています。ただし、ウィンドウは、子コントロール (またはウィンドウ、または Windows API で呼び出されるもの) からメッセージを取得することもできます。どうすればいいの?

最後に、新しいクラスを定義するのが適切なプログラミング方法はいつですか? アプリケーションごと (メイン フレーム用)、フレームごと、定義したコントロールごとに 1 つ (たとえば、独自のプログレス バー クラスを作成する場合)?

私は Java/Swing、C#/Windows.Form、C/GTK+、および C++/wxWidgets を知っているので、これらのツールキットとの比較はおそらく理解できるでしょう。

4

2 に答える 2

6

ウィンドウ クラスは、そのクラスのすべてのインスタンスに使用されるプロパティを記述します。色、アイコンなどと同様に、これらのプロパティの 1 つがウィンドウ プロシージャです。これは、システムからのすべてのメッセージを処理し、必要に応じて処理するコールバック関数です。

関係はありませんが、概念は C++ クラスに類似しています。1 つのコードでクラスのデータと機能が定義され、そのクラスのインスタンスが多数存在する場合があります。

非常に大まかな例として、「BUTTON」クラスの WndProc は、WM_LBUTTONDOWN/WM_LBUTTONUPシーケンスを「クリック」として変換します。このシーケンス中に、WndProc は、WM_PAINTメッセージへの応答としてボタンを "押された" 状態で描画します。

ウィンドウがアクション (クリックなど) を親に伝える必要がある場合、ウィンドウはメッセージを「通知」または「コマンド」として送信します。これらのメッセージは、子コントロールによって手動で作成され、識別子と関連データが含まれています。

ボタン クラスのウィンドウを (CreateWindow を使用して) 作成するだけで、これらすべての利点が得られます。この動作はすべて自動的に取得されます。

ウィンドウによって提供されるものと同様に、アプリ全体で再利用できる独自のウィンドウを作成することもできます。メイン ウィンドウ用に少なくとも 1 つのクラスを登録する必要があります (そうしないと機能がなくなるため、あまり面白くありません)。それ以上はユーザー次第です。

通常のコントロール (ボタン、リストビュー、進行状況バー) のみを含むアプリケーションを作成することは十分に可能ですが、カスタム クラスを作成したい場合もあります。これは、特定の動作をカプセル化するため、またはプログラムを通じてそのコントロールの多くのインスタンスを使用したい場合のいずれかです。

たとえば、アプリケーションの UI にキリンの画像が必要な場合は、マウスがその上にあるときにスピンするようにコードを記述し、それを WindowProcedure に記述して、それを新しいクラス ("SPINNYGIRAFFE") として登録できます。私のアプリケーションの残りの部分は、「SPINNYGIRAFFE」クラスのウィンドウを作成するだけで、すべてが機能します。

于 2009-03-11T19:01:05.023 に答える
1

どうすればいいの?

子コントロール (これらもウィンドウです) は親ウィンドウにメッセージを送信します。

新しいクラスを定義するのが適切なプログラミング方法はいつですか?

すべてのウィンドウにはクラスが必要です。そのため、ウィンドウに既存のクラスが存在しない場合は、新しいクラスを定義する必要があります。Windows のダイアログ ボックス API は別のビルトイン クラスを使用するため、すべての独自のトップ レベル ウィンドウに対してクラスを定義する必要がありますが、コントロール (これらの組み込みクラス) またはダイアログに対しては定義しません。

于 2009-03-11T19:09:14.817 に答える