应用程序的桌面图标
概述
我们平时用到的程序一般都在桌面上有个生动的图标,双击该图标即可启动程序。使用MFC开发的程序默认的图标都是,如果我们想定制自己的个性图标怎么办,下面提供解决方案:
1.创建一个基于对话框的MFC工程,命名为DesktopIconPro.
2.准备一个图标资源,然后插入到工程的资源中。此时你会看到工程的资源ICON文件夹下有两个图标,一个是新插入的IDI_ICON1,另外一个是系统默认的IDR_MAINFRAME。删除系统默认的,将新的命名为IDR_MAINFRAME,编译运行程序即可看到Debug和Release文件夹下的桌面图标已经变了。
系统默认桌名图标: 个性化桌面图标:
托盘图标
我们平时启动一个程序后,一般在windows底部工具条右侧都有个托盘图标。当程序窗口最小化时候窗体就回缩到系统托盘,双击此托盘程序图标时候,窗体就再次出现。
该功能只要涉及3个技术点:程序启动时,创建托盘图标;程序退出时,删除托盘图标;单击托盘图标时,显示窗体。
1.创建一个基于对话框的MFC程序,命名为TaskIconPro;
工程采用unicode编码。
2.在对话框类CTaskIconProDlg的OnInitDialog()中创建托盘图标,添加如下两行代码
HICON hicon =(HICON)LoadImage(NULL, L"res\\TIME1.ICO", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
TaskBarAddIcon(GetSafeHwnd(),120,hicon,L"SH2上位机软件"); //添加任务栏图标
(
题外话:此处虽然用HICON hicon =LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));也能实现功能,但是LoadIcon已经被LoadImage代替,所以还是使用LoadImage。关于LoadImage的使用参考http://blog.csdn.net/xiaxiaojing/article/details/44014633)
//添加托盘图标函数
BOOL CTaskIconProDlg::TaskBarAddIcon( HWND hwnd,UINT uID,HICON hicon,CString strTip )
{
NOTIFYICONDATA d;//托盘图标结构体
d.cbSize = sizeof(NOTIFYICONDATA);//托盘图标结构体的大小
d.hWnd = hwnd;//托盘图标所属的窗体
d.uID = uID;//托盘图标ID
d.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;//托盘图标结构体的属性
d.uCallbackMessage = MY_NOTIFYICON;//设置托盘图标的单击消息
d.hIcon = hicon;
lstrcpy (d.szTip,strTip);//设置托盘图标的提示
return Shell_NotifyIcon(NIM_ADD,&d);//添加托盘图标(题外话:之前调试程序时候之所以反复不出现图标是因为上面一句原来程序中有if else,而把 return Shell_NotifyIcon(NIM_ADD,&d);放进了else语句中导致执行不了该功能)
{
NOTIFYICONDATA d;//托盘图标结构体
d.cbSize = sizeof(NOTIFYICONDATA);//托盘图标结构体的大小
d.hWnd = hwnd;//托盘图标所属的窗体
d.uID = uID;//托盘图标ID
d.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;//托盘图标结构体的属性
d.uCallbackMessage = MY_NOTIFYICON;//设置托盘图标的单击消息
d.hIcon = hicon;
lstrcpy (d.szTip,strTip);//设置托盘图标的提示
return Shell_NotifyIcon(NIM_ADD,&d);//添加托盘图标(题外话:之前调试程序时候之所以反复不出现图标是因为上面一句原来程序中有if else,而把 return Shell_NotifyIcon(NIM_ADD,&d);放进了else语句中导致执行不了该功能)
}
//删除托盘图标函数
BOOL CTaskIconProDlg::TaskBarDeleteIcon( HWND hwnd,UINT uID )
{
NOTIFYICONDATA d;
d.cbSize = sizeof(NOTIFYICONDATA);
d.hWnd = hwnd;
d.uID = uID;
return Shell_NotifyIcon(NIM_DELETE,&d);//删除托盘图标
}
BOOL CTaskIconProDlg::TaskBarDeleteIcon( HWND hwnd,UINT uID )
{
NOTIFYICONDATA d;
d.cbSize = sizeof(NOTIFYICONDATA);
d.hWnd = hwnd;
d.uID = uID;
return Shell_NotifyIcon(NIM_DELETE,&d);//删除托盘图标
}
以上代码中关键的技术点有:
1.NOTIFYICONDATA 是用于设置托盘图标的的结构体;
2.设置托盘图标的核心是API函数;
3.关于托盘图标的单击消息,一般在NOTIFYICONDATA结构体的uCallbackMessage成员中设定;(自定义消息)
以上的自定义消息为#define MY_NOTIFYICON (WM_USER + 200) 记得后面一定不能加;,否则会有一堆问题,如下:
在对话框的头文件中设置,而后需要为它添加自定义消息处理函数和消息映射;
首先在对话框头文件中声明:
LRESULT OnMyIconNotify(WPARAM wparam,LPARAM lparam); //VC6.0中是void类型,VS2010必须是LRESULT类型,否则出错;
然后在对话框cpp文件中添加消息映射:
ON_MESSAGE(MY_NOTIFYICON, &CTaskIconProDlg::OnMyIconNotify)
(题外话:
ON_COMMAND是菜单和工具栏项处理消息的宏
ON_MESSAGE是处理自定义消息的宏
ON_NOTIFY 是控件向其父窗口发送消息处理的宏)
BOOL CTaskIconProDlg::TaskBarModifyIcon(HWND hwnd, UINT uID, HICON hicon, CString strTip)
{
NOTIFYICONDATA d;
d.cbSize=sizeof(NOTIFYICONDATA);
d.hWnd=hwnd;
d.uID=uID;
d.uFlags=NIF_ICON | NIF_TIP | NIF_MESSAGE;
d.uCallbackMessage=MY_NOTIFYICON;
d.hIcon=hicon;
lstrcpy(d.szTip,strTip);
return Shell_NotifyIcon(NIM_MODIFY,&d);
}
{
NOTIFYICONDATA d;
d.cbSize=sizeof(NOTIFYICONDATA);
d.hWnd=hwnd;
d.uID=uID;
d.uFlags=NIF_ICON | NIF_TIP | NIF_MESSAGE;
d.uCallbackMessage=MY_NOTIFYICON;
d.hIcon=hicon;
lstrcpy(d.szTip,strTip);
return Shell_NotifyIcon(NIM_MODIFY,&d);
}
点击X号退出时候,执行ON_DESTROY消息响应,在消息响应函数中调用删除图标函数;
void CTaskIconProDlg::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: 在此处添加消息处理程序代码
TaskBarDeleteIcon( GetSafeHwnd(),120);
}
{
CDialogEx::OnDestroy();
// TODO: 在此处添加消息处理程序代码
TaskBarDeleteIcon( GetSafeHwnd(),120);
}
(题外话:添加消息映射可通过类向导-->要添加消息响应的类右键-->消息-->添加处理程序实现)
具体见代码:http://download.csdn.net/detail/xiaxiaojing/8466375