WM_NOTIFY未发布到wndProc函数(子项的父项是正确的,WM_COMMAND工作得非常好)

时间:2013-03-16 10:17:51

标签: winapi tabs

我正在使用WIN API编写一些库。我在父窗口WinProc函数中从WC_TABCONTROL类窗口接收WM_NOTIFY消息时遇到问题。 我检查“调试打印”,正确设置了孩子的父。我在某些功能中正确接收WM_COMMAND消息。 我不知道这可能是什么原因。窗口中的选项卡控件看起来很好,并且通过可视选项卡项目选择更改来响应鼠标单击。

例如,当我点击取消选中的标签时,我收到以下消息http://pastie.org/6571509

您可以在此处查看我的WIN Proc功能http://goo.gl/knJ4Z,第346行。

创建标签控件:

ps_ext->d_handle = CreateWindowExW(0,                      // no extended styles           
                                       WC_TABCONTROL,          // class name                   
                                       L"",               // default text                  
                                       WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,  // overlapped window            
                                       CW_USEDEFAULT,          // default horizontal position  
                                       CW_USEDEFAULT,          // default vertical position    
                                       CW_USEDEFAULT,          // default width                
                                       CW_USEDEFAULT,          // default height               
                                       HWND_MESSAGE,            // no parent or owner window    
                                       (HMENU)WINSEM_Window_NextComponentID(),           // class menu used              
                                       WINSEM_Window_hInstance,// instance handle              
                                       (LPVOID)&ps_ext->s_window);          // no window creation data      

之后,通过SetParent函数调用设置正确的父级。 Tab的大小调整为:

  uFlags = SWP_NOOWNERZORDER | SWP_NOZORDER;

  if (SetWindowPos(ps_window->d_handle, NULL, s0_x, s0_y, s0_w, s0_h, uFlags)==0)
  {
    DWORD dErr;

    dErr = GetLastError();

    HaveWinLastError_Error(ps_pack, WINSEM_WINDOW_fromerror_windowPos+0, dErr, dErr);        
    break;
  }

显示窗口并单击选项卡控件不会生成父窗口winProc函数收到的WM_NOTIFY消息。

这是我的消息接收代码:

   bRet = PeekMessage( &msg, NULL, 0, 0, PM_REMOVE);

  if (bRet==FALSE)
  {
    // no messages received
  }
  else
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
  }

有人对这个问题有任何想法吗?谢谢你的想法和时间。

1 个答案:

答案 0 :(得分:3)

我怀疑选项卡控件在创建时会缓存其父窗口,并且永远不会更新它。如果您重新使用它,则消息仍将转到原始父级 - 在这种情况下,这是一个无效窗口。

为什么要将HWND_MESSAGE作为父母创建呢?为什么不用正确的父母来创建呢?