2013-03-23 26 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做子类