VB的ShowInTaskbar功能分析以及用VC的實現 (轉)
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SNMP用VC++6.0實現的方法 (轉)C++
- 用VB實現“百葉窗”的圖形特效 (轉)特效
- VC實現動畫應用兩則 (轉)動畫
- 用VB實現螢幕陰暗操作 (轉)
- 瀏覽資料夾中的圖片(用VB實現) (轉)
- VB實現抽象類 (轉)抽象
- 影像平滑滾動效果的VC實現 (轉)
- 用VC++實現自繪按鈕控制 (轉)
- 用VC實現遠端修改NT帳號 (轉)
- 用VC++實現上網撥號功能 (轉)C++
- 用VC++實現不規則視窗 (轉)C++
- 用JScript實現VB.Net,C#的[委託Delegate]: (轉)JSC#
- 再談在VB中呼叫VC++開發的DLL (轉)C++
- 利用VB實現對IE的呼叫與控制 (轉)
- 用VC 實現圖象漸顯和漸隱 (轉)
- VC中實現多格式影像的靈活轉換 (轉)
- 在VB中實現窗體的動態效果 (轉)
- 用vb實現DES加解密演算法(三)--解密 (轉)解密演算法
- 用vb實現DES加解密演算法(二)--加密 (轉)解密演算法加密
- VB與VC混合程式設計中處理訊息的方法 (轉)程式設計
- 用VB實現DES加解密演算法(一)--定義 (轉)解密演算法
- VC實現對話方塊上資訊的顯示 (轉)
- 在VC中所見即所得列印的簡易實現 (轉)
- VC實現螢幕變暗效果 (轉)
- 學在 VC ,用在 VB - 透過語言看 "世界" (轉)
- VB實現AES(Rijndael)加密的方法加密
- 用vc執行緒模擬實現並行演算法 (轉)執行緒並行演算法
- 一個簡單實用的 vb 加密/解密演算法 (轉)加密解密演算法
- 在VC 5.0中實現基於MFC的元件的本地化 (轉)元件
- 在Vb下實現多執行緒 (轉)執行緒
- VB實現SQL Enterprise Manager功能 (轉)SQL
- 在VB中用API實現多媒體 (轉)API
- MX記錄獲取元件(vb實現) (轉)元件
- VC++中實現程式互斥執行 (轉)C++
- VC++實現撥號上網程式 (轉)C++
- VB5裡面實現VB6的InstrRev()和Split()一樣的替換函式 (轉)函式
- 用VB“破解”有時間限制的程式 (轉)
- VB.net中HOOK的應用(二) (轉)Hook