我开始没有重新继承这个类,而是直接创建了这个类
CDialogBar m_dlg;
m_dlg.Create(...);
但是在其父窗口Framewnd中无法接收到OnCtlColor的消息
后来我创建了一个新类,继承了CDialogBar。
class CMyDialogBar : public CDialogBar
{};
在这里添加OnCtlColor函数,还是无法处理
说CDialogBar把消息都是送完父类
那么我该去哪里接收消息,在哪里设置处理函数呢..在深入浅出MFC中说,一般消息都是自子类往父类不断地搜索
那么子控件的绘制消息怎么会跑到父窗口去呢?
只有10分,不好意思,希望高手给我解惑

解决方案 »

  1.   

    是不是这样的,CDialogBar上的控件发送WM_CTLCOLOR给CDialogBar,CDialogBar又把这个消息发送给它的父类也就是主框架,然后主框架来处理?
    我在主框架中这么弄,但是没效果。
    HBRUSH CMainFrame::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    return CBrush(RGB(255,0,0));
    // TODO: Return a different brush if the default is not desired
    //return hbr;
    }
      

  2.   

    if(bar.GetDlgItem(id)==pWnd->m_Hwnd)
    {
    your code;}//CDialogBar 变量为bar
      

  3.   

    为什么要加上这个条件呢。我现在并不是想要为某个控件设置
    我是看看这个消息有没有响应。因为只要我返回一个红色的画刷
    背景色应该是被画成红色的了。
    我加上了判断也不行
    而且GetDlgItem这个函数返回的是一个CWND指针类型,和右边的句柄不匹配。前辈,能回答下我上面说的那个消息循环过程是不是正确的么?
      

  4.   

    添加一个成员变量,m_brush,在构造时初始化m_brush.CreateSolidBrush(RGB(255.0,0));然后,HBRUSH CMainFrame::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    return m_brush;
    // TODO: Return a different brush if the default is not desired
    //return hbr;
    }
    应该可以吧。
    至于fanqing说的 应该是这样吧:
    if(pWnd->GetDlgCtrlID()==IDC_XXXXX)
    {
        your code;
    }
      

  5.   

    我试过了,要子类化cdialogbar;
    在这个类中处理OnCtlColor
      

  6.   

    多谢忍者,实现了。
    有以下迷惑
    说cdialogbar会把消息送往父类。但是这里它为什么自己处理了呢