MFC dialog有关的问题请大神帮助!!!
我的InitInstance()如下:
BOOL CATSSimL3App::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
//INITCOMMONCONTROLSEX InitCtrls;
//InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
//InitCtrls.dwICC = ICC_WIN95_CLASSES;
//InitCommonControlsEx(&InitCtrls);
//CWinApp::InitInstance();
AfxEnableControlContainer();
// 初始化 OLE 库
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
WSADATA wsdata;
WSAStartup(0x0202,&wsdata);
#ifdef _AFXDLL
Enable3dControls();// Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();// Call this when linking to MFC statically
#endif
//AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU)
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
COleDateTime deadline(2017,9,13,0,0,0);//试用期限
if( g_SystemTime > deadline )
{
//DeleteFile("BJLine1(0723)");
exit(1);
}
//g_nWorkMode=WORKMODE_CLIENT;
//g_nWorkMode=WORKMODE_CLIENT_EXTRA;
g_nWorkMode=WORKMODE_HMI;if( g_nWorkMode == WORKMODE_SERVER ) //服务器端
{
g_bDemo = TRUE; //演示模式
CLoginDlg dlg;
if(IDCANCEL==dlg.DoModal())
return false;
}
if( g_nWorkMode == WORKMODE_HMI) //服务器端
{
g_bDemo = TRUE; //演示模式
CHMIDlg dlg;
dlg.DoModal();
}else if( g_nWorkMode == WORKMODE_CLIENT || g_nWorkMode==WORKMODE_CLIENT_HIGH) //客户端
{
g_bDemo = true; //演示模式
CLoginTDlg dlg;
if(IDCANCEL==dlg.DoModal())
return false;
}
else if( g_nWorkMode == WORKMODE_ALONE ) //单机版
{
//登陆对话框
// CDialogLogin LoginDlg;
// if (LoginDlg.DoModal()!=IDOK)
// {
// exit(0);
// }
g_bDemo = false;
/*CSigleLogin dlg;
if(IDCANCEL==dlg.DoModal())
return false;*/
}
else if( g_nWorkMode == WORKMODE_CLIENT_EXTRA )
{
g_bDemo = true;
//全屏版本
}
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CATSSimL3Doc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CATSSimL3View));
if (!pDocTemplate)
return FALSE;
pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE);
AddDocTemplate(pDocTemplate);
// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
if( g_nWorkMode == WORKMODE_CLIENT )
{
m_pMainWnd->ShowWindow( SW_HIDE );
}
else
{
m_pMainWnd->ShowWindow(SW_SHOW);
}
m_pMainWnd->UpdateWindow();
if( g_nWorkMode == WORKMODE_SERVER )
{
CWinApp::OpenDocumentFile(L"NJLine1");
}
else if(g_nWorkMode==WORKMODE_CLIENT)
{
CWinApp::OpenDocumentFile(L"NJLine1(LOW)");//全屏版本
}
else if (g_nWorkMode==WORKMODE_CLIENT_EXTRA)
{
CWinApp::OpenDocumentFile(L"NJLine1(DP)");
}
if( g_nWorkMode == WORKMODE_HMI )
{
CWinApp::OpenDocumentFile(L"NJLine1");
}
switch(g_nWorkMode) {
case WORKMODE_SERVER:
{
m_pMainWnd->SetTimer( BROADCASTTIMER, 400, NULL ); //广播数据时钟
if( g_bPortDemo )
m_pMainWnd->SetWindowText(_T("控制中心行车调度员工作站【停车场】"));
else
m_pMainWnd->SetWindowText(_T("控制中心行车调度员工作站"));
break;
}
case WORKMODE_CLIENT:
{
CPoint position = g_pView->GetScrollPosition();
g_bIsSimulating = true; //接收广播线程:启动处理数据
switch (g_nGroup)
{
case WS_ATZX:
case WS_YT:
break;
case WS_ZS:
case WS_XH:
position.x=position.x+965;
break;
case WS_ADM:
position.x=position.x+2190;
break;
case WS_ZHM:
position.x=position.x+3400;
break;
case WS_XJK:
case WS_SSJ:
case WS_ZFY:
case WS_ZJL:
position.x=position.x+4580;
break;
case WS_GL:
case WS_XWM:
case WS_XMF:
position.x=position.x+5950;
break;
case WS_NJZ:
case WS_HS:
position.x=position.x+7300;
break;
case WS_MGQ:
position.x=position.x+8137;
break;
}
g_pView->ScrollToPosition( position );
g_pView->EnableScrollBar(SB_BOTH,ESB_DISABLE_BOTH);
break;
}
case WORKMODE_ALONE:
{
m_pMainWnd->SetTimer( BROADCASTTIMER, 400, NULL ); //启动录像时钟
m_pMainWnd->SetWindowText(_T("南京地铁1号线 站场图调度台2:在线模式自动调整——"));
break;
}
case WORKMODE_CLIENT_EXTRA:
{
g_bIsSimulating = true; //接收广播线程:启动处理数据
m_pMainWnd->SetWindowText(_T("北京地铁1号线--控制中心大屏工作站"));
break;
}
case WORKMODE_CLIENT_HIGH:
{
//g_bIsSimulating=true; //接收广播线程:启动处理数据
m_pMainWnd->SetWindowText(_T("北京地铁1号线--调度长工作站"));
break;
}
case WORKMODE_HMI:
{
//未写
break;
}
}
SetCmdView2BtnName(NULLOperStr,NULL_btnName);//加载命令按钮
CString str;
m_pMainWnd->GetWindowText(str);
m_pMainWnd->SetWindowText(str+" 用户:未登陆");
// 仅当具有后缀时才调用 DragAcceptFiles
// 在 SDI 应用程序中,这应在 ProcessShellCommand 之后发生
return TRUE;
}
重要的部分我以红色标注!
然后程序进入Dialog.......在这个dialog中我放了一个按钮,按钮的点击事件如下:
void CHMIDlg::OnBnClickedSys()
{
// TODO: 在此添加控件通知处理程序代码
static bool bln=false;
if (!bln)
bln=true;
else
return;
CMainFrame *pMainFrm=(CMainFrame*)AfxGetMainWnd();
/*
if(pMainFrm->StartServices())
{
CDialog::OnOK();
}
else
{
MessageBox(L"启动服务错误!可能已经启动",L"ATS仿真教学系统",MB_ICONERROR);
return;
}
*/
UINT nGrp=WS_CENTRA;
//初始化服务器用户信息
TCHAR buf[MAX_PATH];
DWORD dw=MAX_PATH;
CString strComName;
GetComputerName(buf, &dw);
strComName.Format(L"%s",buf);
pMainFrm->InitUserInfo( nGrp, strComName );
pMainFrm->SetTimer( BROADCASTTIMER, 400, NULL ); //注销后重启
pMainFrm->ShowWindow(SW_SHOW);
//CHMIDlg::OnOK();
}
问题就出在我最后一行的注释:CHMIDlg::OnOK();
如果没有CHMIDlg::OnOK()这句话...
if( g_nWorkMode == WORKMODE_HMI) //服务器端
{
g_bDemo = TRUE; //演示模式
CHMIDlg dlg;
dlg.DoModal();
}
就不能退出.....那儿哦下面的窗口就显示不出来.....
有CHMIDlg::OnOK()这样一句。InitInstance()下面的窗口就可以执行了,窗口也可以显示。但是我的dialog就关掉了......关键的关键我现在就想让Dialog和窗口共存啊,就像非模态那样!
我应该要怎么做啊..... dialog MFC
[解决办法]
都DoModal了还非模态?