优化校准背景是灰色的,我想要它是白色的
Picture Control background is gray and I want it white
我的应用程序有一个图片控件,它的背景是灰色的,我希望它是白色的。我已经尝试了几件事,例如:派生一个 class 并覆盖 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);
}
头文件class定义:
CBrush white;
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
在使用 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 类型的变量,所以 cast.
结果如我所料:
更新:我最近需要做一件事,我必须设置静态的文本颜色并发现我可以还获取其设备上下文:
HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;
所以,在我可以通过以下方式轻松完成之后:
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));
我的应用程序有一个图片控件,它的背景是灰色的,我希望它是白色的。我已经尝试了几件事,例如:派生一个 class 并覆盖 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);
}
头文件class定义:
CBrush white;
HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
在使用 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 类型的变量,所以 cast.
结果如我所料:
更新:我最近需要做一件事,我必须设置静态的文本颜色并发现我可以还获取其设备上下文:
HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;
所以,在我可以通过以下方式轻松完成之后:
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));