vc最小化到状态栏

来源:互联网 发布:新网域名怎么转入万网 编辑:程序博客网 时间:2024/06/05 14:59

最小化到状态栏

1.准备工作

NOTIFYICONDATA 定义

NOTIFYICONDATA:结构包含了系统用来处理托盘图标的信息,它包括选择的图标、回调消息、提示消息和图标对应的窗口等内容

 typedef struct—NOTIFYICONDATA { 

                  DWORD cbSize;   //以字节为单位的这个结构的大小 

                  HWND hWnd;  //接收托盘图标通知消息的窗口句柄 

                  UINT uID;   //应用程序定义的该图标的ID号 

                  UINT uFlags;  //设置该图标的属性 

                  UINT uCallbackMessage;   //应用程序定义的消息ID号,此消息传递给hWnd 

                  HICON hIcon; //图标的句柄 

                  char szTip[64]; //鼠标停留在图标上显示的提示信息 

  } NOTIFYICONDATA, PNOTIFYICONDATA; 

  该结构中,成员uFlags可以是下列的组合或其中之一: 

  NIF_ICON:设置成员hIcon有效 

  NIF_MESSAGE:设置成员uCallbackMessage有效 

  NIF_TIP:设置成员szTip有效 

  二、 Shell_NotifyIcon函数 

  全局函数Shell_NotifyIcon()用于在托盘上增加、删除或修改图标。其原型为: 

  WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA pnid); 

  Pnid是上面的NOTIFYICONDATA结构的指针。 

  dwMessage是被传递的消息,可以是以下消息之一: 

  NIM_ADD:增加图标 

  NIM_DELETE:删除图标 

NIM_MODIFY:修改图标 

操作步骤:

定义用户消息

1.定义一个NOTIFYICONDATA 并填充结构体

设计菜单资源

设计菜单选项功能

填充结构体

2.利用::Shell_NotifyIcon将消息发送个状态栏处理

3.释放相应资源

4.状态栏中增加程序图标(响应该图标区域消息)

判断处理消息

1.处理左键双击消息

2.处理最小化隐藏

3.处理快捷菜单的响应函数

函数积累

WM_USER 用户与系统消息界限

AfxGetApp 获取应用程序CWinApp

_tcscpy strcpy 拷贝字符串

Shell_NotifyIcon 发送消息给状态栏

DestroyIcon 销毁图标释放内存占用(只能销毁非共享)

SetForegroundWindow  将指定窗口线程设置到前台

TrackPopupMenu 弹出快捷菜单

WM_SYSCOMMAND 当用户从窗口菜单选择一个命令或当用户选择最大化按钮,最小化按钮,复原按钮或关闭按钮时,一个窗口将会接收该消息 

知识积累

1.加载可执行程序时,   整个程序会映射到内存中(包含它本身的资源)。

如果icon是从资源文件中加载的,它本身已经在内存里,此时LoadIcon并不是将另copy一份icon数据加载至内存,而只是获取了一个可操作它的句柄,所以用不着释放。LoadMenu(),CMenu的析构函数中它会自己Detach并且DestroyMenu

2. The call to Detach detaches the HMENU from the CMenu object, so that when the local CMenu variable passes out of scope, the CMenu object destructor does not attempt to destroy a menu it no longer owns. The menu itself is automatically destroyed when the window is destroyed

CMenu::DestroyMenu销毁的资源应该不是指菜单句柄所指的那个资源,应该是其他资源吧??

3.WM_QUIT WM_POSTQUITMESSAGE WM_DESTROY WM_NCDESTROY WM_CLOSE

一般遵循:WM_CLOSE、WM_DESTROY、WM_QUIT顺序

程序的退出流程:http://tech.ddvip.com/2007-03/117415785621632_4.html

http://blog.csdn.net/yiruirui0507/archive/2010/12/08/6062991.aspx

4.对于发送到托盘的消息,lParam 代表附加的鼠标按键消息 wParam代表?或许是一个句柄或什么的

5.Detach 一个菜单对象和菜单资源是为了想继续使用菜单资源

6.对话框关闭流程:

1. 点“确定”、“取消”时的关闭路由为 

OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy() 

2. 点“关闭”标题栏按钮的关闭路由为 

OnClose()---> OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()

http://apps.hi.baidu.com/share/detail/33398859

7.SendMessage 是直接发送给窗口过程处理,而不会经过消息列队

相应教程:http://bbs.emal30.com/forum.php?mod=viewthread&tid=159

http://apps.hi.baidu.com/share/detail/33316141

原创粉丝点击