我开发了一个win32应用程序,并使用this example创建了颜色选择器。当用户在颜色对话框中单击“确定”时,我更新了if this之类的语句来更改我的应用程序的背景,但没有任何变化。我的错误在哪里?

if (ChooseColor(&cc) == TRUE) {
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult);
    rgbCurrent = cc.rgbResult;
    SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG)hbrush);
}

最佳答案

以下代码将起作用。

首先,SetClassLongPtr()返回先前的值,在这种情况下,它是先前设置为窗口类(hWnd)的HBRUSH。您应该删除该对象以避免内存泄漏。

之后,调用InvalidateRect()使颜色更改生效。因为新创建的笔刷将在需要重绘窗口时使用。

InvalidateRect()将WM_ERASEBKGND发送到窗口。

if (ChooseColor(&cc) == TRUE) {
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult);
    HBRUSH hOldBrush = (HBRUSH)SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbrush);

    DeleteObject(hOldBrush);
    InvalidateRect(hWnd, NULL, 1);
}

09-06 18:35