VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?
我现在需要做一个类似于MessageBox的窗口,只不过需要显示图片,所以就自己CreateWindow新建了一个窗口,代码类似这样:{hwndNew=新建窗口...;U...
我现在需要做一个类似于MessageBox的窗口,只不过需要显示图片,所以就自己CreateWindow新建了一个窗口,
代码类似这样:
{
hwndNew=新建窗口...;
UpdateWindow(hwnd);
ShowWindow(hwnd,SW_SHOW);
while(IsWindow(hwndNew))
{
}
其他的代码...
}
但是这样的话,调试的时候会发现程序一直卡在while里面……新窗口也显示不出来,请问该怎么弄才能让窗口显示出来? 展开
代码类似这样:
{
hwndNew=新建窗口...;
UpdateWindow(hwnd);
ShowWindow(hwnd,SW_SHOW);
while(IsWindow(hwndNew))
{
}
其他的代码...
}
但是这样的话,调试的时候会发现程序一直卡在while里面……新窗口也显示不出来,请问该怎么弄才能让窗口显示出来? 展开
3个回答
展开全部
如果是模态对话框就简单了
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
{
//已经关闭了,可以执行你的代码了
}
}
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
{
//已经关闭了,可以执行你的代码了
}
}
展开全部
是不是要做启动画面?,下面是我参考别人代码自己整理的笔记
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();
}
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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-08
展开全部
这两段分开写。一个函数写现实窗口。然后定义一个函数写while,当关闭窗口时,向子窗口发消息,调用while
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询