VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?

2024-11-30 06:26:59
推荐回答(3个)
回答1:

如果是模态对话框就简单了
CxxDlg dlg;
if(dlg.DoModal()==IDOK || dlg.DoModal()==IDCANCEL)
{
//你的代码
}
非模态的话,有两个思路,可以在子对话框关闭的时候给父窗口发送消息
CxxDlg dlg(父对话框的句柄);
if(!dlg.m_hWnd) dlg.Create(IDD_XXX);
dlg.ShowWIndow(SW_SHOW);
子对话框关闭的时候
::SendMessage(父对话框句柄,WM_XX,0,0);
再自定义消息去接收就好了,这种方法还是比较麻烦的

另一种思路是付对话框去监测对话框,但是不要用while,用了while会占满CPU的一个核
用OnTimer去找,
首先启动对话框,并SetTimer(1,100,NULL);//间隔(第二个参数,单位是毫秒)可以改小一点,但貌似最小是10ms,小于10跟10一样
OnTimer()
{
HWND wnd;
wnd=::FindWindow(NULL,_T("子对话框"));
if(wnd)
{
//还在运行
}
else
{
//已经关闭了,可以执行你的代码了
}
}

回答2:

是不是要做启动画面?,下面是我参考别人代码自己整理的笔记
1.定义继承自普通窗口类的启动窗口类,如:
class CSplashWnd : public CWnd
2.截获应用程序的BOOL CJustechApp::InitInstance()消息,在消息响应开头:
CSplashWnd * psplash=new CSplashWnd; //动态分配一个类对象
psplash->ShowWindow(m_nCmdShow); //显示窗口
Sleep(2500); //等待2500ms,即启动窗口显示2500ms
3.在启动窗口创建的时候:
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CenterWindow(); //让窗口居中显示
SetTimer(6,3000,NULL); //设定一个3s的定时器
AnimateWindow(GetSafeHwnd(),1200,AW_BLEND); //窗口显示时的渐隐效果
return 0;
}
4.响应擦除窗口背景的消息:
BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC)
{
HINSTANCE happ=::GetModuleHandle(NULL);
HBITMAP hbit=::LoadBitmap(happ,MAKEINTRESOURCE(IDB_SPLASH));
HDC hdc=::CreateCompatibleDC(pDC->GetSafeHdc());
HBITMAP hbmpOld = (HBITMAP) ::SelectObject(hdc, hbit);
::BitBlt(pDC->GetSafeHdc(),0,0,600,320,hdc,0,0,SRCCOPY);
::SelectObject(hdc,hbmpOld);
::DeleteObject(hbit);
::DeleteDC(hdc);
return CWnd::OnEraseBkgnd(pDC);
}
5.定时时间到后响应:
void CSplashWnd::OnTimer(UINT nIDEvent)
{
KillTimer(6); //关闭定时器
PostMessage(WM_CLOSE); //发送关闭窗口的消息
CWnd::OnTimer(nIDEvent);
}
6.响应关闭窗口的消息:
void CSplashWnd::OnClose()
{
AnimateWindow(GetSafeHwnd(),800,AW_HIDE|AW_BLEND); //关闭窗口时的渐隐效果
CWnd::OnClose();
}

回答3:

这两段分开写。一个函数写现实窗口。然后定义一个函数写while,当关闭窗口时,向子窗口发消息,调用while