5

私はこの抽象コードを持っています:CreateWindowEx()でlParam(最後のパラメータ)を使用して、メインの先頭で宣言されたクラスへのポインタを保存したい-SaveArr。次に、関数 WndProc で使用したいと思います。最初はグローバル配列を作成しましたが、どこでも使用できましたが、C ++に関する限り「賢く」はないため、少しアップグレードしようとしています。

class Samples
{
        int arr[ITERATIONS+1];
        int index;
        ...
}

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
        Samples * SaveArr;
        ...
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                          ClsName,
                          WindowCaption,
                          WS_OVERLAPPEDWINDOW,
                          INITIAL_WIN_LOCAT_X,
                          INITIAL_WIN_LOCAT_Y,
                          WIN_WIDTH,
                          WIN_HIGHT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);    //here i want to pass SaveArr, so that i can use it in the WndProc(...) function

...
return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
   ...      //here i would like to use lParam as the class pointer, meaning using the 
              SaveArr declared in the main function.

}

}
4

5 に答える 5

2

最善の方法は

    LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
           Samples *savearr = (Samples*)GetWindowLong(hWnd,GWL_USERDATA)
           switch(Msg)
           {
                case WM_CREATE:
                    SetWindowLong(hWnd, GWL_USERDATA, (LONG)lParam);
                    break;
           }
    }

次に WndProc が呼び出されると、値は savearr に格納され、使用できるようになります。

于 2011-09-12T08:10:07.617 に答える
1

参考から:

lpParam [in、オプション]

Type: LPVOID

Pointer to a value to be passed to the window through the

WM_CREATEメッセージのlParamパラメーターが指すCREATESTRUCT構造体(lpCreateParamsメンバー)。このメッセージは、戻る前にこの関数によって作成されたウィンドウに送信されます。

If an application calls CreateWindow to create a MDI client

ウィンドウの場合、lpParamはCLIENTCREATESTRUCT構造体を指している必要があります。MDIクライアントウィンドウがCreateWindowを呼び出してMDI子ウィンドウを作成する場合、lpParamはMDICREATESTRUCT構造体を指す必要があります。追加のデータが必要ない場合、lpParamはNULLになる可能性があります。

lParamは常にWndProcに渡されることを期待していますが、これはWM_CREATEでのみ渡されます。

それでも、直接渡されるのではなく、WM_CREATEの実際のlParamである構造体を介して渡されることに注意してください。

于 2011-09-12T08:00:42.357 に答える
0

最後の lpParam 値を X に設定し、それを WM_CREATE でキャッチし (間接的な構造体のすべてを介して)、GWL_USERDATA を設定することに固執するのはなぜですか?!

HWND H=CreateWindow(.....) SetWindowLong(H,GWL_USERDATA,X) つまり、ウィンドウ作成ステートメントの直後に、X を自分で直接配置するだけです。

私のテストでは動作し、既知のハンドルのリストに対してウィンドウ ハンドルをテストする限り、プログラムが誤ったメッセージを取得するのを防ぎ、他のユーザー データの不適切な使用を防ぐことができます。

于 2014-08-06T05:01:10.137 に答える
0

lParam を読み取る唯一の機会は、WM_CREATE の間です。後で値を使い続けたい場合は、どこかに保存する必要があります。おそらくWndProcの静的として、またはスコープされる他の何かに割り当てます。

于 2011-09-12T08:08:40.340 に答える