MFC中 最小化对窗口做了什么?

MFC中 最小化对窗口做了什么?,第1张

(一) 原理

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 nidnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA)nid.hWnd=this->m_hWndnid.uID=IDR_MAINFRAMEnid.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 1switch(lParam) { case WM_RBUTTONUP://右键起来时d出快捷菜单,这里只有一个“关闭” { LPPOINT lpoint=new tagPOINT::GetCursorPos(lpoint)//得到鼠标位置 CMenu menumenu.CreatePopupMenu()//声明一个d出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 //隐藏),将程序结束。 menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭")//确定d出式菜单的位置 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this)//资源回收 HMENU hmenu=menu.Detach()menu.DestroyMenu()delete lpoint} breakcase WM_LBUTTONDBLCLK://双击左键的处理 { this->ShowWindow(SW_SHOW)//简单的显示主窗口完事儿 DeleteTray()} breakdefault: break} return 0}

3、删除托盘图标函数

void CMyDlg::DeleteTray(){ NOTIFYICONDATA nidnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA)nid.hWnd=this->m_hWndnid.uID=IDR_MAINFRAMEnid.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)//在托盘区删除图标 }

新建mfc对话框工程

打开对话框资源编辑界面双击默认的确定按钮添加默认的OnOK响应函数,

注释掉默认的CDialog::OnOK()

讲对话框工程中

OnSysCommand

中的默认代码【标题栏系统菜单有个关于菜单拿来用用,mfc类向导默认帮你生成了关于对话框和对应的类直接拿来主义,】

copy

OnSysCommand中的两行代码

CAboutDlg

dlgAbout

dlgAbout.DoModal()到OnOK函数中

当然你可以不使用,甚至删除默认的确定按钮

;自己添加一个button上去给你的button添加响应函数

CMainFrame::PreCreateWindows(CREATESTRUCT&cs)

{

if( !CMDIFrameWnd::PreCreateWindow(cs) )

return FALSE

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

cs.style&=~WS_MAXIMIZEBOX//添加这一句,是禁用最大化的按钮;

return TRUE

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11375955.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存