修改CDialog模态对话框函数DoModal 使对话框显示可以受WS_VISIBLE风格控制
2010-03-22 21:55
344 查看
调试追踪DoModal的执行过程发现对话框显示的位置在 CWnd::RunModalLoop(DWORD dwFlags)中
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
……
if (bShowIdle)
{
ShowWindow(SW_SHOWNORMAL); //这里显示出来了
UpdateWindow();
bShowIdle = FALSE;
}
而CWnd::RunModalLoop(DWORD dwFlags)没有提供重载接口我们只能修改传入的参数
再返回到DoModal中我们发现 DWORD dwFlags = MLF_SHOWONIDLE;
于是我们修改DWORD dwFlags = 0;// MLF_SHOWONIDLE;
即达到了模态对话框也受WS_VISIBLE风格控制的效果
int CCcDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);
// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);
// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
return -1;
// disable parent (before creating dialog)
HWND hWndParent = PreModal();
//AfxUnhookWindowCreate();
BOOL bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
TRY
{
// create modeless dialog
//AfxHookWindowCreate(this);
if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst))
{
if (m_nFlags & WF_CONTINUEMODAL)
{
// enter modal loop
DWORD dwFlags = 0;// MLF_SHOWONIDLE;
if (GetStyle() & DS_NOIDLEMSG)
dwFlags |= MLF_NOIDLEMSG;
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
}
// hide the window before enabling the parent, etc.
if (m_hWnd != NULL)
SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
}
CATCH_ALL(e)
{
{ e->Delete(); }//DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
// destroy modal window
DestroyWindow();
PostModal();
// unlock/free resources as necessary
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
UnlockResource(hDialogTemplate);
if (m_lpszTemplateName != NULL)
FreeResource(hDialogTemplate);
return m_nModalResult;
// return CDialog::DoModal();
}
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
……
if (bShowIdle)
{
ShowWindow(SW_SHOWNORMAL); //这里显示出来了
UpdateWindow();
bShowIdle = FALSE;
}
而CWnd::RunModalLoop(DWORD dwFlags)没有提供重载接口我们只能修改传入的参数
再返回到DoModal中我们发现 DWORD dwFlags = MLF_SHOWONIDLE;
于是我们修改DWORD dwFlags = 0;// MLF_SHOWONIDLE;
即达到了模态对话框也受WS_VISIBLE风格控制的效果
int CCcDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);
// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);
// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
return -1;
// disable parent (before creating dialog)
HWND hWndParent = PreModal();
//AfxUnhookWindowCreate();
BOOL bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
TRY
{
// create modeless dialog
//AfxHookWindowCreate(this);
if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst))
{
if (m_nFlags & WF_CONTINUEMODAL)
{
// enter modal loop
DWORD dwFlags = 0;// MLF_SHOWONIDLE;
if (GetStyle() & DS_NOIDLEMSG)
dwFlags |= MLF_NOIDLEMSG;
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
}
// hide the window before enabling the parent, etc.
if (m_hWnd != NULL)
SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
}
CATCH_ALL(e)
{
{ e->Delete(); }//DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
// destroy modal window
DestroyWindow();
PostModal();
// unlock/free resources as necessary
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
UnlockResource(hDialogTemplate);
if (m_lpszTemplateName != NULL)
FreeResource(hDialogTemplate);
return m_nModalResult;
// return CDialog::DoModal();
}
相关文章推荐
- 对话框上右下角显示resize icon(可以拖动改变对话框的大小)(在WM_CREATE的时候,增加WS_THICKFRAME风格)
- 销售订单的一个直接修改源程序的地方 MV45AFZZ 可以控制销售订单上的价格显示不显示
- 控制对话框风格的activity的显示大小与位置
- 控制对话框风格的activity的显示大小与位置
- 写了一个将VxWorks的shell打印输出到指定内存中的接口,可广泛用于CLI下的调试函数显示以及故障自动捕获等功能,稍作修改可以适合其它嵌入式OS
- MFC 对话框 调用DoModal() 不显示,要按Alt键才可以
- 销售订单的一个直接修改源程序的地方 MV45AFZZ 可以控制销售订单上的价格显示不显示
- 利用Api函数ShellAboutA可以显示一个与Windows操作系统风格一致的About对话框
- MFC 对话框 调用DoModal() 不显示,要按Alt键才可以
- activity控制对话框风格、显示大小与位置
- 利用Api函数ShellAboutA可以显示一个与Windows风格一致的About对话框
- 制作一个控制台小程序,要求:用户可以在控制到录入学生的姓名,当用户输入quit(不区分大小写)时,程序停止接收用户输入,并且显示出学生个数及姓名
- FastAdmin 添加新字段后,不显示,可以直接去修改对应的js
- 一个可以控制提示框显示为top,bottom,left,right的小方法
- 在PB中控制一条记录是否可以被修改
- 使用fn函数控制页面显示内容
- MFC对话框初始化函数是在哪里?以及如何为MFC的EDIT控件设置默认显示值?
- CentOS 7下修改MySQL5.6(7.0也可以)编码方式 解决中文显示问号
- par函数的xaxt函数-控制x轴刻度的显示
- android修改HOLO对话框风格