2011-11-07 72 views
1

我來自C#,非常新,所以請耐心等待。在CreateWindow上設置HWND似乎失敗

我有一個MainWindow類,它有一些私人的HWND變量。一個用於窗口本身,另一個用於每個控件。我想我需要跟蹤他們,或者以後會讓事情變得更輕鬆?

不管怎麼說,我有:

class GUIMain 
{ 
private: 
    HINSTANCE hInstance; 
    HWND hWnd; // The windows itself 
    HWND cmdGenerate, cmdQuit; // 2 buttons 

我有叫initialise(HWND hWnd)私有方法被稱爲上WM_CREATE,並將其添加的所有控件的窗口:

void MainWindow::initialise(HWND hWnd) 
{ 
    this->hWnd = hWnd; 

    cmdGenerate = CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."), 
          WS_VISIBLE | WS_CHILD, 
          6, 6, 150, 25,   
          hWnd, (HMENU)1, 0, 0); 

    cmdQuit  = CreateWindow(TEXT("BUTTON"), TEXT("&Quit"), 
          WS_VISIBLE | WS_CHILD, 
          6, 37, 150, 25,   
          hWnd, (HMENU)2, 0, 0); 
} 

然而,這似乎並沒有把按鈕放在窗口上。事實上,當我調試時,我可以看到它甚至沒有超過第一行。奇怪的是,當我改變它:

void MainWindow::initialise(HWND hWnd) 
{ 
    //this->hWnd = hWnd; 

    /*cmdGenerate = */CreateWindow(TEXT("BUTTON"), TEXT("&Generate..."), 
           WS_VISIBLE | WS_CHILD, 
           6, 6, 150, 25,   
           hWnd, (HMENU)1, 0, 0); 

    /*cmdQuit  = */CreateWindow(TEXT("BUTTON"), TEXT("&Quit"), 
           WS_VISIBLE | WS_CHILD, 
           6, 37, 150, 25,   
           hWnd, (HMENU)2, 0, 0); 
} 

它似乎工作正常。

邏輯似乎暗示分配私人HWND變量CreateWindow函數返回的值導致問題,但我以前做過,並沒有問題?

我以前的代碼和這段代碼唯一的區別是,我現在正在使用類,而之前(當我正在學習時),我只是有一切在WinMainWndProc

的WinMain:http://pastebin.com/j54vW9gc
頭文件:http://pastebin.com/cUs4vVJ6
CPP文件:http://pastebin.com/B5KUXTvx

+0

似乎如果一個人應該工作,另一個應該。你能告訴我們你的WndProc嗎?你說初始化(sp)是私有的,並從WM_CREATE調用。 wndproc是一個靜態成員函數嗎?對象在哪裏被創建? –

+0

我附上了完整源代碼的鏈接。 – Ozzah

+0

聽起來像你的'this'指針是不正確的。 –

回答

5

歡迎的Win32的世界,這不是專爲C++。這是一個很好的嘗試。在我說過不值得花更多時間之前,我試圖建立一個通用框架幾百次。

您的WinMain()也會有幫助,但是我看到的一個大問題是您致電CreateWindowEx()。你發送的最後一個參數是0.比以後檢索它時SetWindowLong(hWnd, GWL_USERDATA, (long) ((LPCREATESTRUCT)lParam)->lpCreateParams);你說它是一個指向類的指針。您的意思是有:

  hWnd = CreateWindowEx(0, TEXT("AS2MainWindow"), 
               TEXT("AS2"), 
               WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
               CW_USEDEFAULT, CW_USEDEFAULT, 
               824, 350, 
               0, 0, 
               hInstance, this); 

尋找其他問題。看看是否有幫助。如果沒有你,也許你張貼的main()

補充: CreateWindowEx

HWND WINAPI CreateWindowEx(
    __in  DWORD dwExStyle, 
    __in_opt LPCTSTR lpClassName, 
    __in_opt LPCTSTR lpWindowName, 
    __in  DWORD dwStyle, 
    __in  int x, 
    __in  int y, 
    __in  int nWidth, 
    __in  int nHeight, 
    __in_opt HWND hWndParent, 
    __in_opt HMENU hMenu, 
    __in_opt HINSTANCE hInstance, 
    __in_opt LPVOID lpParam 
); 

最後一個參數lpParam是可選的。所以,當它設置爲0時,它不會傷害任何東西。但這是你如何「發送」給你的WM_NCCREATEWM_CREATE。它可以是任何LPVOID。在C中,你可以發送一個指向結構或任何你想要的指針。在這種情況下,你想發送一個指向你的窗口對象的指針。

要WM_NCCREATE得到這個參數或者WM_CREATE您使用下面的代碼:

(long) ((LPCREATESTRUCT)lParam)->lpCreateParams); 

這是說投lParampointerCREATESTRUCT。從它得到lpCreateParams。並將其轉換爲long。這與我寫這篇難以理解的代碼片段略有不同。如果你把它分成幾個步驟看起來更容易。讓我知道你是否需要進一步的解釋。

只要你在下面看到完整的圖片就是CreateStruct的定義。它不僅僅是lpCreateParams。 (你選擇成爲你的班級的指針)。

typedef struct tagCREATESTRUCT { 
    LPVOID lpCreateParams; 
    HINSTANCE hInstance; 
    HMENU  hMenu; 
    HWND  hwndParent; 
    int  cy; 
    int  cx; 
    int  y; 
    int  x; 
    LONG  style; 
    LPCTSTR lpszName; 
    LPCTSTR lpszClass; 
    DWORD  dwExStyle; 
} CREATESTRUCT, *LPCREATESTRUCT; 

瞭解了這一切之後。檢查ATL thunking。它的方式去如果你想要所有的代碼裏面的類。我發現當它不需要時,可以遠離每一段代碼。取決於我寫的程序。

+0

這似乎解決它爲什麼我需要傳遞一個'this'在CreateWindowEx即使我設置與'指針調用SetWindowLong ?'是什麼這兩個指針之間的差異 – Ozzah

+0

加入到回答,因爲相當長的交代 –

+0

沒關係,我理解了它,這是因爲,當我去'((LPCREATESTRUCT)lParam的)! - > lpCreateParams'有來自某處,那是從'​​this'指針給我'CreateWindowEx',對吧?:) – Ozzah