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);
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);
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
}
直接用::ShowWindow(view->m_pDataDlg->GetSafeHwnd,SW_SHOW)呢?
========================
编译提示:error C2664: “ShowWindow” : 不能将参数 1 从“HWND (void) const”转换为“HWND”我查了一下,该函数是 Window Management的内容。
这要加什么头文件?
应该是::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW);
哦,我少写了()
应该是::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创建窗口,只是没有写出来。
哦,我少写了()
应该是::ShowWindow(view->m_pDataDlg->GetSafeHwnd(),SW_SHOW);
=========================================================
编译通过。调用窗口,有时候窗口没有任何动作;大部分时候也是抛出异常,还是ShowWindow的错误。
****这句话说明如下: “编译通过。调用窗口,有时候窗口没有任何动作;大部分时候也是抛出异常,还是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;
}
直接建立CPasswordDialog myPasswordDlg; 在CSPView中处理,不会出现异常。具体程序和描述如下:void CSPView::OnBnClickeddataedit()
{ GetDataDialog();
CPasswordDialog myPasswordDlg; //直接建立临时对话框,而不是用指针new
if(myPasswordDlg.DoModal() == IDOK) //这样子就可以。
{ //但是如前所述,事件在子对话框
//框 CPasswordDialog中处理,就会出错ShowWindow异常。
//不知道应该如何解释呢??
if(myPasswordDlg.SafetyConfirm())
m_pDataDlg->ShowWindow(SW_SHOW);
}
}
{
UpdateData(TRUE);
DestroyWindow();
if(SafetyConfirm())
{
CSPView * view=(CSPView *) GetParent();
assert(view);
view->GetDataDialog();
assert( (view->m_pDataDlg) ); //正常。
view->m_pDataDlg->ShowWindow(SW_SHOW); ///**调试时异常抛出。
}
//OnOK();这样试试呢?
CPasswordDialog::OnBnClickedOk()
{
UpdateData(TRUE);
DestroyWindow();
if(SafetyConfirm())
{
CSPView * view=(CSPView *) GetParent(); //***已经DestroyWindow()
//***抛出异常。
……
}
//OnOK();
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); 时就会出错。
CSPView::CSPView()
: m_pPointSet(NULL)
, m_pArcSet(NULL)
, m_pDataDlg(NULL)
,m_pPathDlg(NULL)
, m_pPasswordDlg(NULL)
{
// TODO: 在此处添加构造代码}
直接建立CPasswordDialog myPasswordDlg; 在CSPView中处理,不会出现异常。具体程序和描述如下:void CSPView::OnBnClickeddataedit()
{GetDataDialog();
CPasswordDialog myPasswordDlg; //直接建立临时对话框,而不是用指针new
if(myPasswordDlg.DoModal() == IDOK) //这样子就可以。
{ //但是如前所述,事件在子对话框
//框 CPasswordDialog中处理,就会出错ShowWindow异常。
//不知道应该如何解释呢??
if(myPasswordDlg.SafetyConfirm())
m_pDataDlg->ShowWindow(SW_SHOW);
}
}
=======================================================================
判斷正確,我也遇到過,但不知原因,請高手指教
因为我已经测试过,建了一个工程,两个对话框都是在视图类中创建的
能够正常显示出来,没什么问题
视图类构造函数:
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();
}
我也是那样子处理的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();
}
构造函数不要传参数,如果是对话框类的变量需要传入值的话可以这样做
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);也是一样
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中都操作数据库数据)
方法一: [前面贴子中已经阐述]
不用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() );
即可。