MFC单文档程序:
CSPView类 中有2个变量: CDataDialog *m_pDataDlg;//注class CDataDialog:public CDialog{
CPasswordDialog *m_pPasswordDlg;//注class CDataDialog:public CDialog
建立2个子窗口时,都把父窗口设为当前窗口。
if(NULL==m_pDataDlg) //have not created the dialog box
{
m_pDataDlg = new CDataDialog(m_pPointSet,m_pArcSet);
m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
}
如今:
void CPasswordDialog::OnBnClickedOk()
{
UpdateData(TRUE);
if(SafetyConfirm())
{
CSPView * view=(CSPView *) GetParent();
assert(view);
view->GetDataDialog();
assert( (view->m_pDataDlg) ); //正常。
view->m_pDataDlg->ShowWindow(SW_SHOW);  ///**调试时异常抛出。
}
OnOK();
}不知道 这可能是什么原因?能否在CPasswordDialog中显示另外一个对话框 *m_pDataDlg??
  view->m_pDataDlg->ShowWindow(SW_SHOW);

解决方案 »

  1.   

    调试的时候:
    BOOL CWnd::ShowWindow(int nCmdShow)
    {
    ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); if (m_pCtrlSite == NULL)
    return ::ShowWindow(m_hWnd, nCmdShow);
    else
    return m_pCtrlSite->ShowWindow(nCmdShow);  ///异常在这里产生。
                                              //但是,m_pCtrlSite 不是NULL
    }
      

  2.   

    直接用::ShowWindow(view->m_pDataDlg->GetSafeHwnd,SW_SHOW)呢?
      

  3.   

    jasonshark(All Gone) ( ) 信誉:100  2006-05-20 20:16:00  得分: 0   
     
       直接用::ShowWindow(view->m_pDataDlg->GetSafeHwnd,SW_SHOW)呢?
    ========================
    编译提示:error C2664: “ShowWindow” : 不能将参数 1 从“HWND (void) const”转换为“HWND”我查了一下,该函数是 Window Management的内容。
    这要加什么头文件?
      
     
      

  4.   

    哦,我少写了()
    应该是::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW);
      

  5.   

    m_pDataDlg调用Create创建窗口了吗
      

  6.   

    1. jasonshark(All Gone) ( ) 信誉:100  2006-05-20 20:31:00  得分: 0  
     
       哦,我少写了()
    应该是::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW);
      
    =========================================================
    编译通过。调用窗口,没有反应。
    2. YufengShi(浪子) ( ) 信誉:100  2006-05-20 20:38:00  得分: 0  
     
       m_pDataDlg调用Create创建窗口了吗
    ============================
      m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
    有,同时,m_pPasswordDlg业调用了Create创建窗口,只是没有写出来。
      
      

  7.   

    1. jasonshark(All Gone) ( ) 信誉:100  2006-05-20 20:31:00  得分: 0  
     
       哦,我少写了()
    应该是::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW);
      
    =========================================================
    编译通过。调用窗口,有时候窗口没有任何动作;大部分时候也是抛出异常,还是ShowWindow的错误。
      

  8.   

    你调用的窗口用了 ActiveX控件?
      

  9.   

    没有用Active 控件。
    ****这句话说明如下:  “编译通过。调用窗口,有时候窗口没有任何动作;大部分时候也是抛出异常,还是ShowWindow的错误。”***我错了,当我直接按回车键,而非“确定”键时没有动作;当按“确定”键时,出现ShowWindow()异常。另外,按确定键时,时间处理程序为:
    void CPasswordDialog::OnBnClickedOk() ,在第1楼问题中已经给出。下面是判断安全性的代码:
    bool CPasswordDialog::SafetyConfirm(void)
    {
    if(m_UserName == "sa" && m_Password=="sa")
    return TRUE;
    else
    {
    AfxMessageBox(_T("用户名或密码错误。无法查询数据库内容。"));
    return FALSE;
    }
    return FALSE;
    }
      

  10.   

    不用m_pPasswordDlg (CPasswordDialog *类型)建立非模式对话框,而
    直接建立CPasswordDialog myPasswordDlg; 在CSPView中处理,不会出现异常。具体程序和描述如下:void CSPView::OnBnClickeddataedit()
    { GetDataDialog();
    CPasswordDialog myPasswordDlg;    //直接建立临时对话框,而不是用指针new
    if(myPasswordDlg.DoModal() == IDOK)   //这样子就可以。
    {                                //但是如前所述,事件在子对话框 
    //框 CPasswordDialog中处理,就会出错ShowWindow异常。
    //不知道应该如何解释呢??
    if(myPasswordDlg.SafetyConfirm())
    m_pDataDlg->ShowWindow(SW_SHOW);
    }
    }
      

  11.   

    CPasswordDialog::OnBnClickedOk()
    {
    UpdateData(TRUE);
             DestroyWindow();
    if(SafetyConfirm())
    {
    CSPView * view=(CSPView *) GetParent();
    assert(view);
    view->GetDataDialog();
    assert( (view->m_pDataDlg) ); //正常。
    view->m_pDataDlg->ShowWindow(SW_SHOW);  ///**调试时异常抛出。
    }
    //OnOK();这样试试呢?
      

  12.   

    to: jasonshark(All Gone) ( ) 信誉:100  2006-05-20 22:41:00  得分: 0   
       CPasswordDialog::OnBnClickedOk()
    {
    UpdateData(TRUE);
             DestroyWindow();    
    if(SafetyConfirm())
    {
    CSPView * view=(CSPView *) GetParent();  //***已经DestroyWindow()
                                                              //***抛出异常。
                         ……
    }
    //OnOK();
      
     
      

  13.   

    你应该在CSPView类的构造函数中加入
    m_pDataDlg = NULL;
    m_pPasswordDlg =NULL;
    否则你在创建窗口的时候因为m_pPasswordDlg不为空而
    m_pDataDlg = new CDataDialog(m_pPointSet,m_pArcSet);
    m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
    语句不会执行,所以虽然assert( (view->m_pDataDlg) );正常,但m_pDataDlg并不是你创建的窗口指针,在调用view->m_pDataDlg->ShowWindow(SW_SHOW);  时就会出错。
      

  14.   

    谢谢楼上提醒。我本来就已经包含了初始化部分。
    CSPView::CSPView()
    : m_pPointSet(NULL)
    , m_pArcSet(NULL)
    , m_pDataDlg(NULL)
    ,m_pPathDlg(NULL)
    , m_pPasswordDlg(NULL)
    {
    // TODO: 在此处添加构造代码}
      

  15.   

    不用m_pPasswordDlg (CPasswordDialog *类型)建立非模式对话框,而
    直接建立CPasswordDialog myPasswordDlg; 在CSPView中处理,不会出现异常。具体程序和描述如下:void CSPView::OnBnClickeddataedit()
    {GetDataDialog();
    CPasswordDialog myPasswordDlg;    //直接建立临时对话框,而不是用指针new
    if(myPasswordDlg.DoModal() == IDOK)   //这样子就可以。
    {                                //但是如前所述,事件在子对话框 
    //框 CPasswordDialog中处理,就会出错ShowWindow异常。
    //不知道应该如何解释呢??
    if(myPasswordDlg.SafetyConfirm())
    m_pDataDlg->ShowWindow(SW_SHOW);
    }
    }
    =======================================================================
    判斷正確,我也遇到過,但不知原因,請高手指教
      

  16.   

    那就不是对话框创建的问题,可能是其它问题引起的
    因为我已经测试过,建了一个工程,两个对话框都是在视图类中创建的
    能够正常显示出来,没什么问题
    视图类构造函数:
    CTestView::CTestView()
    {
    // TODO: add construction code here
        m_pass = NULL;
        m_data = NULL;
    }
    视图类中显示密码对话框的函数:
    void CTestView::OnShwoPass() 
    {
    // TODO: Add your command handler code here
    if(!m_pass)
    {
    m_pass = new CPass();
    m_pass->Create(IDD_DIA_PASS,this);
    }

    if(m_pass)
    m_pass->ShowWindow(SW_SHOW);
    }视图类中创建数据对话框的函数:
    void CTestView::GetDataDialog()
    {
       if(!m_data)
    {
    m_data = new CData();
    m_data->Create(IDD_DIA_DATA,this);
    }
    }密码对话框中显示数据对话框的函数:
    void CPass::OnOK() 
    {
    // TODO: Add extra validation here
    UpdateData(TRUE);
    CTestView *view = (CTestView *)GetParent();
    ASSERT(view);
    view->GetDataDialog();
    ASSERT(view->m_data);
    view->m_data->ShowWindow(SW_SHOW);
    //CDialog::OnOK();
    }
      

  17.   

    to: wxfy1977(我心飞扬) 
    我也是那样子处理的void CSPView::GetDataDialog(void)
    {
    if(NULL==m_pDataDlg) //have not created the dialog box
    {
    m_pDataDlg = new CDataDialog(m_pPointSet,m_pArcSet);
    m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
    }
    }void CSPView::GetPathDialog(void)
    {
    if(NULL==m_pPathDlg) //have not created the dialog box
    {
    m_pPathDlg = new CPathDialog(m_pPointSet,m_pArcSet,m_pDataDlg);
    m_pPathDlg->Create(IDD_PATH,this);//父窗口为当前窗口
    }
    }void CSPView::OnBnClickeddataedit()
    {
    // TODO: 在此添加控件通知处理程序代码 GetPasswordDialog();  
    GetDataDialog();
    m_pPasswordDlg->ShowWindow(SW_SHOW); //利用非模式对话框,在子对话框中处理,ShowWindow()出错
    /* CPasswordDialog myPasswordDlg;
    if(myPasswordDlg.DoModal() == IDOK)
    {
    if(myPasswordDlg.SafetyConfirm())
    m_pDataDlg->ShowWindow(SW_SHOW);
    }
    */
    // m_pDataDlg->ShowWindow(SW_SHOW);
    }void CPasswordDialog::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    //( (CSPView *)GetParent() )->
    UpdateData(TRUE);
    // DestroyWindow();
    if(SafetyConfirm())
    {//display the modalless dialog box
    CSPView * view=(CSPView *) GetParent();
    assert(view);
    //view->GetDataDialog();
    assert( (view->m_pDataDlg) );
    view->m_pDataDlg->ShowWindow(SW_SHOW);    //异常
    // ::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW); //异常
    }
    // UpdateData(FALSE);
    // OnOK();
    }
      

  18.   

    你m_pPointSet,m_pArcSet是什么变量
    构造函数不要传参数,如果是对话框类的变量需要传入值的话可以这样做
    void CSPView::GetDataDialog(void)
    {
    if(NULL==m_pDataDlg) //have not created the dialog box
    {
    m_pDataDlg = new CDataDialog();
    m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
    }
         m_pDataDlg->m_pPointSet = m_pPointSet;
              m_pDataDlg->m_pArcSet = m_pArcSet;
    }
    还有这里:
    m_pPathDlg = new CPathDialog(m_pPointSet,m_pArcSet,m_pDataDlg);也是一样
      

  19.   

    to: wxfy1977(我心飞扬) 
    m_pPointSet,m_pArcSet是指向ODBC数据集的指针。具体:
    class CPointSet:public CRecordSet{
    class CArcSet:public CRecordSet{
    在CSPView.h中定义:
    CPointSet *m_pPointSet;  
    CArcSet *m_pArcSet;
    另外,我对CDataDialog和CPathDialog构造函数进行重载,因此传入了一些参数
    (因为我想在那CSPView,CDataDialog,CPathDialog中都操作数据库数据)
      

  20.   

    我自己已经找到了解决方法了。
    方法一: [前面贴子中已经阐述] 
    不用m_pPasswordDlg (CPasswordDialog *类型)建立非模式对话框,而
    直接建立CPasswordDialog myPasswordDlg; 在CSPView中处理,不会出现异常。具体程序和描述如下:
    void CSPView::OnBnClickeddataedit()
    {GetDataDialog();
    CPasswordDialog myPasswordDlg;    //直接建立临时对话框,而不是用指针new
    if(myPasswordDlg.DoModal() == IDOK)   //这样子就可以。
    {                                //但是如前所述,事件在子对话框 
    //框 CPasswordDialog中处理,就会出错ShowWindow异常。
    //不知道应该如何解释呢??
    if(myPasswordDlg.SafetyConfirm())
    m_pDataDlg->ShowWindow(SW_SHOW);
    }
    }
    方法二:仍然建立非模式对话框。(子对话框)
    但是,改动 此句:CSPView * view=(CSPView *) GetParent();
    变为:CSPView *view=(CSPView *) ( ( (CMainFrame *)GetParent() )->GetActiveView() );
    即可。