007 任务栏托盘弹出菜单
实现右下角托盘图标基本功能。
主要函数:Shell_NotifyIcon(dwMessage,pNotifyIconData)
dwMessage为以下参数:NIM_ADD 添加,NIM_DELETE 删除,NIM_MODIFY 修改
pNotifyIconData指向NOTIFYICONDATA结构
实现过程:1、填充NOTIFYICONDATA结构;
2、将函数写入WM_CREATE消息中;
3、在WM_DESTROY中添加删除操作。
资源地址:http://download.csdn.net/detail/u010849378/5479787
代码:
#include<windows.h>
#include "resource.h"
#define WM_TRAYNOTIFY WM_USER+1 // 自定义消息
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR szAppName[]=TEXT("Window");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Error!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HINSTANCE hInstance;
static NOTIFYICONDATA Nid;
POINT point;
HMENU hMenu;
switch(message)
{
case WM_CREATE:
hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
/*托盘结构基本参数:
*cbSize为结构大小,直接sizeof获取
*hWnd为接受消息的窗口句柄
*uID任务栏图标的标识符
*uFlags表示hIcon、szTip、uCallbackMessage中合法部分
NIF_MESSAGE,NIF_ICON,NIF_TIP 可连用
*uCallbackMessage要发送的消息,其中lParam为所包含的鼠标消息种类WM_RBUTTONDOWN、WM_RBUTTONUP等
wParam为发出消息的图标编号
*hIcon图标句柄
*szTip提示语句
其他的拓展参数请参考其他文章
*/
Nid.cbSize = sizeof(NOTIFYICONDATA);
Nid.hWnd = hwnd;
Nid.hIcon = LoadIcon(NULL,IDI_APPLICATION);
Nid.uFlags = NIF_ICON | NIF_MESSAGE ;
Nid.uID = 1;
Nid.uCallbackMessage = WM_TRAYNOTIFY ; //自定义消息
Shell_NotifyIcon(NIM_ADD,&Nid);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_TEST:
MessageBox(NULL,TEXT("Success"),TEXT(""),MB_OK);
return 0;
}
break;
case WM_TRAYNOTIFY:
SetFocus(hwnd);
switch(lParam) {
case WM_RBUTTONDOWN:
SendMessage(hwnd,WM_RBUTTONDOWN,0,0); //发送消息,实现弹出菜单
return 0;
}
break;
/*
窗口内右键弹出菜单实现
为了避免与托盘弹出菜单位置发生冲突,选则用GetCursorPos获取鼠标位置
*/
case WM_RBUTTONDOWN:
GetCursorPos(&point);
hMenu = LoadMenu(hInstance,TEXT("MENU1"));
hMenu = GetSubMenu(hMenu,0);
TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,point.x,point.y,0,hwnd,NULL);
return 0;
case WM_DESTROY:
Shell_NotifyIcon(NIM_DELETE,&Nid); //删除托盘图标
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
注:本例运用自建菜单。