6

API を使用して Windows GUI を開発する場合、なぜウィンドウ クラスを登録する必要があるのでしょうか。そのコンセプトは何ですか?

Charles Petzold によるProgramming Windowsの最初の 3 つの章を既に読みましたが、クラスを明示的に登録する目的は何なのか、まだ疑問に思っています。なぜ明示的にやりたいのですか?たとえば、CreateWindow() (または CreateWindowEx()) 関数でバックグラウンドで実行されないのはなぜですか? つまり、RegisterClass() が実行するコードが CreateWindow() 内で実行されないのはなぜですか? または、CreateWindow() が RegisterClass() 自体を呼び出さないのはなぜですか?

また、MSDN のドキュメントを読んでいて、RegisterClass() 関数が WNDCLASS 構造体を埋めることによって、ウィンドウ プロシージャをウィンドウ クラスに関連付けることを知っています。これが OS からのメッセージを処理する関数であることは知っていますが、なぜその関数 (WinProc の関数) を CreateWindow() とは別の関数内のクラスに登録する必要があるのでしょうか?

CreateWindow() 関数が存在する理由と、作成されたウィンドウが自動的に表示されない理由を理解できます。これは、ShowWindow() 関数の目的も理解していることを意味します。

プログラマーが必要なときにクラスを登録できるようにするために、この動作には正当な理由があるに違いないと確信していますが、私はそれらの理由を見落としているだけです。

私は Windows API を使用した GUI 開発に非常に慣れていないことを覚えておいてください。Windows API とは異なる MATLAB でいくつかの GUI を作成しましたが、Windows の哲学、特にコールバック関数の目的を理解することができました。この情報が役立つかどうかはわかりませんが、類推する必要がある場合は、私のゲストになってください.

4

4 に答える 4

11

質問に C++ のタグを付けたので、C++ のアナロジーを示します...

RegisterClass#include基本的に、クラスを定義し、それをプログラムに含めます ( C++の a によく似ています)。はWNDPROC、インスタンスが作成された場合にウィンドウ内で発生するすべてのハンドラーです。

CreateWindownew概念的には、C++ でa を実行するのと同じです。Windows に新しいウィンドウを作成するように要求しており、ウィンドウの種類を指定する必要があります。Windows には、Button や Edit などの事前定義された一連のウィンドウが含まれていますが、独自のウィンドウのインスタンスを作成する場合は、作成する "クラス" を指定するだけで問題ありません。を呼び出してこのクラスを既に登録しているRegisterClassため、Windows は定義に直接移動し、ウィンドウのインスタンスを作成できます。

于 2014-07-02T14:53:31.360 に答える
0

別の考え方としては、Windows はクローズド ソースであるため、API の作成者はユーザーに API の内部をあまり知られたくないと考えています。そこで、彼らは次のように考えています。そのため、WNDCLASS は、ユーザーが必要なクラスの情報を宣言するために作成され、名前などの値をメンバー フィールドにプロシージャとして割り当てます。フォームに入力するようなものです。したがって、API ライターは次の 2 つのことを達成することがわかります。

(1) ユーザーは API クラスをカスタムに明示的に拡張しないため、API について何も知りません。そうする場合、API ライターはクラスのヘッダーを提供する必要があり、ユーザーは Windows を作成することで混乱する可能性があります。はもう閉鎖されていません。

(2) ユーザーは独自のウィンドウ クラスを定義できます。

独自のウィンドウ クラスを定義し、それを使用したい場合は、クラスを登録する必要があります。これにより、Windows OS がそのクラスを認識し、さらに必要な場合に備えて、そのクラスに関する情報を維持できるようになります。そのインスタンスを作成します。

于 2017-05-10T03:37:03.283 に答える