按钮控件在单击时消失 - 单击处理程序不会在单击按钮 - Win32上被触发

时间:2017-07-29 15:04:14

标签: c++ winapi sdk win32gui

我正在开发基于win32 gui的Zoom SDK。

我在窗口句柄上使用CreateWindow方法创建了3个按钮,由ZoomSDK提供。

代码+截图 - 1

现在有两个问题。

  1. 一旦点击按钮,它们就会消失。
  2. 请参阅屏幕截图 enter image description here

    请参阅屏幕截图 enter image description here

    我想知道发生这种情况的原因以及如何解决这个问题?

            HWND hFirstView, hSecondView;
    
    
            cntrl->GetMeetingUIWnd(hFirstView, hSecondView);
            cntrl->MoveFloatVideoWnd(100, 100);
    
            HWND btnHwnd = CreateWindow(
                TEXT("button"),
                L"Open App",
                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                0, 0,
                50, 25,
                hFirstView,
                (HMENU)100,
                hInst,
                NULL);
    
            HWND btnHwnd2 = CreateWindow(
                TEXT("button"),
                L"Other",
                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                50, 0,
                50, 25,
                hFirstView,
                (HMENU)101,
                hInst,
                NULL);
    
            HWND btnHwnd3 = CreateWindow(
                TEXT("button"),
                L"Raise Hand",
                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                100, 0,
                50, 25,
                hFirstView,
                (HMENU)103,
                hInst,
                NULL);
    
            HDC hdc = GetDC(btnHwnd);
            SetBkColor(hdc, GetSysColor(COLOR_BTNSHADOW));
            SetTextColor(hdc, GetSysColor(COLOR_BACKGROUND));
            ReleaseDC(btnHwnd, hdc);
            int btnId = GetDlgCtrlID(btnHwnd);
    
    
    
            //oldWndProc = (WNDPROC) GetWindowLong(hFirstView, GWL_WNDPROC);
            oldWndProc = (WNDPROC) SetWindowLong(hFirstView,
                GWL_WNDPROC, (LONG)WndProc);
    
            SendMessage(btnHwnd, BM_SETSTATE, 1, 0);
            SetWindowText(hFirstView, L"Title");
    
    1. 我想处理这些按钮的点击事件。我试图使用SetWindowsLong来设置另一个WndProc

          LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
          {
              int id = GetWindowLong(hWnd, GWL_ID);
      
              switch (message)
              {
              case WM_COMMAND: {
                  MessageBox(NULL, L"Sign of releaf!", L"Whoaa!", 0);
                  if (wParam == 1023) {
                      MessageBox(NULL, L"Sign of releaf!", L"Whoaa!", 0);
                  }
              }
              break;
              }
              return CallWindowProc(oldWndProc, hWnd, message, wParam, lParam);
          }
      
    2. 现在,这个WndProc被调用其他事件,如鼠标移动等。它不能用于我的三个按钮。我想处理点击事件,即WM_COMMAND或任何其他可能的技术。

      因为我不能进入sdk(他们不提供源,只有.lib)所以我不能改变他们的WndProc,也不能改变他们的内部WM_PAINT。按钮有点叠加在上面。

1 个答案:

答案 0 :(得分:0)

您不应该从SetBkColor()处理程序外部调用SetTextColor()WM_PAINT。为按钮着色的正确方法是:

  1. 让父窗口处理WM_CTLCOLORBTN通知。

      

    在绘制按钮之前,WM_CTLCOLORBTN消息将发送到按钮的父窗口。父窗口可以更改按钮的文本和背景颜色。

  2. 为按钮指定BS_OWNERDRAW样式,然后让父窗口处理WM_DRAWITEM通知。

      

    当按钮,组合框,列表框或菜单的可视方面发生更改时,发送到所有者绘制按钮,组合框,列表框或菜单的父窗口。

  3. 此外,当按钮向其父窗口发送BN_CLICKED通知时,您的子类WndProc()不需要使用GetWindowLong(GWL_ID)。首先,你是在错误的HWND上调用它。其次,按钮ID在消息的wParam数据中携带。

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
        switch (message) {
            case WM_COMMAND: {
                if (HIWORD(wParam) == BN_CLICKED) {
                    switch (LOWORD(wParam)) {
                        case 100:
                        case 101:
                        case 103:
                            MessageBox(NULL, L"Sign of relief!", L"Whoaa!", 0);
                            break;
                    }
                }
                break;
            }
        }
        return CallWindowProc(oldWndProc, hWnd, message, wParam, lParam);
    }