定制任務(wù)欄托盤(pán)的 dll
羅朝輝(飄飄白云) 2009.06.08
http://www.shnenglu.com/kesalin
(轉(zhuǎn)載時(shí)請(qǐng)注明作者和出處。未經(jīng)許可,請(qǐng)勿用于商業(yè)用途)
源文件下載: 點(diǎn)擊這里
google 項(xiàng)目地址: http://code.google.com/p/luotasktray/
通過(guò)對(duì)這個(gè) dll 進(jìn)行定制(修改圖標(biāo)和插入菜單,很簡(jiǎn)單的替換工作),你就很容易地在新工程中使用定制的任務(wù)欄托盤(pán),這樣就省去了每寫(xiě)一個(gè)桌面程序就要整些桌面托盤(pán)的代碼。而且這個(gè)dll所創(chuàng)建的任務(wù)欄托盤(pán)與主窗口是非阻塞模式的。
效果如圖:
顯示任務(wù)欄托盤(pán):

顯示右鍵菜單:

響應(yīng)右鍵菜單事件:

1,下面來(lái)說(shuō)說(shuō)如何簡(jiǎn)單地通過(guò)修改這個(gè) dll 來(lái)定制自己需要的任務(wù)欄托盤(pán),分兩步:替換圖標(biāo)和修改菜單項(xiàng)。
step 1: 替換圖標(biāo)
打開(kāi) LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的圖標(biāo)就可以了。
// Load icon
hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
// TODO: Load your icon here!
//hIcon = ::LoadIcon((HINSTANCE) GetWindowLongPtr(GWLP_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1));
step 2: 修改菜單項(xiàng)
打開(kāi) LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的菜單項(xiàng)目就可以了。
// create menu
WTL::CMenu popup;
popup.CreatePopupMenu();
// TODO: Insert your menu items here!
int i = 0;
popup.InsertMenu(i++, MF_BYPOSITION, LuoTaskTray::TTM_EXIT, _T("Exit"));
然后你將 LuoTaskTray
編譯生成就可以得到定制好的 dll 和 lib 文件了。
2,如何在自己的工程中使用剛剛生成的 dll 和 lib 文件。
step 1: 包含相關(guān)頭文件,并鏈接庫(kù)文件。
// Include header files for LuoTaskTray.
#include "include/LuoTaskTray.h"
#include "include/LuoTaskTrayImport.h"
// Import lib
#ifdef _DEBUG
#pragma comment(lib, "bin/LuoTaskTray_Debug.lib")
#else
#pragma comment(lib, "bin/LuoTaskTray.lib")
#endif
step 2: 程序開(kāi)始的時(shí)候裝載 dll 并初始化,在程序退出時(shí)清理并卸載 dll。
LuoTaskTray::UActivator* g_pLuoTaskTray;
/**
* @brief : Initialize LuoTaskTray
* @param :
* @return : bool
*/
bool InitLuoTaskTray()
{
HRESULT hRslt = LuoTaskTray::Activate_import(
L"activator",
(void**)&g_pLuoTaskTray);
if (FAILED(hRslt)) {
return false;
}
hRslt = g_pLuoTaskTray->Initialize();
if (FAILED(hRslt)) {
g_pLuoTaskTray->Uninitialize();
g_pLuoTaskTray = NULL;
return false;
}
return true;
}
/**
* @brief : Uninitialize LuoTaskTray
* @param :
* @return :
*/
void UninitLuoTaskTray()
{
if (g_pLuoTaskTray != NULL) {
g_pLuoTaskTray->Uninitialize();
g_pLuoTaskTray = NULL;
}
}
step 3: 創(chuàng)建任務(wù)欄托盤(pán)。
if (g_pLuoTaskTray){
LuoTaskTray::UCreateParam param = {0, };
param.hwnd = *this;
param.CallbackMessage = LuoTaskTray::WM_TASK_TRAY_CALLBACK;
HRESULT hRslt = g_pLuoTaskTray->CreateTaskTray(¶m);
if (SUCCEEDED(hRslt)) {
::EnableWindow(GetDlgItem(ID_TEST), FALSE);
}
}
step 4: 響應(yīng)回調(diào)消息并創(chuàng)建回調(diào)函數(shù)。
MESSAGE_HANDLER(LuoTaskTray::WM_TASK_TRAY_CALLBACK, OnTaskTrayCallback)
LRESULT OnTaskTrayCallback(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int cmd = (int)wParam;
HWND hwnd = (HWND) lParam;
switch (cmd) {
case LuoTaskTray::TTM_EXIT:
::MessageBox(*this, L"Menu Event \"Close\" from Tasktray", L"TrakTray", MB_OK);
CloseDialog(0);
break;
}
return 0;
}
大功告成!