2013-03-23 54 views
0

我有一個編輯控件,我試着子類,當我這樣做整個窗口爲空:窗口爲空時,子類在C++編輯控制WINAPI

// Global variables 
HINSTANCE hInst; 
WNDPROC oldEditWndProc; 
INT_PTR CALLBACK EditWndProc(HWND, UINT, WPARAM, LPARAM); 

// Messages handler of the parent window 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    HDC hDC; 
    HWND myedit; 

    switch (message) 
    { 
    case WM_CREATE: 
     // Create the EDIT control 
     myedit= CreateWindowEx(
           WS_EX_CLIENTEDGE|WS_EX_CONTROLPARENT, 
           L"EDIT", 
           L"", 
           WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_LEFT, 
           20, 120, 
           160, 20, 
           hWnd, 
           NULL, 
           hInst, 
           NULL 
          ); 
     oldEditWndProc = (WNDPROC)GetWindowLongPtr (myedit, GWLP_WNDPROC); 
     // This is the line where problems begin 
     SetWindowLongPtr (myedit, GWLP_WNDPROC, (LONG_PTR)EditWndProc); 
     break; 
    case WM_PAINT: 
     hDC = BeginPaint(hWnd, &ps); 
     EndPaint(hWnd, &ps); 
     break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

// EDIT control own handler 
INT_PTR CALLBACK EditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
     case WM_GETDLGCODE: 
      return DLGC_WANTTAB; 
      break; 
    } 
    return (INT_PTR)FALSE; 
} 

我只是想不通爲什麼在撥打電話時整個窗口是空的SetWindowLongPtr

+2

它隨着時間的,因爲我已經做過這方面的東西,所以我會離開的人更多專家全面回答。但基本上你已經替換了一個窗口過程,它做了一些事情,窗口過程幾乎沒有任何作用。如果你想專門處理'WM_GETDLGCODE'消息,那麼你應該確保所有其他消息都像以前一樣處理。 – john 2013-03-23 21:05:52

回答

3

「空」你的意思是它不顯示在屏幕上?

如果是的話,這是因爲當你創建一個窗口的子類時,它所有的消息都會被髮送到新的MessageProc,它沒有所有的函數在它的defaultProc函數中正確顯示它(例如WM_PAINT,甚至是按鈕點擊)。

所以,你需要的東西是這樣的:

//store the old window proc somewhere 
WNDPROC oldWindowProc = (WNDPROC)SetWindowLong(subWindowHandle, GWL_WNDPROC, long(NewMessageProc)); 

//and in the message proc 
switch(uMsg) 
{ 
    //your "case"s here 
    default: 
    { 
     CallWindowProc(oldWindowProc, windowHandle, uMsg, wParam, lParam); 
    } 
} 

這將調用適當的WM_PAINT等消息,負責繪製和點擊等功能(子類的窗口DefWindowProc函數())的messageProc 。

或者你也可以實現你的NewMessageProc爲所有子類窗口的WM_PAINT,但沒有把他們的DefWindowProc函數,你需要爲做好每情況下,它們可能會收到(鼠標移動,鼠標點擊,點擊按鈕,一切),所以使用他們原來的DefWindowProc更容易。

1

在你的編輯窗口過程中,你需要調用一些適當的默認消息處理。

等原始窗口過程。

要做到這一點,在你的代碼的抽象級別的最簡單的方法,就是改用SetWindowSubclass做子類