我的应用程序有一个图片控件,其背景为灰色,我希望它是白色的。我已经尝试了几件事,比如:派生一个类并覆盖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);
答案 0 :(得分:2)
使用Spy ++进行一些调试后,我发现Picture Control是一个静态控件,我必须处理的消息不是WM_CTLCOLOR
而是WM_CTLCOLORSTATIC
因此,在包含它的对话框中,我从
更改了消息映射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 类型变量的函数,所以演员。
结果是我所期待的:
更新 :我最近需要做一件事情,我必须设置静态的文本颜色,并发现我也可以获取其设备上下文:
HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;
所以,在我可以通过以下方式轻松完成之后:
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));