VB的ShowInTaskbar功能分析以及用VC的實現 (轉)

gugu99發表於2008-05-26
VB的ShowInTaskbar功能分析以及用VC的實現 (轉)[@more@]

  在VB中想要顯示或隱藏一個視窗在工作列上的按鈕很容易,直接設定一個form的ShowInTabkbar屬性即可。但在SDK中卻不是一件易事,一個視窗在什麼情況下會在工作列上顯示一個按鈕,在什麼情況下不顯示呢?這是有規定的:

0,無論什麼情況,要讓一個視窗在工作列上顯示按鈕的前提是該視窗是可見的.

1.如果一個視窗是頂級視窗(也就是父視窗為NULL,也就是父視窗為桌面視窗),那麼將為它在工作列上建立一個按鈕.(有例外,見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裡的主對話方塊odal之前生成一個隱藏的對話方塊,並將這個視窗的指標儲存在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和生成的都應該有一個隱藏的視窗.

解決方案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可能不支援.

以上三種方案大家可根據情況自行選擇.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章