做了一個對話框,有一些按鈕,對應有一些消息處理函數。這時,再從該對話框類中派生一個新類,再任何代碼都不加的情況下。這個新對話框表現會怎麼樣?界面中的按鈕現在還能處理嗎?會出現其它什麼亂七八糟不可理解的事情嗎?消息的轉發如何進行?就是說,當你點過一個按鈕以後會怎麼樣?因為新類中並沒有處理這個消息,那麼這個消息會傳給父類嗎?

解决方案 »

  1.   

    要重载DLG的话,窗体上就不要放控件,在子类上放,重载副类的函数后,如果还想执行副类的代码,就在子类里加入副类的哪个函数.就和MFC的机制一样.
    比如:
     void MyDlg::OnDraw(CDC* pDC)
    {
       ..........you code
       Dlg::OnDraw(pDC);//Dlg是副类
    }
      

  2.   

    once168(once168) :可是,並非這樣啊,父類中處理了 LBUTTONDOWN這個消息,子類中沒有做,然後會發現子類對話框 DoModal後,不會響應鼠標消息,按理說應該去找父類啊,好象並沒有。Why?試著用classwizard添加了幾個消息處理函數,發現只有虛函數才可以做到,例如 OnInitialDialog()、OnOK()才能處理。但是這幾個函數在映射表裡是沒有的。也就是說它是直接被調用而不是通過所謂的映射表才找到的。Why?候先生講的那種流動到底是怎麼回事?
      

  3.   

    基類的映射表:
    BEGIN_MESSAGE_MAP(CRipDlg, CDialog)
    //{{AFX_MSG_MAP(CRipDlg)
    ON_WM_LBUTTONDBLCLK()
    ON_WM_PAINT()
    ON_BN_CLICKED(IDC_STOPRIP, OnStoprip)
    ON_WM_CLOSE()
    ON_BN_CLICKED(IDC_PAUSE, OnPause)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    子類的映射表(空的):
    BEGIN_MESSAGE_MAP(CDlg2, CDialog)
    //{{AFX_MSG_MAP(CDlg2)
    // NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    在子類DoModal出現的窗口(它用了和基類一樣的對話框模板),點按鈕或按鼠標都沒有反應。按理說,鼠標雙擊事件不應該傳到基類去嗎??
      

  4.   

    //BEGIN_MESSAGE_MAP(CDlg2, CDialog)//这名写错了,你将消息直接传给CDialog基类,所以你写的函数不起作用(你自已展开一下宏就知道是什么回事了)
    BEGIN_MESSAGE_MAP(CDlg2, CRipDlg)//
    //{{AFX_MSG_MAP(CDlg2)
    // NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
      

  5.   

    对不起,好长时间没看了,once168说得对! 茅塞顿开!!
    激动!:)