0

我正在使用 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 函数调用设置正确的父级。选项卡通过以下方式调整大小:

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

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

4

1 回答 1

3

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

无论如何,您为什么要HWND_MESSAGE以父母的身份创建它?为什么不先用它的正确父级创建它呢?

于 2013-03-16T12:29:44.983 回答