我正在开发基于win32 gui的Zoom SDK。
我在窗口句柄上使用CreateWindow方法创建了3个按钮,由ZoomSDK提供。
代码+截图 - 1
现在有两个问题。
我想知道发生这种情况的原因以及如何解决这个问题?
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");
我想处理这些按钮的点击事件。我试图使用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);
}
现在,这个WndProc被调用其他事件,如鼠标移动等。它不能用于我的三个按钮。我想处理点击事件,即WM_COMMAND或任何其他可能的技术。
因为我不能进入sdk(他们不提供源,只有.lib)所以我不能改变他们的WndProc,也不能改变他们的内部WM_PAINT。按钮有点叠加在上面。
答案 0 :(得分:0)
您不应该从SetBkColor()
处理程序外部调用SetTextColor()
和WM_PAINT
。为按钮着色的正确方法是:
让父窗口处理WM_CTLCOLORBTN
通知。
在绘制按钮之前,WM_CTLCOLORBTN消息将发送到按钮的父窗口。父窗口可以更改按钮的文本和背景颜色。
为按钮指定BS_OWNERDRAW
样式,然后让父窗口处理WM_DRAWITEM
通知。
当按钮,组合框,列表框或菜单的可视方面发生更改时,发送到所有者绘制按钮,组合框,列表框或菜单的父窗口。
此外,当按钮向其父窗口发送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);
}