VB的ShowInTaskbar功能分析以及用VC的实现

原创 2003年03月18日 08:55:00

  在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可能不支持.

以上三种方案大家可根据情况自行选择.

VB的ShowInTaskbar功能分析以及用VC的实现

  在VB中想要显示或隐藏一个窗口在任务栏上的按钮很容易,直接设定一个form的ShowInTabkbar属性即可。但在SDK中却不是一件易事,一个窗口在什么情况下会在任务栏上显示一个按钮,在什么情况...
  • kingcom_xu
  • kingcom_xu
  • 2003年03月18日 08:55
  • 1513

VB.NET 章鱼哥出品 —入门基础Button控件的使用详解(二)

VB.NET 章鱼哥出品 —入门基础Button控件的使用详解(一)   '作者:章鱼哥,QQ:3107073263 群:309816713            '如有疑问或好的建议...
  • zhangyubishoulin
  • zhangyubishoulin
  • 2014年11月06日 21:14
  • 2122

VB的ShowInTaskbar功能分析以及用VC的实现

?  在VB中想要显示或隐藏一个窗口在任务栏上的按钮很容易,直接设定一个form的ShowInTabkbar属性即可。但在SDK中却不是一件易事,一个窗口在什么情况下会在任务栏上显示一个按钮,在什么情...
  • _foo
  • _foo
  • 2004年08月08日 18:52
  • 2365

VB的ShowInTaskbar功能分析以及用VC的实现 如何隐藏对话框在工具栏上的按钮

在VB中想要显示或隐藏一个窗口在任务栏上的按钮很容易,直接设定一个form的ShowInTabkbar属性即可。但在SDK中却不是一件易事,一个窗口在什么情况下会在任务栏上显示一个按钮,在什么情况下不...
  • ponydph
  • ponydph
  • 2006年10月25日 14:21
  • 1958

汽车系统(VB编写)

  • 2012年01月08日 21:57
  • 1.15MB
  • 下载

Vb 与 Vc 的区别

一:简单的对比 VB是由Basic语言演化而来的VisualBasic,意思是可视化Basic,而VC是由C++语言演化而来的VisualC++,意思是可视化C++,VB功能没有VC强大,但是很容易...
  • guomutian911
  • guomutian911
  • 2014年10月21日 11:57
  • 2683

VB中调用VC++开发的DLL

转自:http://lanshanlhy.blog.163.com/blog/static/302294762010112832031218/ 再谈在VB中调用VC++开发的DLL  再谈...
  • xl19900502
  • xl19900502
  • 2016年02月22日 11:17
  • 577

VB.NET实现应用程序自动更新1

VB.NET实现应用程序自动更新12008/08/02 12:51Imports SystemImports System.NetImports System.TextImports System.T...
  • sqlmlm
  • sqlmlm
  • 2008年10月15日 15:53
  • 1955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB的ShowInTaskbar功能分析以及用VC的实现
举报原因:
原因补充:

(最多只允许输入30个字)