VB的ShowInTaskbar功能分析以及用VC的实现 如何隐藏对话框在工具栏上的按钮
2006-10-25 14:21
766 查看
在VB中想要显示或隐藏一个窗口在任务栏上的按钮很容易,直接设定一个form的ShowInTabkbar属性即可。但在SDK中却不是一件易事,一个窗口在什么情况下会在任务栏上显示一个按钮,在什么情况下不显示呢?这是有规定的:
0,无论什么情况,要让一个窗口在任务栏上显示按钮的前提是该窗口是可见的.
1.如果一个窗口是顶级窗口(也就是父窗口为NULL,也就是父窗口为桌面窗口),那么Windows将为它在任务栏上创建一个按钮.(有例外,见3)
2.如果一个窗口不是顶级窗口,但有WS_EX_APPWINDOW风格,那么Windows将为它在任务栏上创建一个按钮,否则不会有相应的任务栏按钮.
3.如果一个窗口是顶级窗口,但加了WS_EX_TOOLWINDOW,并去掉WS_EX_APPWINDOW风格,那么Windows不会为它在任务栏上创建一个按钮.
4....
知道了这些规则,你就能随心所欲的控制你的窗口是否要ShowInTaskbar了,下面给出一个问题和解决方案.
问题:在MFC中一个基于对话框的工程,想要主对话框不在任务栏上显示按钮,该如何做?
解决方案1:
根椐上面的第三条规则,给该对话框加上WS_EX_TOOLWINDOW风格并去掉WS_EX_APPWINDOW风格.
代码:
在对话框类的OnInitDialog函数里加入:
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,SWP_FRAMECHANGED);
备注:这种方法会有一个缺点,你的对话框的标题将会是一个小标题,所以大多数人不会采用这种方法.
解决方案2:
根椐上面的第二条规则,将该对话框变为非顶级窗口并去掉WS_EX_APPWINDOW,在app类的initinstance里的主对话框domodal之前生成一个隐藏的对话框,并将这个窗口的指针保存在CWinApp类的m_pMainWnd成员变量中,以后DoModal的对话框都将是它的子窗口.
代码:
在app的initinstance函数中加入以下加注释的代码
BOOL CTestDlgApp::InitInstance()
{
...
CFrameWnd mainWnd; //生成一个框架窗口对象
mainWnd.Create(NULL,"aa");//生成窗口,不带ws_visible,也就是说不会显示出来
CTestDlgDlg dlg;
m_pMainWnd = &mainWnd;//将这个隐藏窗口设为主窗口
int nResponse = dlg.DoModal();
...
}
在对话框的OnInitDialog里加入 ModifyStyleEx(WS_EX_APPWINDOW,0);以便出掉WS_EX_APPWINDOW。
备注:这种方法较为麻烦,不过很实用,据我观察,C++Builder和Delphi生成的程序都应该有一个隐藏的窗口.
解决方案3:
在IE版本为4.0以上的系统中有一个叫ITaskbarList的接口,故名思义,这个接口可用来控制任务栏上的按钮是否显示,你只要给出一个窗口的句柄和是否显示,完全不需考虑上面那此乱七八糟的规则.
代码:
void ShowInTaskbar(HWND m_hWnd,BOOL bshow)
{
//在app的InitInstance中加入::CoInitialize(NULL);
HRESULT hr;
ITaskbarList *pTaskbarList;
hr=CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,
IID_ITaskbarList,(void**)&pTaskbarList);
pTaskbarList->HrInit();//MSDN中说在使用这个接口的其它方法之前得调用这个方法以便做一些初始化动作,我发现不调用这个方法也可以的.
if(bshow){
pTaskbarList->AddTab(m_hWnd);
}
else{
pTaskbarList->DeleteTab(m_hWnd);
}
pTaskbarList->Release();
//在app的ExitInstance中加入::CoUninitialize();
}
在需要的时候调用这个函数就可以了,第一个参数为窗口的句柄,第二个参数指明是在任务栏上是否显示按钮.
备注:这种方法功能强大,使用也较为简便,不过低版本的windows可能不支持.
以上三种方案大家可根据情况自行选择.
0,无论什么情况,要让一个窗口在任务栏上显示按钮的前提是该窗口是可见的.
1.如果一个窗口是顶级窗口(也就是父窗口为NULL,也就是父窗口为桌面窗口),那么Windows将为它在任务栏上创建一个按钮.(有例外,见3)
2.如果一个窗口不是顶级窗口,但有WS_EX_APPWINDOW风格,那么Windows将为它在任务栏上创建一个按钮,否则不会有相应的任务栏按钮.
3.如果一个窗口是顶级窗口,但加了WS_EX_TOOLWINDOW,并去掉WS_EX_APPWINDOW风格,那么Windows不会为它在任务栏上创建一个按钮.
4....
知道了这些规则,你就能随心所欲的控制你的窗口是否要ShowInTaskbar了,下面给出一个问题和解决方案.
问题:在MFC中一个基于对话框的工程,想要主对话框不在任务栏上显示按钮,该如何做?
解决方案1:
根椐上面的第三条规则,给该对话框加上WS_EX_TOOLWINDOW风格并去掉WS_EX_APPWINDOW风格.
代码:
在对话框类的OnInitDialog函数里加入:
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,SWP_FRAMECHANGED);
备注:这种方法会有一个缺点,你的对话框的标题将会是一个小标题,所以大多数人不会采用这种方法.
解决方案2:
根椐上面的第二条规则,将该对话框变为非顶级窗口并去掉WS_EX_APPWINDOW,在app类的initinstance里的主对话框domodal之前生成一个隐藏的对话框,并将这个窗口的指针保存在CWinApp类的m_pMainWnd成员变量中,以后DoModal的对话框都将是它的子窗口.
代码:
在app的initinstance函数中加入以下加注释的代码
BOOL CTestDlgApp::InitInstance()
{
...
CFrameWnd mainWnd; //生成一个框架窗口对象
mainWnd.Create(NULL,"aa");//生成窗口,不带ws_visible,也就是说不会显示出来
CTestDlgDlg dlg;
m_pMainWnd = &mainWnd;//将这个隐藏窗口设为主窗口
int nResponse = dlg.DoModal();
...
}
在对话框的OnInitDialog里加入 ModifyStyleEx(WS_EX_APPWINDOW,0);以便出掉WS_EX_APPWINDOW。
备注:这种方法较为麻烦,不过很实用,据我观察,C++Builder和Delphi生成的程序都应该有一个隐藏的窗口.
解决方案3:
在IE版本为4.0以上的系统中有一个叫ITaskbarList的接口,故名思义,这个接口可用来控制任务栏上的按钮是否显示,你只要给出一个窗口的句柄和是否显示,完全不需考虑上面那此乱七八糟的规则.
代码:
void ShowInTaskbar(HWND m_hWnd,BOOL bshow)
{
//在app的InitInstance中加入::CoInitialize(NULL);
HRESULT hr;
ITaskbarList *pTaskbarList;
hr=CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,
IID_ITaskbarList,(void**)&pTaskbarList);
pTaskbarList->HrInit();//MSDN中说在使用这个接口的其它方法之前得调用这个方法以便做一些初始化动作,我发现不调用这个方法也可以的.
if(bshow){
pTaskbarList->AddTab(m_hWnd);
}
else{
pTaskbarList->DeleteTab(m_hWnd);
}
pTaskbarList->Release();
//在app的ExitInstance中加入::CoUninitialize();
}
在需要的时候调用这个函数就可以了,第一个参数为窗口的句柄,第二个参数指明是在任务栏上是否显示按钮.
备注:这种方法功能强大,使用也较为简便,不过低版本的windows可能不支持.
以上三种方案大家可根据情况自行选择.
相关文章推荐
- VB的ShowInTaskbar功能分析以及用VC的实现
- VB的ShowInTaskbar功能分析以及用VC的实现
- vc 一组单选按钮互斥的具体实现!!以及mfc内部如何实现具体的分组!!
- VB实现右键扩展菜单以及按钮触发扩展菜单功能
- 在页面中,我们经常看到,一个button按钮,如果属标点击,就会触发一个窗口的显示,如果二次点击并可以隐藏,那么如何通过JAVA配合html来实现这一功能呢?
- vc6实现魔兽3显示敌对单位,以及去迷雾,显示隐藏单位等功能
- 如何在对话框中实现文件拖放功能
- 关于如何使用block实现和协议一样的功能分析
- 如何用WebSocket实现一个简单的聊天室以及单聊功能
- 单击按钮显示新窗体,再按下新窗体隐藏功能的实现
- vc循序渐进实现仿QQ界面(四):圆形按钮与工具栏自绘
- VC MFC对话框中按钮背景色以及大小设置
- 如何实现日志的集中化存储以及使用loganalyzer做日志分析 推荐
- 如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定
- listview 实现微信删除功能向左移动item出现隐藏的删除按钮功能终于实现了,分享总结一下。(跟微信删除一样额)
- 在mfc中,如何设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体 分类: MFC
- iphone里如何实现像图片浏览那样的自动隐藏和导航条和工具栏
- 如何实现工具栏的下拉箭头按钮
- 如何实现点一下对话框外面的区域,自动隐藏对话框
- 在.NET中如何实现像VB.NET中MSBBOX的功能!?