罗朝辉(飘飘白云)

关注嵌入式操作系统,移动平台,图形开发。-->加微博 ^_^

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  85 随笔 :: 0 文章 :: 169 评论 :: 0 Trackbacks

 

定制任务栏托盘的 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(&param);
            
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;
    }

大功告成!

posted on 2009-06-08 20:47 罗朝辉 阅读(1918) 评论(4)  编辑 收藏 引用 所属分类: Windows

评论

# re: 定制任务栏托盘的 dll 2009-06-08 22:58 xiao si le
就这个2b东西还把原代码藏起来,真是笑掉大牙了。  回复  更多评论
  

# re: 定制任务栏托盘的 dll 2009-06-08 23:51 罗朝辉
@xiao si le

阻塞模式的写两个函数就搞定,是没什么好说的;非阻塞模式的你要是有好办法不妨赐教。犯不着在这里满地找牙了  回复  更多评论
  

# re: 定制任务栏托盘的 dll 2009-06-09 07:57 Pear
请教个,非阻塞模式是指用个代理窗口接收托盘消息然后PostMessage?  回复  更多评论
  

# re: 定制任务栏托盘的 dll 2009-06-09 09:02 罗朝辉
@Pear

思路是这样的,用单独的线程处理代理过程。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理