Image 图片控制背景是灰色的,我希望它是白色的

Image 图片控制背景是灰色的,我希望它是白色的,image,visual-c++,mfc,background-color,picturebox,Image,Visual C++,Mfc,Background Color,Picturebox,我的应用程序有一个图片控件,它的背景是灰色的,我希望它是白色的。我已经尝试过几种方法,比如:派生一个类并重写OnPaint方法;响应WM\u CTLCOLOR消息(在\u WM\u CTLCOLOR()上添加,并对其进行处理),但未成功 消息映射上的条目: ON_WM_CTLCOLOR() 实施: BOOL CMyDialog::OnInitDialog() { __super::OnInitDialog(); white.CreateSolidBrush(RGB(255,2

我的应用程序有一个图片控件,它的背景是灰色的,我希望它是白色的。我已经尝试过几种方法,比如:派生一个类并重写
OnPaint
方法;响应
WM\u CTLCOLOR
消息(在\u WM\u CTLCOLOR()上添加
,并对其进行处理),但未成功

消息映射上的条目:

ON_WM_CTLCOLOR()
实施:

BOOL CMyDialog::OnInitDialog()
{
    __super::OnInitDialog();

    white.CreateSolidBrush(RGB(255,255,255));

    //...

    return TRUE;  // return TRUE  unless you set the focus to a control
}


HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd == GetDlgItem(IDC_PICTURE))
    {
        return white;
    }

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}
头文件类定义:

CBrush white;

HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

在使用Spy++进行一些调试之后,我意识到图片控件是一个静态控件,我必须处理的消息不是
WM\u CTLCOLOR
,而是
WM\u CTLCOLORSTATIC

因此,在包含它的对话框中,我将消息映射从

ON_WM_CTLCOLOR()


在实现上,将方法从

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd == GetDlgItem(IDC_PICTURE))
    {
        return white;
    }

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);


在头文件中,将方法也更改为

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd == GetDlgItem(IDC_PICTURE))
    {
        return white;
    }

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);


请注意一个细微的区别:旧的方法是直接返回HBRUSH笔刷句柄;新函数期望函数返回一个LRESULT类型化变量,因此强制转换

结果是我所期望的:

更新:我最近需要做一件事,必须设置静态文件的文本颜色,并发现我还可以获取其设备上下文:

HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;
因此,在我可以轻松做到这一点之后:

SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));