http://blog.youkuaiyun.com/kesalin/article/details/4251760
定制任务栏托盘的 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;
- }