摘要:关于在MFC中将窗口最小化到托盘~~
步骤/方法
(一) 原理
1、最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标。
2、恢复的原理:将窗口显示,再将托盘中的图片删除。
(二)程序实现
1、自定义消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER +1)
2、在MFC的
::OnSysCommand(UINT nID, LPARAM lParam) 函数体中增加一个命令响应
if(nID==SC_MINIMIZE)
ToTray(); //最小化到托盘的函数
3、在消息映射中添加
ON_MESSAGE(WM_SHOWTASK,OnShowTask); //其中WM_SHOWTASK是消息名,
OnShowTask是自己定义的消息响应函数,后面有说明。
(三)具体函数内容
1、最小化到托盘函数
void CMyDlg::ToTray()
{
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));
strcpy(nid.szTip,"程序名称"); //信息提示条
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}
2、恢复界面函数
在头文件中定义消息响应函数
afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CMyDlg::OnShowTask(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.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
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);//简单的显示主窗口完事儿
DeleteTray();
} break;
default: break;
}
return 0;
}
删除托盘图标函数
void CMyDlg::DeleteTray()
{
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));
strcpy(nid.szTip,"程序名称"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标
}
本文链接
问题描述:分割集合成多个子集合,这几个子集合间没有交集且他们的并集是原集合。
思路:将包含n个元素的集合set的分割表示为n个数字。比如set[]={1,2,3,4},那么{1,2},{3,4}就可以表示为1122,这4个数分别表示set[0]在第一个分割集合,set[1]在第一个分割集合,set[2]在第二个分割集合,set[3]在第二个分割集合。将这个过程称为编码。
然后抓住两个要点:
1.第i个元素的编码一定小于或者等于i。约定一下,set原集合已经从小到大排列好,分割的集合也是这样排好。然后,很容易理解,第1个元素的编码肯定为1。接着,第2个元素如果在第一个分割集合中,那么他的编码也是1;但如果不是在第一个分割集合中,那么第2个元素的编码肯定是2,因为在第二个分割集合中,最小的数最少也是2;依次类推,可以很容易用数学归纳法证明。
2.第i个元素的编码一定小于等于1,2,3,....i-1这些元素的编码中的最大值再加1。这也很容易想到,也很容易用数学归纳法证明。
抓住这个要点后,就用深度搜索构造一颗子集合树就可以解决问题了。但是,我在构造子集树的过程中出现了一个思维上的错误,导致浪费了不少调试的时间。具体的错误见代码注释的描述。
代码如下:
2 #define MAX 1000
3
4 int set[MAX]={1,2,3,4};
5 int n=4;
6 int code[MAX]={1,1,1,1};
7
8 //prototype
9 void DFS(int index);
10
11 void print_set()
12 {
13 int index;
14 int max=-1;
15 printf("{");
16 for(index=0;index<n;index++)
17 {
18 if(code[index]==1)
19 printf("%d ",set[index]);
20 if(max<code[index])
21 max=code[index];
22 }
23 printf("},{");
24 for(index=2;index<=max;index++)
25 {
26 int index_2;
27 for(index_2=0;index_2<n;index_2++)
28 if(code[index_2]==index)
29 printf("%d ",set[index_2]);
30 printf("},{");
31 }
32 printf("\n");
33 }
34
35 //find out the max code of 1,2,3...i-1 and plus 1
36 int max_pre(int i)
37 {
38 int index;
39 int max=-1;
40 for(index=0;index<i;index++)
41 if(code[index]>max)
42 max=code[index];
43 return (max+1);
44 }
45
46 int main()
47 {
48 int i;
49 DFS(1);
50 return 0;
51 }
52
53 void DFS(int index)
54 {
55 print_set();
56 if(index==n)
57 return ;
58
转自:http://blog.csdn.net/xiaoyun8822/article/details/7939605
一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及MFC中常见应用进行阐述并举例。
本文内容索引:
=========================================================
MFC中获取常见类句柄<视图类,文档类,框架类,应用程序类>
MFC中获取窗口句柄及相关函数
MFC获取控件句柄
MFC各类中获取类指针详解
MSDN关于应用程序信息和管理的各个函数
==========================================================
MFC中获取常见类句柄<视图类,文档类,框架类,应用程序类>
本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:
GET App
AfxGetInstanceHandle()
AfxGetApp()
GET Frame->View->Document
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument()
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument()
GET Menu
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetMenu();
GET ToolBar,StatusBar
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
CStatusBar * pStatusBa=(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
Get View from Document
GetFirstViewPosition 和 GetNextView 函数得到指针。
MFC中获取窗口句柄及相关函数
首先,窗口句柄,在窗口类中直接使用成员变量m_hWnd,在窗口外最常见是用AfxGetMainWnd (获取主窗口指针,其成员变量m_hWnd为主窗口句柄):
与其相关的函数说明如下,这些函数对于获取窗口句柄非常有用:
GetTopWindow 函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。 函数原型:HWND GetTopWindow(HWND hWnd); 参数: hWnd:被查序