0

WINAPIを使用してライブラリを作成しています。親ウィンドウのWinProc関数のWC_TABCONTROLクラスウィンドウからWM_NOTIFYメッセージを受信する際に問題が発生しました。「debugprints」で子の親が正しく設定されていることを確認します。WM_COMMANDメッセージを受信し、一部の関数で正しく受信します。何が原因なのかわかりません。ウィンドウのタブコントロールは見栄えがよく、マウスクリックに応答して視覚的なタブアイテムの選択を変更します。

たとえば、選択されていないタブをクリックすると、次のメッセージが表示されますhttp://pastie.org/6571509

私のWINProc関数は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 に答える