簡體   English   中英

Win32:將lParam傳遞給CreateWindow並跟蹤打開的窗口

[英]Win32: Passing lParam to CreateWindow and keeping track of open windows

首先,這是我給的文檔的描述。 注意:我要做的就是更改現有代碼以滿足這些要求

更改代碼以創建4個窗口,如演示中所示。 當用戶關閉一個窗口時,如果還有其他窗口仍在打開,則不會終止該程序。 用戶必須關閉所有程序才能停止程序,

您將需要跟蹤打開的窗口數(並在關閉窗口時減去)。 不允許全球。 暫無統計信息。

另外,您的程序必須使用lParam和CREATESTRUCT初始化計數。

Possible functions and structs:

SetWindowLong()
GetWindowLong()
SetClassLong()
GetClassLong()
CREATESTRUCT

好了,這就是我的結局。 我可以打開4個必需的窗口,然后關閉一個窗口(發送WM_DESTROY消息)並沒有結束整個程序。 我感到困惑的是lParam的通過並使用了CREATESTRUCT。

這是我的wndproc.c:

 LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
    HDC     hdc;
    PAINTSTRUCT ps;
    RECT    rect;
    int number = GetClassLongPtr(hwnd, 0);

    switch (message){
        case WM_CREATE:
            if(number == 0){
                SetClassLongPtr(hwnd, 0, (LONG)((CREATESTRUCT*)lParam)->lpCreateParams);
            }
            number++;
            return 0;

        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);

            GetClientRect(hwnd, &rect);
            DrawText(hdc, TEXT("Unique yet the same!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            EndPaint(hwnd, &ps);
            return 0;

        case WM_DESTROY:
            number--;
            if(number == 0){
                PostQuitMessage(0);
            }
            return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);

我正在嘗試獲取該變量,並將其作為創建的第一個窗口的lParam傳遞給它,並將其設置為Class Extra。 那有意義嗎? 這是我的main.c:

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCMLine,int iCmdShow){靜態TCHAR szAppName [] = TEXT(“ HelloApplication”); HWND hwnd; 味精味精; WNDCLASS wndclass; 長*計數;

wndclass.style      = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = HelloWndProc;
wndclass.cbClsExtra = 5;
wndclass.cbWndExtra = 0;
wndclass.hInstance  = hInstance;
wndclass.hIcon      = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor    = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;


if (!RegisterClass (&wndclass)){
    MessageBox (NULL, TEXT ("This program requires Windows 95/98/NT"),
                szAppName, MB_ICONERROR);
    return 0;
}

hwnd = CreateWindow(szAppName,      
                    TEXT("Hello World for Windows"), 
                    WS_OVERLAPPEDWINDOW,    
                    100,        
                    50,     
                    400,        
                    300,        
                    NULL,               
                    NULL,           
                    hInstance,          
                    count = 0);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

任何幫助,將不勝感激; 我已經在課堂上被問到了這個信息,卻聽不懂。 我發布此問題僅出於我自己的理解。

謝謝。

由於您必須計算同一窗口類的窗口(實例)數,因此所需的計數器可以視為窗口類的靜態數據成員。

因此,目標是向窗口類添加一些額外的數據(此處為整數計數器)。 為此,需要告訴Windows分配這些額外的數據。 這可以通過將正確的值傳遞給RegisterClass()來實現。 對於所需的計數器,將WNDCLASS類型的結構的成員cbClsExtra設置為整數計數器的大小,該結構的引用將傳遞給RegisterClass()

要在消息分派器的回調方法中訪問Windows類的靜態數據(以及整數計數器),請使用GetClassLongPtr()

因為我認為這是家庭作業,所以我將游戲的其余部分作為練習... ;-)

SetClassLongPtr此函數對與窗口的類關聯的內存進行操作。 這本質上是一個靜態變量。 實際上,您具有打開的窗口的簡單靜態計數器。 它只是隱藏在煙幕下。

從技術上講,從C / C ++的角度來看,您的計數器不是static/global variable 但是從概念的角度來看-是的。

lParam和CREATESTRUCT在這里不是重要的細節。

錯了,眼鏡他們什么也沒做!

  • 您不能將自動變量傳遞給CreateWindowEx ,並且期望該變量的地址 (而不是您實際傳遞的值)通過
  • 您不能為自動變量分配一個值( int number = GetClassLongPtr(hwnd,0); ),對該變量進行更改,並期望它們是持久的。

簡而言之:

  • 將指針傳遞給CreateWindowEx ,而不是值
  • 當您要更改其中存儲的值時,請取消引用該指針

您可能需要刷新有關指針的知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM