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('&lt;script type="text/javascript"&gt;window.close(); window.parent.location.href = '/';&lt;/script&gt;'). 我收到一个语法错误:/: 'str' 和 'str' 的操作数类型不受支持。在弹出窗口上提交表单后,我收到此错误。错误是指脚本所在的行。知道如何解决吗? 我把评论中的引号弄乱了,最后一个参数应该使用双引号:return HttpResponse('&lt;script type="text/javascript"&gt;window.close(); window.parent.location.href = "/";&lt;/script&gt;') 现在我没有收到任何错误,表单已提交,数据已保存,弹出窗口正常关闭但主页未重新加载。也许我错过了弹出表单上的提交按钮上的任何内容? 自从我上次使用弹出窗口已经有一段时间了,您可能需要设置window.opener.parent.location.href。我已经更新了我的答案以反映这一点。从您的问题中也有点难以分辨的是您如何首先创建弹出窗口,这可能会影响它的行为方式。

以上是关于VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?的主要内容,如果未能解决你的问题,请参考以下文章

asp网页中,如何实现点击按钮弹出对话框,然后点击“确定”关闭窗口,点击“取消”返回?尽快,非常感谢!

abap关闭弹出子窗口

js如何实现关闭js弹出层的窗口

QT下怎么实现一个窗口弹出来然后另外一个窗口关闭

C#应用程序如何不弹出cmd命令行窗口执行

在asp.net中window.showModalDialog弹出窗口,关闭之后怎么刷新主窗口