我做了一个对话框程序DialogA,(ID为IDD_DIALOGA),DialogA上有一ButtonA按钮,左击ButtonA,弹出DialogB(ID为IDD_DIALOGB),但怎样获得DialogB的窗口指针呢?
我的ButtonA的Onlicked()代码如下:
  void CDialogA::OnButtonA() 
{
     CDialog dlgg;
     dlgg.DoModal();     CWnd* pDlg;
     pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
     pDlg->ShowMsg();//不能访问!!!! //实现如下:
}void CDialogB::ShowMsg()
{
  AfxMessageBox("heelddd");
}编译出错: error C2039: 'ShowMsg' : is not a member of 'CWnd'我改成: pDlg=(CWnd*)AfxGetMainWnd()->Findow(NULL,"DialogB");
//"DialogB"为DialogB的标题。
编译出错:error C2039: 'Findow' : is not a member of 'CWnd'。怎样解决?

解决方案 »

  1.   

    thanks!
    头文件加了,我想这已经比较具体了.
      

  2.   

    试试这个:
    在A的**dlg中声明 CDialog *dlg;
    构造中赋空。
    button()
    {
     if (dlg==NULL)
      {
        dlg=new CDialog;
        dlg->creat(IDD_DIALOGB,this);
      }
    dlg->showwindows(SW_SHOW);
    不知能否帮你。
      

  3.   

    void CDialogA::OnButtonA() 
    {
         CDialogB *pdlgB = new CDialogB(this); 
         pdlgB->Create(IDD_DIALOGB,this);     pdlgB->ShowWindow(SW_SHOW);}
    DoModal()完了之后,对话框的资源释放了,你当然得不到它的指针了。
      

  4.   

    to:hanyulou2003(寒雨楼) 
     寒兄:
      这是用非模态对话框吧,我用的是模态对话框。不过我来试试,谢谢!
      

  5.   

    To:dizzo(啥都不会,瞎搅和)一定要用非模态对话框吗?
      

  6.   


         CWnd* pDlg;
         pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
         pDlg->ShowMsg();//
    这样好像会内存泄漏的。
      

  7.   

    替换窗口过程,参考下面代码,很有用的。
    BCB_FANS(四大名捕之追杀令)
    当MessageBox(模态对话框)对话框显示的时候,主窗口将失去焦点,知道了这一点,问题就很简单了。下面是我的C++Builder代码。//替换主窗口的窗口过程(我不知道VC怎样办到这一点,反正原理就是这样)void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
      TForm::WndProc(Message);  //失去焦点之前
      if(Message.Msg == WM_NCACTIVATE)
      {
      }
      //失去焦点之后
      else if(Message.Msg == WM_ACTIVATE)
      {
        if(LOWORD(Message.WParam) == WA_INACTIVE)
        {
          HWND hWnd;
          char ClassBuf[64];      hWnd = (HWND)Message.LParam;
          GetClassName(hWnd,ClassBuf,sizeof(ClassBuf));      //首先判断是否是MessageBox对话框,
          if(AnsiString(ClassBuf) == "#32770")
          {
            //再判断这个窗口是否是本身程序的窗口(因为别的程序弹出窗口时,你的主窗口也同样失去焦点)
            DWORD dwProcessID;
            
            GetWindowThreadProcessId(hWnd,&dwProcessID);
            
            if(dwProcessID == GetCurrentProcessId())
            {
              //移动窗口的位置
              MoveWindow(.......);//或者调用 SetWindowPos(...)
              
              //替换左边的标题栏图标(如果有的话)
              SetClassLong(hWnd,GCL_HICON,(long)Image1->Picture->Icon->Handle);          //重新设置按钮的文本(比如把确定改为“OK 007”)
              HWND hTemp;          hTemp = GetDlgItem(hWnd,1);
              SetWindowText(hTemp,"New Text For Button");          //.........其他操作
            }
          }
        }
      }
    }
      

  8.   

    CDialog dlgg;
         dlgg.DoModal();     CWnd* pDlg;
         pDlg=AfxGetMainWnd()->GetDlgItem(IDD_DIALOGB);
         pDlg->ShowMsg();//不能访问!!!! //实现如下:  当然不能访问了。你的pDlg已经是CWnd类的,根本不是IDD_DIALONGB的。改成: pDlg=(CWnd*)AfxGetMainWnd()->Findow(NULL,"DialogB");
    //"DialogB"为DialogB的标题。错误与上面的一样。
    如果一定要访问,可以在XXXApp中定义非模态的指针。以后在什么地方都可以访问,然后初试化后不要显示。
    弹出后点击关闭按扭就ShowWindow(WS_HIDE);
    这样你就可以使用它的函数了。
      

  9.   

    谢谢大家这么热情,又使我长进不少。
    我的成长有大家的关怀。
    Thanks sincerely.