VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?相关的知识,希望对你有一定的参考价值。
我现在需要做一个类似于MessageBox的窗口,只不过需要显示图片,所以就自己CreateWindow新建了一个窗口,
代码类似这样:
{
hwndNew=新建窗口...;
UpdateWindow(hwnd);
ShowWindow(hwnd,SW_SHOW);
while(IsWindow(hwndNew))
其他的代码...
}
但是这样的话,调试的时候会发现程序一直卡在while里面……新窗口也显示不出来,请问该怎么弄才能让窗口显示出来?
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
//已经关闭了,可以执行你的代码了
参考技术A 是不是要做启动画面?,下面是我参考别人代码自己整理的笔记
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();
参考技术B 这两段分开写。一个函数写现实窗口。然后定义一个函数写while,当关闭窗口时,向子窗口发消息,调用while
如何关闭弹出窗口并重定向到 Django 视图中的另一个页面?
【中文标题】如何关闭弹出窗口并重定向到 Django 视图中的另一个页面?【英文标题】:How can I close a popup and redirect to another page in a Django View? 【发布时间】:2013-02-08 22:35:14 【问题描述】:我有一个处理表单的弹出窗口。单击按钮后,我需要关闭弹出窗口并返回主页面。 如何在我的 Django 视图中执行这两个操作?
def InsertPopup (request):
if request.method == 'POST':
form = CustomerForm(request.POST)
if form.is_valid():
form.save(True)
return HttpResponse('<script type="text/javascript">window.close()</script>')
此代码工作正常,但在“window.close”脚本之后,我想将焦点重定向/重新回到主页上,该主页应显示更新的数据。 非常感谢您的帮助。
【问题讨论】:
【参考方案1】:这并不是 Django 特有的。您可以在关闭弹窗后通过 JavaScript 设置位置。
window.opener.parent.location.href = "/";
【讨论】:
如果你停留在上面的例子中,直接在 window.close() 之后应该可以工作:return HttpResponse('<script type="text/javascript">window.close(); window.parent.location.href = '/';</script>')
.
我收到一个语法错误:/: 'str' 和 'str' 的操作数类型不受支持。在弹出窗口上提交表单后,我收到此错误。错误是指脚本所在的行。知道如何解决吗?
我把评论中的引号弄乱了,最后一个参数应该使用双引号:return HttpResponse('<script type="text/javascript">window.close(); window.parent.location.href = "/";</script>')
。
现在我没有收到任何错误,表单已提交,数据已保存,弹出窗口正常关闭但主页未重新加载。也许我错过了弹出表单上的提交按钮上的任何内容?
自从我上次使用弹出窗口已经有一段时间了,您可能需要设置window.opener.parent.location.href
。我已经更新了我的答案以反映这一点。从您的问题中也有点难以分辨的是您如何首先创建弹出窗口,这可能会影响它的行为方式。以上是关于VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?的主要内容,如果未能解决你的问题,请参考以下文章