没有看明白你的意思:
你好象是要在CA的OnInitDialog中调用DoSomething,希望结果
是运行CChild的DoSomething.
如果是这样,上面是不行的.

解决方案 »

  1.   

    对的,我最终的结果是要显示CChild的对话框,并且运行CChild的DoSomething
    那我能不能再加上
    CChild::OnInitDialog(参数){DoSomething();}
    这样行不行?
      

  2.   

    原理上好像可以,因为在构造CChild对象的时候会自动调用基类的构造函数。
    g_hWnd又是全局变量
      

  3.   

    但我试了,显示的还是CA的对话框啊
    而且没有运行CChild的DoSomething()函数
      

  4.   

    但我试了,显示的还是CA的对话框啊
    而且没有运行CChild的DoSomething()函数
      

  5.   

    CChild的构造函数里传至基类CDialog的对话框资源ID是CA的还是CChild的?
      

  6.   

    当然可以。不过OnInitDialog()是无参虚函数。你是不是搞错了。
      

  7.   

    iceneve(黑暗星云) :这是ATL控件里的类,从CAxDialogImpl派生的
    webber84(糕鱼昏) :是CChild 的了
      

  8.   

    CA::DoSomething()是虚函数.
    那么在调用时动态决议是调用哪一个DoSomething.
    不管你定义了CA还是CChild类型的指针或引用,要看它具体指向或引用那个类型的实例,才会调用该实例的类的DoSomething.
    这样作是可以的,关键看你怎么用.
      

  9.   

    我的调用很简单
    CA *p ;
    p = new CChild;
      

  10.   

    CA::CA(){create(g_hWnd) ;}//g_hWnd全局变量?你改写了Create函数吧!里面是如何实现的,是分实际情况创建父窗口还是子窗口的吗?这个地方决定了显示的窗口时什么?此外,你的DoSomething如果是虚函数的话,应该不会有什么问题?
      

  11.   

    CDialog的两个Create函数没有接收一个HWND参数的吧!
    你的create(g_hWnd)是怎么回事?上面写了你是如何创建类变量的了,那剩下的问题是你如何创建窗口的了?
      

  12.   

    这是ATL控件里的类,从CAxDialogImpl派生的
    所以跟CDialog有点不一样的
    Create(HWND,long)
    OnInitDialog里面了
    但问题是根本没调用CChild的OnInitDialog函数
      

  13.   

    ATL我用得不多,不过,如果你的代码没有什么别的考虑的话,我们可以一同研究研究
    [email protected]
      

  14.   

    我贴一下两个类的头文件里的消息吧
    CA的头文件还有
    BEGIN_MSG_MAP(CVideoManager)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    END_MSG_MAP()
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    CChild的头文件里有 
    BEGIN_MSG_MAP(CVideoManagerChild)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    END_MSG_MAP()
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    自然两边都还有enum{IDD=各自的对话框ID了};
    我觉得问题可能出在CA的构造函数里有Create()窗口函数
    CChild里没有,任何当调用CChild时,先调用父类的构造函数,建立了
    父类的窗口了,所以显示的是CA的窗口
    请高手帮忙想想解决办法
      

  15.   

    暂没收到 :)是Create的问题?如果是的话,如下解决
    B.h
    class B : public ****
    {
      B()
      {
      }
       ...
       virtual void CreateWindow()
      {
         Cretate(g_hWnd);
      }
    }D.h
    class D : public B
    {
      D()
      {
      }
       ...
       virtual void CreateWindow()
      {
         Cretate(g_hWnd);
      }
    }调用方式改为:
    B* p = new D;
    p = new CVideoManagerChild ;
    p->CreateWindow();上面两步不要再合而为一,构造函数里调用虚函数会死的很难看的
      

  16.   

    我试了,还是不行,不过好了一点,能够进入CChild的Create和OnitDialog
    我怀疑问题在于CA *p这个定义上
    是不是这样定义后,不管以后它怎么指,它显示的时候都显示A的对话框
    而不显示CChild的对话框?
      

  17.   

    干脆自己用API写类得了,这样你就可以用C++的好东西了,MFC有时限制太多
      

  18.   

    干脆自己用API写类得了,这样你就可以用C++的好东西了,MFC有时限制太多