基于VS2010MFC项目的单文档程序的动态按钮释放。包括动态按钮创建和动态按钮的释放。
所创建的项目名称为13Jan19Pro。
此文档主要是介绍释放MFC程序中的动态按钮控件空间。动态按钮是经new函数申请堆空间得来的,当我们不需要此段堆空间或程序结束时我们就要调用delete函数来释放相应的空间,以免内存泄露。
在解决方案资源管理器窗口中展开资源文件,双击13Jan19Pro.rc,在资源视图-13Jan19Pro窗口中展开String Table,双击String Table下的String Table编辑框。在弹出的13Jan19Pro.rc-String Table框中新添加动态按钮属性:
表格 1:添加动态按钮属性
ID |
值 |
标题 |
IDC_MYBUT |
101 |
双击!你想干嘛 |
IDC_DISAPPEAR |
102 |
按钮消失 |
用“类向导”在CMy13Jan19ProView类(派生于CView类)中添加VM_LBUTTONDBLCLK消息映射宏。步骤为:项目-->类向导出现以下界面并对其进行设置如下。
其中OnLButtonDblClk为与VM_LBUTTONDBLCLK消息对应的函数,当程序在执行过程中出现VM_LBUTTONDBLCLK消息则程序自动调用OnLButtonDblClk函数执行。双击VM_LBUTTONDBLCLK对应函数就会生成,保存在类向导中的设置,回到CMy13Jan19ProView.cpp中编写OnLButtonDblClk函数。
//双击界面时会出现两个按钮 void CMy13Jan19ProView::OnLButtonDblClk(UINT nFlags, CPoint point) { //CString 类对象m_Caption1, m_Caption2; CString m_Caption1, m_Caption2; //分别获取IDC_MYBUT,ê?IDC_DISAPPEAR标题 m_Caption1.LoadStringW(IDC_MYBUT); m_Caption2.LoadStringW(IDC_DISAPPEAR); //为即将创建的动态按钮申请堆空间 //若申请不成功则中断程序 p_MyBut1 = new CButton(); p_MyBut2 = new CButton(); ASSERT_VALID(p_MyBut1); ASSERT_VALID(p_MyBut2); //创建IDC_MYBUT, IDC_DISAPPEAR p_MyBut1->Create(m_Caption1, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, Rect(10,10,200,50), this, IDC_MYBUT); p_MyBut2->Create(m_Caption2, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(50,50,200,80), this, IDC_DISAPPEAR); CView::OnLButtonDblClk(nFlags, point); }
为动态按钮添加响应函数需要手动添加,包括函数申明,消息映射宏添写,函数编写。
这里主要用IDC_DISAPPEAR控件来使出现的按钮消失(delete释放)。
声明一个函数正规的做法是到派生类的头文件中声明。13Jan19ProView.h文件:
// 生成的消息映射函数 protected: int Dyn_But_flag; CButton *p_MyBut1, *p_MyBut2; HWND hWnd; afx_msg void OnFilePrintPreview(); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); afx_msg void CMy13Jan19ProView::RespondClickOnDynamicBut(); //自定义函数声明 afx_msg void CMy13Jan19ProView::OnMyBut(); DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMy13Jan19ProView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMy13Jan19ProView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDBLCLK() ON_BN_CLICKED(IDC_MYBUT, &CMy13Jan19ProView::RespondClickOnDynamicBut) //手动添加消息映射宏 ON_BN_CLICKED(IDC_DISAPPEAR, &CMy13Jan19ProView::OnMyBut) ON_WM_PAINT() END_MESSAGE_MAP()
//当点击IDC_DISAPPEAR控件时两个动态按钮消失(被释放) void CMy13Jan19ProView::OnMyBut() { delete p_MyBut1; delete p_MyBut2; }
窗口最初出现没有界面之上的两个按钮。当用鼠标左键双击中间空白界面时出现两个动态按钮,当点击“按钮消失”按钮时两个动态按钮消失。此操作可循环进行。