首页 > 其他 > 详细

模拟doModal对话框

时间:2018-08-11 16:08:07      阅读:133      评论:0      收藏:0      [点我收藏+]
在DLL中封装了一个非模态对话框窗口,但是在运行时希望能阻塞主线程,但是不阻塞界面

DWORD WINAPI doModal(LPVOID p)
{//线程函数
	INT  i = 0;
	while (1)
	{ 
		i++;
		Sleep(30);
		if (i == 200)break;
		static MSG msg;
		if (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			AfxGetApp()->PumpMessage();
		}
	}

	return 0;
}

void DoEvent()
{//分法消息
	MSG msg;
	if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  //取消息,检索应用程序的消息队列,PM_REMOVE取过之后从消息队列中移除  
	{
		//发消息  
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
}

extern "C"  __declspec(dllexport) VOID  __stdcall  CreateMsgBox(CWnd * parent)
{//创建窗口
	CScale3DCMessageBoxDlg  *pDlgMsgBox = new CScale3DCMessageBoxDlg ;
	pDlgMsgBox->Create(IDD_DIALOG1, parent);
	pDlgMsgBox->ShowWindow(SW_SHOW);
        //创建线程
	HANDLE hThread[1];
	DWORD  threadId;
	hThread[0] = CreateThread(NULL, 0, doModal, 0, 0, &threadId);

	DWORD dwRet;
	DoEvent();
	do
	{
		dwRet = ::MsgWaitForMultipleObjects(1, hThread, FALSE, INFINITE, QS_ALLINPUT);
		if (dwRet != WAIT_OBJECT_0)
		{
			DoEvent();
		}
	} while ((dwRet != WAIT_OBJECT_0) && (dwRet != WAIT_FAILED));
}


模拟doModal对话框

原文:http://blog.51cto.com/9233403/2157994

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!