2

私の質問は、Win32 API を扱うのに時間を費やした人にとっては比較的簡単だと思います。

私の質問は:
WNDCLASSEX インスタンスを初期化した後、「RegisterClassEx」関数を使用してそれを「登録」する必要があるのはなぜですか? なぜそうするのですか?この登録の意味と、どのような場合に登録する必要がありますか?

4

2 に答える 2

6

ATOMによって返されるは、他のRegisterClassExWindows API で参照できる「ウィンドウ クラス」を一意に識別します。[ MSDN ]

事実上、ウィンドウが作成または検索されるたびに処理されるデータ量を削減するためのハッシュです。また、同じ機能を持つ複数のウィンドウを簡単に作成して識別できることも意味します。

私は上記の実際的な理由に取り組んでいました。Hans Passant の答えは、これが C に提供される OO クラスの概念であることを正しく説明しています

于 2012-08-04T12:54:16.903 に答える
5

関数名のクラスという単語は重要です。C++、Delphi、Java、C# などのオブジェクト指向言語でコードを記述する場合、classキーワードを使用して、動作を持つオブジェクトを作成します。しかし、winapi は、そのような機能を持たない言語である C から使用するように設計されています。RegisterClassEx() 関数はそのエミュレーションであり、名前付きクラスからその動作を「派生」させるウィンドウを作成できます。この動作はオーバーライドできます。そのクラス名を使用して作成したすべてのウィンドウは、同じように動作します。

渡す WNDCLASSEX 構造体は、ウィンドウに既定の動作を与えます。この構造体の最も重要なメンバーは次のとおりです。

  • lpszクラス名。これは、C++ クラス名に相当します。後で CreateWindowEx() を呼び出し、その名前を渡して、特定の方法で動作するウィンドウを取得できます。Windows 自体が RegisterClassEx() を呼び出して、独自のコードで簡単に再利用できるいくつかの組み込みウィンドウ クラスを登録します。「EDIT」、「BUTTON」、「LISTBOX」がその良い例です。
  • lpfnWndProc. これは、ウィンドウ クラスに特定の既定の動作を与えるものです。特定のメッセージのメッセージ ハンドラーを実装するウィンドウ プロシージャのアドレス。CreateWindowEx() 呼び出しで別のウィンドウ プロシージャを指定することにより、既定の動作をさらにカスタマイズできます。つまり、基本クラスから独自のクラスを "派生" させることができます。このようなウィンドウ プロシージャは、常に DefWindowProc() を呼び出す必要があります。これは、基本クラス メソッドを呼び出すのと同じです。つまり、ウィンドウには1 つの仮想メソッドがあります。
  • hアイコンなど。これらは基本クラスのプロパティに相当し、既定のメッセージ ハンドラーに影響する既定値を設定します。ウィンドウ プロシージャをシンプルに保つのに役立ちます。たとえば、WM_ERASEBKGND のメッセージ ハンドラーを記述する必要はほとんどありません。hbrBackground メンバーは、ウィンドウの既定の背景を設定します。

Windows では、ウィンドウを再利用する予定がない場合でも、RegisterClassEx() を呼び出す必要があります。これは、独自のコードでの関数の最も一般的な使用法です。他のコードが使用できるコントロールやウィンドウを実装するライブラリを作成するまで、それを実際に利用し始めることはありません。「編集」のように。

于 2012-08-04T15:35:53.720 に答える