如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++

2025-03-21 02:43:52
推荐回答(1个)
回答1:

完整代码如下,自己参考!!
#include
#include "resource.h"

//任务栏右侧提供托盘,允许程序加入图标,并响应用户输入的消息,对在后台运行的程序是有用的
//加入图标,调用Shell_NotifyIcon即可,允许删除和修改图标,传递给该函数NOTIFYICONDATA结构

const char szClassName[]={ TEXT("ShellTrayWindowClass")}; //窗口类名
const char szTip[]={ TEXT("Shell tray icon demo")}; //托盘图标提示字符
const int WM_SHELLICONNOTIFY=WM_USER+0x99; //通知消息
const int SMILLID=0x99; //托盘图标编号

HICON hIconSmill; //托盘图标句柄

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口过程
void AddTrayIcon(HWND); //辅助函数
void DeleteTrayIcon(HWND);
void ShowMenu(HWND);

int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
WNDCLASSEX wcex;
MSG msg;
HWND hwnd;
hIconSmill=::LoadIcon(hInstance,MAKEINTRESOURCE(IDI_SMELL)); //加载托盘图标资源

wcex.cbSize=sizeof(WNDCLASSEX); //窗口类
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.lpszClassName=szClassName;
wcex.lpfnWndProc=WndProc;
wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);
wcex.style=0;
wcex.hbrBackground=(HBRUSH)::GetStockObject(NULL_BRUSH);
wcex.hCursor=::LoadCursor(NULL,IDC_ARROW);
wcex.hIcon=hIconSmill;
wcex.hIconSm=hIconSmill;
do {
if(!::RegisterClassEx(&wcex))
break;
//创建不可见的窗口
hwnd=::CreateWindow(szClassName,NULL,WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(!hwnd)
break;
while(::GetMessage(&msg,0,0,0)) //消息循环
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
} while(FALSE);
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) //主窗口过程
{
switch(msg)
{
case WM_CREATE: //创建窗口时向托盘加入图标
AddTrayIcon(hWnd);
break;
case WM_COMMAND: //处理来自托盘的菜单命令
switch(LOWORD(wParam))
{
case IDM_HELLO:
::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);
return 0;
case IDM_EXIT:
::DestroyWindow(hWnd);
return 0;
default:
break;
}
break;
case WM_SHELLICONNOTIFY: //处理托盘图标的鼠标事件
{
if(SMILLID==(UINT)wParam)
{
switch((UINT)lParam)
{
case WM_RBUTTONUP:
ShowMenu(hWnd);
return 0;
case WM_LBUTTONDBLCLK:
::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);
return 0;
default:
break;
}
}
}
break;
case WM_DESTROY: //窗口销毁时删除托盘图标,并退出程序
DeleteTrayIcon(hWnd);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}

void AddTrayIcon(HWND hwnd) //添加托盘图标
{
NOTIFYICONDATA nid;
nid.cbSize=sizeof(NOTIFYICONDATA); //指定结构大小
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //指定结构的哪些成员是有效的
nid.hIcon=hIconSmill; //指定托盘图标句柄
nid.hWnd=hwnd; //指定接收托盘消息的窗口句柄
nid.uID=SMILLID; //自定义的托盘图标句柄,一个程序可添加多个托盘图标,以uID区分
nid.uCallbackMessage=WM_SHELLICONNOTIFY; //当用户鼠标在托盘产生事件时用户通知窗口程序的消息号
strcpy(nid.szTip,szTip); //鼠标在托盘图标上停靠的提示字符串
Shell_NotifyIcon(NIM_ADD,&nid);
}

void DeleteTrayIcon(HWND hwnd)
{
NOTIFYICONDATA nid;
::ZeroMemory(&nid,sizeof(nid));
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.uID=SMILLID;
nid.hWnd=hwnd;
nid.hIcon=hIconSmill;
Shell_NotifyIcon(NIM_DELETE,&nid);
}

void ShowMenu(HWND hwnd)
{
HMENU hMenu=::GetSubMenu(::GetMenu(hwnd),0);
POINT pt;
::GetCursorPos(&pt);
if(hMenu==NULL)
return;
if(::TrackPopupMenuEx(hMenu,TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_LEFTBUTTON,pt.x,pt.y,hwnd,NULL))
PostMessage(hwnd,WM_USER,0,0);
}