从C ++程序更改另一个程序的背景颜色

时间:2010-08-17 22:01:10

标签: c++ winapi gdi

我正在尝试更改我不写的程序的背景颜色。

用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:

我从来没有确切地知道为什么在我的第一次尝试中矩形不会出现。但是我的代码在某处出现了一些错误。

这就是我所做的:首先我添加了消息框以确保所有代码都被调用。这使得矩形出现了。然后我摆弄了一下我的消息框(仅适用于Form,仅适用于Frame,仅适用于WM_PAINT等)。我总是得到矩形。然后我删除了所有的消息框,果然,矩形也消失了。所以我重新添加了一些消息框并开始清理我的代码。其中一些“清理”修复了我的错误,因为之后我可以删除所有消息框并仍然可以在背景上绘画。

1 个答案:

答案 0 :(得分:1)

如果您按照处理WM_PAINT的方式处理WM_ERASEBKGND消息,则可能会看到一些成功。