定制任务栏托盘的 dll
罗朝辉(飘飘白云) 2009.06.08
http://www.cppblog.com/kesalin
(转载时请注明作者和出处。未经许可,请勿用于商业用途)
源文件下载: 点击这里
google 项目地址: http://code.google.com/p/luotasktray/
通过对这个 dll 进行定制(修改图标和插入菜单,很简单的替换工作),你就很容易地在新工程中使用定制的任务栏托盘,这样就省去了每写一个桌面程序就要整些桌面托盘的代码。而且这个dll所创建的任务栏托盘与主窗口是非阻塞模式的。
效果如图:
显示任务栏托盘:
响应菜单事件:
如何定制自己的 dll?
分两步,替换图标和替换菜单。
第一步,替换图标。
打开 LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的图标就可以了。
// Load icon hIcon = ::LoadIcon(NULL, IDI_APPLICATION); // TODO: Load your icon here! //hIcon = ::LoadIcon((HINSTANCE) GetWindowLongPtr(GWLP_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1));
第二步,替换菜单。
打开 LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的菜单项目就可以了。
// TODO: Insert your menu items here! int i = 0; popup.InsertMenu(i++, MF_BYPOSITION, LuoTaskTray::TTM_EXIT, _T("Exit"));
如何使用定制的 dll?
第一步,包含头文件,导入 lib 。
// 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
第二步,载入dll 并初始化,然后在程序退出时,清理,并卸载 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; } }
第三步,创建任务栏托盘。
if (g_pLuoTaskTray){ LuoTaskTray::UCreateParam param = {0, }; param.hwnd = *this; param.CallbackMessage = LuoTaskTray::WM_TASK_TRAY_CALLBACK; // callback message HRESULT hRslt = g_pLuoTaskTray->CreateTaskTray(¶m); if (SUCCEEDED(hRslt)) { } }
第四步,相应回调消息(菜单消息)
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: // do something break; } return 0; }