当前位置:C++技术网 > 资讯 > VC++实现最小化程序图标的功能

VC++实现最小化程序图标的功能

更新时间:2016-04-15 21:05:31浏览次数:1+次

把应用程序最小化到托盘的基本原理就是将应用程序的主窗体隐藏,然后在托盘中绘制应用程序的图标。然后再为托盘图标添加一些事件处理。
新建一个VC++的对话框工程,在这个工程里面,我们添加一个按钮,而后双击创建消息机制。

对于软件的最小化功能,我们需要用到一个结构体:NOTIFYICONDATA。以及一个函数。

WINSHELLAPI BOOL API Shell_NotifuIcon()
{
DWORD dwMessage,
PNOTIFYICONDATA pnid
};
该函数返回一个BOOL值,失败返回0,返回非0则成功。
dwMessage:标识该函数的应用功能,是添加,修改或删除图标。其值分别对应NIM_ADD,NIM_DELETE,NIM_MODIFY。
pnid:程序最小化的结构体。
先看看该结构体——NOTIFYICONDATA(点击链接可转到百度百科)(http://baike.baidu.com/link?url=pXxWJa-T9T3UNif09134zrTbiJrM7ds7ln_yeGLVY5zFXfzpNtcCq0K_MpIOHFeN_tOIUTIOzUGeStT0ooBFqK)具体的我就不啰嗦。请自己到百度百科查看。个人认为百度百科讲的比我好。
先看实现:

void CMinDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage=WM_SHOWTASK;//自定义消息函数
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy_s(nid.szTip,L"计划提醒");//当鼠标焦点在该图标上时,显示"计划提醒"
Shell_NotifyIcon(NIM_ADD,&nid);
ShowWindow(SW_HIDE);
}

LRESULT CMinDlg::OnMyTask(WPARAM wParam, LPARAM lParam)
{
if(wParam!=IDR_MAINFRAME)
{
return 1;
}

switch(lParam)
{
case WM_RBUTTONUP:
{
LPPOINT lpoint=new tagPOINT;
GetCursorPos(lpoint);
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenuW(MF_STRING,WM_DESTROY,L"关闭");//右键弹起时弹出菜单显示的菜单项,并处理该菜单项。
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);

HMENU hMenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
break;
}
case WM_LBUTTONDBLCLK:
this->ShowWindow(SW_SHOW);//双击图标则显示主窗体
break;
}
return 1;
}
对于自定义的消息,我们在.h文件与.cpp文件中,得分别建立消息循环机制:
afx_msg LRESULT OnMyTask(WPARAM wParam, LPARAM lParam);
ON_MESSAGE(WM_SHOWTASK,OnMyTask)
对于WM_SHOWTASK函数,我们得给它来个定义,要不然编译器不认识它:
#define WM_SHOWTASK (WM_USER+1002)
好了,最后都是实现出来。好好理解,你会收获很多。