定制任务栏托盘的 dll
罗朝辉(飘飘白云) 2009.06.08
http://www.cppblog.com/kesalin
(转载时请注明作者和出处。未经许可,请勿用于商业用途)
源文件下载: 点击这里
google 项目地址: http://code.google.com/p/luotasktray/
通过对这个 dll 进行定制(修改图标和插入菜单,很简单的替换工作),你就很容易地在新工程中使用定制的任务栏托盘,这样就省去了每写一个桌面程序就要整些桌面托盘的代码。而且这个dll所创建的任务栏托盘与主窗口是非阻塞模式的。
效果如图:
显示任务栏托盘:
显示右键菜单:
响应右键菜单事件:
1,下面来说说如何简单地通过修改这个 dll 来定制自己需要的任务栏托盘,分两步:替换图标和修改菜单项。
step 1: 替换图标
打开 LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的图标就可以了。
// Load icon
hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
// TODO: Load your icon here!
//hIcon = ::LoadIcon((HINSTANCE) GetWindowLongPtr(GWLP_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1));
step 2: 修改菜单项
打开 LuoTaskTray 工程中的TaskTrayWindow.h,找到如下位置,修改成你自己的菜单项目就可以了。
// 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: 包含相关头文件,并链接库文件。
// 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: 程序开始的时候装载 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;
}
}
step 3: 创建任务栏托盘。
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: 响应回调消息并创建回调函数。
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;
}
大功告成!