对话框上有个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背景涂红。

解决方案 »

  1.   

    ::PostMessage( hwnd, WM_CTLCOLOR, hdc, (LPARAM)GetSafeHwnd());
      

  2.   

    ::PostMessage( hwnd, WM_CTLCOLOR, hdc, (LPARAM)GetSafeHwnd());
      

  3.   

    试试SendMessage(),以为PostMessage()是非阻塞的,消息发出后不等消息执行就立刻返回,可能是因为这个原因造成 参数被释放,所以报错。SendMessage()是阻塞的,函数不返回,程序不会往下执行。
      

  4.   

    现在用 ::PostMessage( hwnd, WM_CTLCOLOR, hdc, (LPARAM)GetSafeHwnd());data abort 的错是不报了,OnCtlColor函数也调用到了,但是 pWnd->GetDlgCtrlID() == IDC_EDIT_CNT 和 nCtlColor == CTLCOLOR_EDIT 这两个都不成立,程序直接运行到 else 返回了。
      

  5.   


    WM_CTLCOLOR事件是系统绘图时若干事件的一个事件,一般你要做的是相应它!发送该消息最大的可能就是显示输出混乱;如果重新绘画,则使用Invalidate...可能更有效
      

  6.   

    作为 Edit 重绘 过程中的 一步 , WM_CTLCOLOR  是 edit 发给 父窗口(对话框) 的 消息。
    所以如果 不 启动 edit 重绘 (Invalidate) ,这一步 一点 用处 没有。按钮中 设个 标记 m_bRedColor =TRUE;
    Invalidate edit。
    在 OnCtlColor 中 检查 m_bRedColor 是否 =TRUE
      

  7.   


    谢谢、我现在用了Invalidate但是设置的是整个对话框的背景色,在调用 if ( (nCtlColor == CTLCOLOR_EDIT) &&( COLORON == TRUE )  )的时候,nCtlColor == CTLCOLOR_EDIT 这个条件总是不成立,我调用invalidate的时候就是一句:Invalidate(TRUE);这样有问题吗?