2012-09-18 41 views
0

首先,這裏是我給出的文檔的描述。 注意:我所要做的只是更改現有代碼以滿足這些要求Win32:將lParam傳遞給CreateWindow並跟蹤打開的窗口

更改代碼以創建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參數被設置爲額外的類。那有意義嗎?這是我的main.c:

INT WINAPI的WinMain(HINSTANCE的hInstance,HINSTANCE hPrevInstance, PSTR szCMLine,INT iCmdShow){ 靜態TCHAR szAppName [] = TEXT( 「HelloApplication」); HWND hwnd; 味精味精; WNDCLASS wndclass; LONG * count;

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); 

任何幫助,將不勝感激;我已經在我的課堂上對這個信息進行了測驗,並且不理解它。我只是爲了自己的理解發布這個問題。

謝謝。

+0

正常的方式做,這是'PostQuitMessage()'當他們中的一個關閉,這將關閉其餘的部分。 – Deanna

+0

測驗的要點是僅在最終窗口關閉時才發送PostQuitMessage()。 – CallumStyan

回答

1

由於您必須計算相同窗口類的窗口(實例)的數量,因此需要的計數器可以看作窗口類的數據成員靜態

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

訪問Windows類的靜態數據(和與它整數計數器)在消息調度員的回調方法使用GetClassLongPtr()

正如我想這是我的功課離開遊戲作爲一個練習的休息... ;-)

+0

這來自我的Win32課堂測驗,只是爲了我自己的知識。謝謝(你的)信息! – CallumStyan

+0

這幾天他們稱考試成爲一個問題......?>> >> user1440612 – alk

+0

不確定你的意思,這對於測驗來說太難了嗎?考慮到我們班只有兩個人按照老師的要求工作,我想這是可以肯定的。 – CallumStyan

1

SetClassLongPtr - 此函數在與窗口類關聯的內存上運行。這本質上是一個靜態變量。事實上,你有簡單的打開窗口的靜態計數器。它只是隱藏在煙幕下。

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

lParam和CREATESTRUCT在這裏是非重要的細節。

+0

那麼,我在做什麼沒有工作?我使用類長ptr作爲變量保持打開窗口的軌跡。 – CallumStyan

+0

清理你的代碼(刪除所有不需要的東西),正確地分配你的Windows類數據,增加/減去你的變量等等。它會工作。 –

1

錯了,他們的眼鏡什麼都不做!

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

簡而言之:

  • 將指針傳遞CreateWindowEx,不是值
  • 取消引用該指針,當你想存儲在其中的價值變動

您可能需要刷新您在pointers上的知識。

+0

是的,我很可能!謝謝(你的)信息。 – CallumStyan

相關問題