【发布时间】:2010-08-17 22:01:09
【问题描述】:
我正在尝试更改不是我编写的程序的背景颜色。
用 Spy++ 查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个孩子有“ThunderRT6Frame”类。 ThunderRT6Frame 内部有一堆 ThunderRT6CommandButtons。
我想更改按钮后面的背景颜色。我尝试通过更改 ThunderRT6Frame 窗口的颜色来做到这一点,但我无法让它工作。有什么想法吗?
这是我首先尝试的:
HWND hwndCnt = FindWindow("ThunderRT6FormDC", NULL);
HWND hwndCntFrame = FindWindowEx(hwndCnt, NULL, "ThunderRT6Frame", NULL);
SetClassLong(hwndCnt, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(220,220,255)));
InvalidateRect(hwndCnt, 0, TRUE);
SetClassLong(hwndCntFrame, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(220,220,255)));
InvalidateRect(hwndCntFrame, 0, TRUE);
没有明显的变化,所以我继续注入一个 dll 和子类 WM_PAINT:
PAINTSTRUCT ps;
HDC hdcPaint = BeginPaint(Hwnd, &ps);
SetBkColor(hdcPaint, RGB(255,0,0));
HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
HPEN hOldPen = (HPEN)SelectObject(hdcPaint, pen);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdcPaint, brush);
RoundRect(hdcPaint, 1, 1, 100, 100, 10, 10);
SelectObject(hdcPaint, hOldPen);
SelectObject(hdcPaint, hOldBrush);
DeleteObject(pen);
DeleteObject(brush);
EndPaint(Hwnd, &ps);
return 0;
我有 ThunderRT6FormDC 和 ThunderRT6Frame 的 WM_PAINT 子类,但没有绘制我可以看到的红色矩形。
我做错了什么?我还需要尝试什么?
PS。我正在尝试更改的程序中的窗口类名称表明它是一个 VB6 程序,如果有帮助的话。
编辑:
我尝试将以下内容添加到两个窗口过程中
case WM_ERASEBKGND:
{
HDC hdcPaint = (HDC)wParam;
SetBkColor(hdcPaint, RGB(255,0,0));
HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));
HPEN hOldPen = (HPEN)SelectObject(hdcPaint, pen);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdcPaint, brush);
RoundRect(hdcPaint, 1, 1, 100, 100, 10, 10);
SelectObject(hdcPaint, hOldPen);
SelectObject(hdcPaint, hOldBrush);
DeleteObject(pen);
DeleteObject(brush);
return TRUE;
}
但我没有得到可见的结果
编辑 2:
将 MessageBoxes 放在不同的 WM_* 案例中,我可以看到正在绘制的矩形,即使在我关闭所有消息框之后,矩形仍留在屏幕上。但如果我根本没有任何消息框,我就看不到矩形。
所以我猜想在我画完窗户后会重新绘制窗户。重绘的目的是什么,在哪里进行?
编辑 3:
清理我的代码并仅保留 ThunderRT6Form 窗口的 WM_PAINT 使其工作。这就是 WM_PAINT 现在的样子:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdcPaint = BeginPaint(Hwnd, &ps);
HBRUSH brush = CreateSolidBrush(RGB(255, 255, 255));
RECT r;
GetClientRect(Hwnd, &r);
FillRect(hdcPaint, &r, brush);
DeleteObject(brush);
EndPaint(Hwnd, &ps);
return 0;
}
编辑 4:
我从来没有确切地知道为什么矩形不会在我的第一次尝试中出现。但这是我的代码中某处的一些错误。
这就是我所做的:首先我添加了消息框以确保所有代码都被调用。这使得矩形出现。然后我摆弄了一下消息框的位置(仅适用于表单,仅适用于框架,仅适用于 WM_PAINT 等)。我总是得到矩形。然后我删除了所有的消息框,果然,矩形也消失了。所以我重新添加了一些消息框并开始清理我的代码。其中一些“清理”修复了我的错误,因为之后我可以删除所有消息框并且仍然能够在背景上绘画。
【问题讨论】:
-
嗨,你从哪里得到 wm_paint 消息?请显示完整的代码...每个人都说 wm_paint ,WM_ERASEBKGND 你如何获得/捕捉那个 wm_XXXXX ???
-
哇!这是八年前的代码。我对此一无所知 :D :( 抱歉!