完整代码如下,自己参考!!
#include <wtypesh>
#include "resourceh"
//任务栏右侧提供托盘,允许程序加入图标,并响应用户输入的消息,对在后台运行的程序是有用的
//加入图标,调用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)); //加载托盘图标资源
wcexcbSize=sizeof(WNDCLASSEX); //窗口类
wcexcbClsExtra=0;
wcexcbWndExtra=0;
wcexhInstance=hInstance;
wcexlpszClassName=szClassName;
wcexlpfnWndProc=WndProc;
wcexlpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);
wcexstyle=0;
wcexhbrBackground=(HBRUSH)::GetStockObject(NULL_BRUSH);
wcexhCursor=::LoadCursor(NULL,IDC_ARROW);
wcexhIcon=hIconSmill;
wcexhIconSm=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 msgwParam;
}
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;
nidcbSize=sizeof(NOTIFYICONDATA); //指定结构大小
niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //指定结构的哪些成员是有效的
nidhIcon=hIconSmill; //指定托盘图标句柄
nidhWnd=hwnd; //指定接收托盘消息的窗口句柄
niduID=SMILLID; //自定义的托盘图标句柄,一个程序可添加多个托盘图标,以uID区分
niduCallbackMessage=WM_SHELLICONNOTIFY; //当用户鼠标在托盘产生事件时用户通知窗口程序的消息号
strcpy(nidszTip,szTip); //鼠标在托盘图标上停靠的提示字符串
Shell_NotifyIcon(NIM_ADD,&nid);
}
void DeleteTrayIcon(HWND hwnd)
{
NOTIFYICONDATA nid;
::ZeroMemory(&nid,sizeof(nid));
nidcbSize=sizeof(NOTIFYICONDATA);
niduID=SMILLID;
nidhWnd=hwnd;
nidhIcon=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,ptx,pty,hwnd,NULL))
PostMessage(hwnd,WM_USER,0,0);
}
VC++中把一个对话框最小化到托盘
一、托盘简介
所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
二、托盘编程相关函数
把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。
绘制图标以及确定图标所传送消息的函数只有一个:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
这个函数,负责向系统传递消息,以添加、修改或删除托盘区的图标。
参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, PNOTIFYICONDATA;
下面就对该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行 *** 作,相应的消息就传给这个句柄所代表的窗口。大多数情况下是this->m_hWnd。
uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 这在对托盘区的 *** 作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行 *** 作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。
szTip : 鼠标移动到托盘图标上时的提示文字。
三、托盘编程例子
1、将程序最小化到系统托盘区的函数toTray()。
void CTimeWakeDlg::toTray()
{
NOTIFYICONDATA nid;
nidcbSize=(DWORD)sizeof(NOTIFYICONDATA);
nidhWnd=this->m_hWnd;
niduID=IDR_MAINFRAME;
niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
niduCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nidhIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nidszTip,"计划任务提醒"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}
这是个很简单的函数,里面首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon, 头一个参数是NIM_ADD,表示添加。然后用函数ShowWindow 隐藏主窗口,这样,就实现了将程序最小化到系统托盘区的任务了。
2、程序已经最小化到托盘区了,但是对托盘图标的 *** 作如何进行呢?这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无论是左键还是右键),会向hWnd所代表的窗口传送消息
如上例,我们自定义了消息WM_SHOWTASK。根据VC的消息机制,对自定义消息增加消息响应函数
在Dlgcpp文件上面定义一个用户消息:
#define WM_SHOWTASK (WM_USER + 1986)
在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应函数:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间加入: ON_MESSAGE(WM_SHOWTASK,onShowTask)将消息和消息响应函数映射起来。
然后就是在CPP文件中加入函数onShowTask的实现了:
LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时d出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menuCreatePopupMenu();//声明一个d出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menuAppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定d出式菜单的位置
menuTrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
/ /资源回收
HMENU hmenu=menuDetach();
menuDestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
}
break;
}
return 0;
}
以上就是关于如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++全部的内容,包括:如何在VC++中使一个hello world窗口最小化到托盘 各位会的帮下忙。我才开始学VC++、求教:vc++单文档程序最小化到托盘、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)