WNDPROCウィンドウのコールバックプロシージャで受け取ったハンドルとCreateWindowから返されたハンドルの違いは?

したがって、 CreateWindow/CreateWindowEx を使用してウィンドウを作成するときに返されるハンドルと、 WNDPROC ウィンドウのコールバックにパラメータとして渡されるハンドルの間に違いがあるかどうかは疑問でした関連ウィンドウの手順。この質問のコンテキストは、ウィンドウのハンドルを必要とする特定のAPI関数を使用する必要があるため、ウィンドウコールバックプロシージャで受け取ったハンドルを渡す代わりに、CreateWindowによって返されたハンドルのコピーを保存できる両方のハンドルが同じ場合は、連続操作に使用します。

よろしく、

Devjeet

0
それは私がしたくないというわけではありません。それを通過せずに何かができるならば、それは良いでしょう。私が使用する関数は1つの目的のためだけに作られており、1つのウィンドウプロシージャだけがそれを使うつもりです。だから、いつも通り過ぎることなく、一度にハンドルを保存するほうが簡単だと思っていました。
追加された 著者 devjeetroy,
なぜそれらを比較しないのですか?また、ウィンドウコールバックプロシージャで受け取ったものを使用したいのですが?
追加された 著者 Seth Carnegie,

2 答え

ここで注意してください。ウィンドウプロシージャは、複数のウィンドウインスタンスで使用されます。コールバックはWNDCLASSEX.lpfnWndProcの値によって決定され、同じウィンドウクラス名を使用するCreateWindow/Ex()呼び出しはすべて同じコールバックを使用します。コールバックをクラスインスタンスメソッドにマップする場合は、まずコールバックの hwnd 引数をクラスインスタンスにマップするサンクを実行する必要があります。もちろん、WM_CREATEの特別なケースを作る。

2
追加された

はい、彼らは同じです、それはHWNDを持っている全体のポイントです。すべてのウィンドウには、システム内でそれを識別する HWND が1つしかなく、 DestroyWindow が呼び出されるまで有効です。 CreateWindow(EX)によって返され、同じクラスの複数のウィンドウを作成した場合でも、すべてのメッセージと共に送信されます。

しかし、いくつかのメッセージは CreateFunction が返る前にウィンドウプロシージャに送られるので、グローバル変数を使用して HWND を保持している場合、

HWND globalHwnd = NULL;

int main()
{
    //...
    globalHwnd = CreateWindow(...);
}

LRESULT WndProc(HWND hWnd, ...)
{
    assert(hWnd == globalHwnd); //fail!
}

CreateWindow が戻る前に WM_CREATE のようないくつかのメッセージが送信され、グローバル変数がまだ割り当てられていないため、アサーションが失敗します。

2
追加された
ありがとう! Btw、私はそれをクラスのメンバーとして使用します。
追加された 著者 devjeetroy,