注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

模式子对话框批量隐藏、显示与关闭的代码  

2010-09-14 17:09:41|  分类: vc界面编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        父窗口弹出一个模式对话框,此时,向父窗口发送最小化消息,父窗口最小化,但是模式子对话框并没有最小化。

        类似地,如果父窗口关闭,子模式对话框将继续存在!如果应用程序退出,子模式对话框还是存在!这就成了比较严重的BUG。事实上,很多软件都存在类似的BUG。

        以往,我的做法是,保留一个模式对话框的指针。弹出模式对话框的时候,给指针赋值,关闭的时候,把指针置为NULL。在程序退出时,判断一下,如果指针不为空,通过对话框指针向对话框发送关闭指令。这样就正常了。

        但是,如果窗口多了,这种做法显然很麻烦。如果,能够获取到指定窗口的模式子窗口的句柄,那不是可以一劳永逸了么?但是,注意:一个窗口可能存在多个模式子窗口!一个窗口同时存在多个并列的模式子窗口很可能导致软件假死(好像是Winzip,或者winRAR存在类似BUG)。

        以下给出一段代码来操作模态子窗口:

 

//操作模态子窗口

/*

版权所有 章永辉,免费商业或个人使用

*/
/*
备注:不推荐使用宏来定义函数,除非特殊情况。
*/
#define DEFINE_FUNCTION_MODUL_DIALOG_DO_IT(command, function_name)  \
\
BOOL CALLBACK g_GetModalChildWindow##function_name(HWND hwnd, LPARAM lParam)\
{\
 /*是否当前进程*/\
 DWORD pid=0;\
 GetWindowThreadProcessId(hwnd, &pid);\
 if (pid!=GetCurrentProcessId())\
 {\
 return TRUE;\
 }\
 \
 /*比较窗口类名*/\
 TCHAR szClassName[MAX_PATH]={0};\
 GetClassName(hwnd, szClassName, sizeof(szClassName)/sizeof(TCHAR));\
 if (_tcscmp(szClassName, _T("#32770")) != 0)\
 {\
 return TRUE;\
 }\
 \
 /*递归比较*/\
 HWND hWndParent = hwnd;\
 HWND hWndT=hWndParent;\
 \
 do\
 {\
 hWndParent = hWndT;\
 \
 if (hWndParent == (HWND)lParam)\
  {\
  command;\
  \
  break;\
  }\
  \
 }\
 while ((::GetWindowLong(hWndParent, GWL_STYLE) & DS_MODALFRAME) &&\
 (hWndT = ::GetParent(hWndParent)) != NULL);\
 \
 return TRUE;\
}\

 

//隐藏模态子窗口
DEFINE_FUNCTION_MODUL_DIALOG_DO_IT((::ShowWindow(hwnd, SW_HIDE)), HideMe)
#define CALL_MODUL_DIALOG_DO_IT_HIDE(hwnd_parent) EnumWindows(g_GetModalChildWindowHideMe, (LPARAM)hwnd_parent); 

/*
调用示例:CALL_MODUL_DIALOG_DO_IT_HIDE(m_hWnd);
*/

//显示模态子窗口
DEFINE_FUNCTION_MODUL_DIALOG_DO_IT(::ShowWindow(hwnd, SW_SHOW), ShowMe)
#define CALL_MODUL_DIALOG_DO_IT_SHOW(hwnd_parent) EnumWindows(g_GetModalChildWindowShowMe, (LPARAM)hwnd_parent); 

/*
调用示例:DEFINE_FUNCTION_MODUL_DIALOG_DO_IT_SHOW(m_hWnd);
*/

//关闭模态子窗口
DEFINE_FUNCTION_MODUL_DIALOG_DO_IT(::SendMessage(hwnd, WM_COMMAND, IDCANCEL, 0), CloseMe)
#define CALL_MODUL_DIALOG_DO_IT_CLOSE(hwnd_parent) EnumWindows(g_GetModalChildWindowCloseMe, (LPARAM)hwnd_parent); 

/*
调用示例:DEFINE_FUNCTION_MODUL_DIALOG_DO_IT_CLOSE(m_hWnd);
*/


//显示或者隐藏模态子窗口
DEFINE_FUNCTION_MODUL_DIALOG_DO_IT(\
 if(IsWindow(hwnd))\
 {\
  if(IsWindowVisible(hwnd))\
  {\
   ::ShowWindow(hwnd, SW_HIDE);\
  }\
  else\
  {\
   ::ShowWindow(hwnd, SW_SHOW);\
  }\
 }\
, \
ShowOrHide)

#define CALL_MODUL_DIALOG_DO_IT_HIDE_OR_SHOW(hwnd_parent) EnumWindows(g_GetModalChildWindowShowOrHide, (LPARAM)hwnd_parent); 

/*
调用示例:CALL_MODUL_DIALOG_DO_IT_HIDE_OR_SHOW(m_hWnd);
*/

 

By: zhanyonhu

  评论这张
 
阅读(1070)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016