开场白

本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图。

程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单。

程序托盘图标设置

我会用尽可能清晰明了的步骤介绍方式来讲述,我假设大家已经动手写了属于自己的windows窗体,刚学习win32的朋友可以看一下我之前的博客,有介绍如何从头创建属于自己的第一个windows窗口,也可以直接参照本文末尾贴出的完整代码做一些参考。如果大家觉得其他方式更好或者对讲述不理解的可以评论或者发送给我的邮箱believing_dan@hotmail.com,QQ382128698.

步骤1:声明托盘图标对象并给关键成员赋值。

步骤2:通知windows在右下角区域添加图标。

步骤3:处理托盘图标的左键点击和右键点击消息。

步骤1/2的代码:

        void NotifySwitch(HWND hWND,TCHAR operation[4])
{
if(!strncmp(operation, TEXT("MIN"), 3))
{
                //声明变量并初始化
NOTIFYICONDATA nID = {};
                //关联的托盘图标资源,图标需要是16*16或者32*32像素的                                                       
nID.hIcon = (HICON)LoadImage(NULL, TEXT("notify.ico"), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);     
//托盘图标的提示语,即鼠标放在上面会弹出的提示
                strncpy_s(nID.szTip, TEXT("自制锁屏软件卖萌中"), sizeof(TEXT("自制锁屏软件卖萌中")));          
//托盘图标关联的窗口
                nID.hWnd = hWND;                                                                               
//应用程序只有一个托盘图标的话可以随便设
                nID.uID = 1;                                                                                     
//托盘图标的类型,详解见MSDN 
                nID.uFlags = NIF_GUID | NIF_ICON | NIF_MESSAGE | NIF_TIP;                                         
//托盘图标关联的消息ID,托盘的左击和右击消息的消息ID就是它
                nID.uCallbackMessage = WM_MINMAXNotify;                                                            
//通知windows添加一个托盘图标,看参数就知道啦
                Shell_NotifyIcon(NIM_ADD, &nID);                                                               
}

步骤3的代码,即如何处理托盘关联的消息。

再次假设大家已经有了自己的windows窗体,完整代码参考本文最后贴出的代码。

case WM_MINMAXNotify:
switch(lparam)
{
case WM_LBUTTONDOWN:
MessageBox(NULL, TEXT("Recv notify icon message"), TEXT("notify"), MB_ICONHAND);
break;
case WM_RBUTTONDOWN:
POINT pt;
GetCursorPos(&pt);
HMENU hMenu;
hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING , IDM_FIR, "秘籍");
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenu, MF_STRING, IDM_SEC, TEXT("打怪"));
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenu, MF_STRING, IDM_THI, TEXT("补给"));
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, NULL, hwnd, NULL);
break;
}
break;

是不是太简单了!呵呵,就这么简单,在windows的窗体处理函数中增加一个case处理托盘关联的消息,鼠标对托盘的动作可以通过lparam参数来获取,这里我处理了左键和右键的单击消息,左键单击弹出一个提示框,右键单击托盘......好嘛,我已经漏题了,没错,右键的处理就是添加一个弹出菜单。

增加右键弹出菜单

步骤1:创建一个PopMenu对象。

步骤2:为新增加的弹出菜单增加菜单项。

步骤3:显示新增加的菜单。

步骤4:处理菜单项的消息。

又用4步就搞定了这么实用的技巧,是不是小激动呢?尽管前面已经漏题了,还是讲一下代码吧。

创建一个弹出菜单的HMENU句柄,菜单分很多种,需要用对应的创建API

HMENU hMenu = CreatePopupMenu();

插入一个菜单项,并给菜单项起一个字符名称,这里必须设置菜单项的类型是MF_STRING,并给菜单项关联一个ID

AppendMenu(hMenu, MF_STRING , IDM_FIR, "秘籍");

插入一个分隔符,让菜单更好看,啥?没错,就是更好看一点

AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);

对比一下前面的截图,不一样的地方就是分隔符在搞鬼了。

获取到当前的鼠标位置并显示刚创建的弹出菜单,这里有一个小技巧,为什么不把弹出菜单和当前窗口关联起来呢,这样点选菜单后就会自动销毁菜单了。

POINT pt;

GetCursorPos(&pt);

TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, NULL, hwnd, NULL);

弹出菜单的响应消息属于WM_COMMAND命令系列,通过wparam可以区分点击的菜单项。

case WM_COMMAND:

switch (wparam)

{

case IDM_FIR:

MessageBox(NULL, TEXT("Recv popup menu idm_fir message"), TEXT("Popup"), MB_ICONINFORMATION);

break;

case IDM_SEC:

MessageBox(NULL, TEXT("Recv popup menu idm_sec message"), TEXT("Popup"), MB_ICONASTERISK);

break;

case IDM_THI:

MessageBox(NULL, TEXT("Recv popup menu idm_thi message"), TEXT("Popup"), MB_ICONEXCLAMATION);

break;

default:

break;

}

break;

源代码链接说明:完整代码是还在完善中的一个锁屏软件代码,可能要费些功夫去寻找一下本文介绍的功能,当然也可能会对大家有一些额外的帮助,下面是锁屏软件的截图,中间的妹子可是会眨眼卖萌的哟,子窗口会逐渐漂移,碰到屏幕边缘会反弹回来。

锁屏软件持续更新中,欢迎大家关注我的博客。

代码及示例 http://download.csdn.net/detail/hd770c/6920757

win32进阶之路:程序托盘图标+右键弹出菜单的更多相关文章

  1. vc++ 如何添加右键弹出菜单

    一.创建新工程 二.编辑菜单资源 1.添加菜单 按"Ctrl+R",双击"Menu"图标 2.于菜单编辑器内编辑菜单 四.添加代码(红色部分) void CCM ...

  2. DirectUI界面编程(六)实现右键弹出菜单

    本节向大家介绍一下右键弹出菜单是如何实现的.效果如下,在窗口中点击鼠标右键弹出菜单,点击菜单项能够响应菜单点击事件. 使用Duilib库实现的弹出菜单,实际上也是一个Windows窗口,因此我们需要创 ...

  3. Vue2的右键弹出菜单(vue-contextmenu)

    给大家推荐一个基于Vue2的右键弹出菜单插件,支持单一SPA页面以及可以在循环绑定中使用. 项目地址为:https://github.com/chIIC/vue-...demo1: 父组件绑定右键事件 ...

  4. 关于MFC主菜单和右键弹出菜单

    一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...

  5. SWT中的Tree中 添加右键弹出菜单

    先看一下效果: 如图:在树上单击鼠标右键会弹出 弹出式菜单.做法其实很简单,先做一个树: final TreeViewer treeViewer = new TreeViewer(group, SWT ...

  6. 微信小程序动画之弹出菜单

    用微信小程序做了一个动画,效果如上图: 代码: js: Page({ data: { isPopping: false, animPlus: {}, animCollect: {}, animTran ...

  7. Win32建立右键弹出菜单(PopMenu)

    自定义右键菜单: #ifndef _CONTEXTMENU_H_ #define _CONTEXTMENU_H_ #include <windows.h> //动态菜单 #define I ...

  8. win32 右键弹出菜单

    #define  CW_ABOUT  100 #define  CW_DOCUMENT 200 POINT t; GetCursorPos(&t); HMENU hMenu,hPopupMen ...

  9. js+css实现带缓冲效果右键弹出菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Jstl标签的使用

    一. 配置 JSTL 包括两个 JAR 文件, jstl.jar 和 standard.jar .是什么没有必要管,重在应用( 1+1 ? =2 ,我们没有必要深究,只需要知道这么用就行.). 原文引 ...

  2. iOS UIWebView加载时添加进度条

    标注:此框架仅适合UIWebView  对iOS8后新出的WKWebView不适用,当然,你可以尝试修改框架里的几个代理方法. 框架是:NJKWebViewProgress 导入头文件 #import ...

  3. Codeforces Round #333 (Div. 2) C. The Two Routes flyod

    C. The Two Routes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/602/pro ...

  4. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) B. Bear and Blocks 水题

    B. Bear and Blocks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/573/pr ...

  5. 【VMware混合云】应用为王

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 你可能会问,VMware混合云不是IaaS么,怎么说起应用了? 如果我们回到原始的问题,搭建Infra ...

  6. 安卓Activity界面切换添加动画特效

    在Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入, @Override pub ...

  7. UNIX基础知识之系统调用与库函数的区别与联系

    上图为UNIX操作系统的体系结构.内核的接口被称为系统调用(system call),公用函数库构建在系统调用接口之上,应用软件既可以使用公用函数库,也可直接使用系统调用. 更详细的说明如下: 所有操 ...

  8. Samba服务器配置参考链接

    一步一学Linux与Windows共享文件Samba(很适合初学者,极力推荐): http://os.51cto.com/art/200709/56395.htm 由最简单的一个例子说起,匿名用户可读 ...

  9. focusky 购买指南

    升级Focusky动画演示大师 所有版本一次购买,终身使用,无限制作,免费升级.支付方式:支付宝.淘宝.银行转账.支付宝付款:点击表格中的“立即购买“进入购买页面->选择版本.数量,并填写详细的 ...

  10. iOS:插件制作入门

    本文将介绍创建一个Xcode4插件所需要的基本步骤以及一些常用的方法.请注意为Xcode创建插件并没有任何的官方支持,因此本文所描述的方法和提供的信息可能会随Apple在Xcode上做的变化而失效.另 ...