对话框上有个EDIT控件,对话框上有个按钮,按钮里需要向edit发WM_CTLCOLOR消息,实现更改edit背景色的功能。我在对话框的CXXXDlg类里的消息中,添加了WM_CTLCOLOR的消息函数:HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((pWnd->GetDlgCtrlID() == IDC_EDIT_CNT) && (nCtlColor == CTLCOLOR_EDIT) && COLORON == TRUE )
{
COLORREF clr = RGB( 0,0,0); pDC->SetTextColor(clr); //设置黑色的文本
clr = RGB(255,0,0); pDC->SetBkColor(clr); //设置红色的背景 HBRUSH m_brMine = ::CreateSolidBrush(clr); COLORON = FALSE;
return m_brMine; //返回的是背景色对应的刷子句柄 } else { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); return hbr; } 在按钮的处理函数里加了发送消息的代码:
CWnd* pwnd = AfxGetMainWnd();
HWND hwnd = pwnd->GetSafeHwnd();//MFC对话框程序的窗口句柄
CDC* pdc = pwnd->GetDC();
HDC hdc = pdc->GetSafeHdc();::PostMessage( hwnd, WM_CTLCOLOR, pdc, hdc );可是每次运行到发消息这里,消息是发完了,消息处理函数没调用到,调试窗口报错:ata Abort: Thread=864eebf4 Proc=81faf7a0 'XXX.exe'
AKY=00010001 PC=000201a8(XXX.exe+0x000101a8) RA=000201a8(XXX.exe+0x000101a8) BVA=22000004 FSR=00000007请问这是为什么?
是我消息发送的有问题吗?
因为我试过,程序运行时,系统自己调用OnCtlColor的时候,程序运行正常,能把edit背景涂红。
{
if ((pWnd->GetDlgCtrlID() == IDC_EDIT_CNT) && (nCtlColor == CTLCOLOR_EDIT) && COLORON == TRUE )
{
COLORREF clr = RGB( 0,0,0); pDC->SetTextColor(clr); //设置黑色的文本
clr = RGB(255,0,0); pDC->SetBkColor(clr); //设置红色的背景 HBRUSH m_brMine = ::CreateSolidBrush(clr); COLORON = FALSE;
return m_brMine; //返回的是背景色对应的刷子句柄 } else { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); return hbr; } 在按钮的处理函数里加了发送消息的代码:
CWnd* pwnd = AfxGetMainWnd();
HWND hwnd = pwnd->GetSafeHwnd();//MFC对话框程序的窗口句柄
CDC* pdc = pwnd->GetDC();
HDC hdc = pdc->GetSafeHdc();::PostMessage( hwnd, WM_CTLCOLOR, pdc, hdc );可是每次运行到发消息这里,消息是发完了,消息处理函数没调用到,调试窗口报错:ata Abort: Thread=864eebf4 Proc=81faf7a0 'XXX.exe'
AKY=00010001 PC=000201a8(XXX.exe+0x000101a8) RA=000201a8(XXX.exe+0x000101a8) BVA=22000004 FSR=00000007请问这是为什么?
是我消息发送的有问题吗?
因为我试过,程序运行时,系统自己调用OnCtlColor的时候,程序运行正常,能把edit背景涂红。
WM_CTLCOLOR事件是系统绘图时若干事件的一个事件,一般你要做的是相应它!发送该消息最大的可能就是显示输出混乱;如果重新绘画,则使用Invalidate...可能更有效
所以如果 不 启动 edit 重绘 (Invalidate) ,这一步 一点 用处 没有。按钮中 设个 标记 m_bRedColor =TRUE;
Invalidate edit。
在 OnCtlColor 中 检查 m_bRedColor 是否 =TRUE
谢谢、我现在用了Invalidate但是设置的是整个对话框的背景色,在调用 if ( (nCtlColor == CTLCOLOR_EDIT) &&( COLORON == TRUE ) )的时候,nCtlColor == CTLCOLOR_EDIT 这个条件总是不成立,我调用invalidate的时候就是一句:Invalidate(TRUE);这样有问题吗?