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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vc實現ping
- OPC Server示例教程:VC#和VB.NET中的簡單APIServerAPI
- C#/VB.NET 實現Word和ODT文件相互轉換C#
- 【轉載】SAP 系統中STO+VC 技術實現
- Thunk程式的實現原理以及在iOS中的應用iOS
- Collection如何轉成stream以及Spliterator對其操作的實現
- 用VC在區域網實現IP多播通訊
- 應用黑名單以及靜默安裝的實現
- 【Java】跳躍表的實現以及用例測試Java
- Thunk程式的實現原理以及在iOS中的應用(二)iOS
- 原生 JS 實現 HTML 轉 Markdown,以及其實現邏輯JSHTML
- 不適用imrotate 的影像旋轉實現
- vc實現https檔案下載HTTP
- 利用VB 指令碼實現TIA 中介面迴圈計數的功能指令碼
- 求助:EXCEL,VB,實現 CRC16 校驗Excel
- 堆的原理以及實現O(lgn)
- Synchronized的實現原理以及優化synchronized優化
- 紅黑樹的原理以及實現
- 利用wps的com口用python實現excel轉pdfPythonExcel
- 基於VC + MSSQL實現的縣級醫院醫學影像PACSSQL
- 談談 Promise 以及實現 Fetch 的思路Promise
- 用html5實現圖片的旋轉--照片牆HTML
- 用js實現小寫金額轉大寫的方法JS
- RPC模式的介紹以及簡單的實現RPC模式
- SpringSession系列-分散式 session 實現方案及 SpringSession 功能分析SpringGseSession分散式
- 並查集演算法Union-Find的思想、實現以及應用並查集演算法
- Vben-Admin的useForm實現思路詳解,以及實現element版的useFormORM
- 用setjmp和longjmp實現跳轉
- c++中幾種常見的型別轉換。int與string的轉換,float與string的轉換以及string和long型別之間的相互轉換。to_string函式的實現和應用。C++型別函式
- 訊息的即時推送——net實現、websocket實現以及socket.io實現Web
- Android 的滑動分析以及各種實現Android
- Threadlocal的使用以及實現原理總結thread
- ceph的配額功能分析
- vb.net使用GDI+實現掃雷小遊戲遊戲
- 用RecyclerView實現類似支付寶應用圖示拖拽排序以及增刪管理的功能View排序
- VC++ 崩潰處理以及列印呼叫堆疊C++
- 知名VC:蘋果應用商店的規則重要嗎?蘋果
- 用Java實現samza轉換成flinkJava
- 影像旋轉的FPGA實現(一)FPGA