Picture Control背景是灰色的,我希望它是白色的

时间:2017-03-30 14:23:20

标签: image visual-c++ mfc background-color picturebox

我的应用程序有一个图片控件,其背景为灰色,我希望它是白色的。我已经尝试了几件事,比如:派生一个类并覆盖OnPaint方法;回复WM_CTLCOLOR消息(添加ON_WM_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);

gray back

1 个答案:

答案 0 :(得分:2)

使用Spy ++进行一些调试后,我发现Picture Control是一个静态控件,我必须处理的消息不是WM_CTLCOLOR而是WM_CTLCOLORSTATIC

enter image description here

因此,在包含它的对话框中,我从

更改了消息映射
ON_WM_CTLCOLOR()

ON_MESSAGE(WM_CTLCOLORSTATIC, OnCtlColorStatic)

在实施中,从

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

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}

LRESULT CMyDialog::OnCtlColorStatic(WPARAM wParam, LPARAM lParam)
{
    HWND hWnd = (HWND)lParam;

    if (::GetDlgCtrlID(hWnd) == IDC_PICTURE)
        return (LRESULT)white.GetSafeHandle();

    return DefWindowProc(WM_CTLCOLORSTATIC, wParam, lParam);
}

在头文件中,还可以从

更改方法
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

LRESULT OnCtlColorStatic(WPARAM wParam, LPARAM lParam);

注意一个微妙的区别:旧的工作方式是直接返回 HBRUSH 画笔句柄;新的一个函数需要一个返回 LRESULT 类型变量的函数,所以演员。

结果是我所期待的:

enter image description here

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

HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;

所以,在我可以通过以下方式轻松完成之后:

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