接着上一节的知识点继续学习MFC的一些重要函数,因为函数设计MFC的基础。

第一步,创建一个MFC工程,然后再将上一节的两个功能添加进来,通过类向导添加DestroyWindow(),第二个按钮通过create()创建list菜单,前面也学习过这一知识点,后面会对这个知识点进阶。

第二步,实现获取窗口句柄按钮,代码见OnBnClickedButton3:
a)pWnd->m_hWnd:直接调用前最好判断一下指针是否为空。
b)operator HWND():自动类型转换,将对象转换为句柄。
c)GetSafeHwnd():可以避免的a方法,因为指针为空造成的软件崩溃。

第三步,实现由句柄转为CWnd对象的几个按钮,代码见OnBnClickedButton4、OnDestroy、OnBnClickedButton5:
a)CWnd::FromHandle:生成一个临时性窗口类指针,只限于在当前函数内使用。
b)Attach和Detach:为一个CWnd对象嫁接和移除窗口句柄。

a),b)这两条知识点在原来窗口下直接进行实现,而下面的c),d)需要添加两个CMyButton类、CMyList类,原来m_dest和m_list类型是窗口CWnd类型后面修改为CMyButton、CMyList,这样可以获取子类窗口的消息。实现需要在TestDlg.h中添加

CMyList m_list;

CWnd m_edit;

CMyButton m_dest;
c)SubclassWindow和UnsubclassWindow:子类化和反子类化,还能通过子类接收窗口消息。
d)SubclassDlgItem:子类化指定ID对应的控件窗口,还能通过子类接收窗口消息。

第四步,实现获取和设置窗口信息,见代码OnBnClickedButton6、OnBnClickedButton7:
a)GetWindowText和SetWindowText:获取和设置窗口的标题文字。
b)GetStyle和ModifyStyle:获取和设置窗口的基础风格。
c)GetExStyle和ModifyStyleEx:获取和设置窗口的扩展风格

如果用vc++6.0时需要具体按照吕鑫老师实现,如果是vs的话则有许多地方做修改了,可以参考我的代码,尤其是在CListCtrl的CreateEx函数实现上,有参数的变化和类型的变化。

结果:

这里我就直接贴我的.h和.cpp代码:

// TestWinDlg.h : 头文件
//#if _MSC_VER > 1000
#pragma once
#endif#include "MyButton.h"
#include "MyList.h"
// CTestWinDlg 对话框
class CTestWinDlg : public CDialogEx
{
// 构造
public:CTestWinDlg(CWnd* pParent = NULL);  // 标准构造函数CMyList m_list;CWnd m_edit;CMyButton m_dest;CMyButton m_cret;
// 对话框数据enum { IDD = IDD_TESTWIN_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);   // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton3();afx_msg void OnBnClickedButton4();afx_msg void OnBnClickedButton5();afx_msg void OnEnChangeEdit1();afx_msg void OnDestroy();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedButton7();
};
// TestWinDlg.cpp : 实现文件
#include "stdafx.h"
#include "TestWin.h"
#include "TestWinDlg.h"
#include "MyButton.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CTestWinDlg 对话框CTestWinDlg::CTestWinDlg(CWnd* pParent /*=NULL*/): CDialogEx(CTestWinDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CTestWinDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CTestWinDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CTestWinDlg::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON2, &CTestWinDlg::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &CTestWinDlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON4, &CTestWinDlg::OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON5, &CTestWinDlg::OnBnClickedButton5)ON_EN_CHANGE(IDC_EDIT1, &CTestWinDlg::OnEnChangeEdit1)ON_WM_DESTROY()ON_BN_CLICKED(IDC_BUTTON6, &CTestWinDlg::OnBnClickedButton6)ON_BN_CLICKED(IDC_BUTTON7, &CTestWinDlg::OnBnClickedButton7)
END_MESSAGE_MAP()// CTestWinDlg 消息处理程序BOOL CTestWinDlg::OnInitDialog()
{CDialogEx::OnInitDialog();DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_EDITLABELS | LVS_REPORT;m_list.CreateEx(WS_EX_CLIENTEDGE, dwStyle, CRect(30, 110, 300, 260), this, 8921);m_list.InsertColumn(0, _T("工号"), 0, 100);m_list.InsertColumn(1, _T("姓名"), 0, 100);m_list.InsertColumn(2, _T("工资"), 0, 100);HWND hWnd = ::GetDlgItem(m_hWnd, IDC_EDIT1);m_edit.Attach(hWnd);hWnd = ::GetDlgItem(m_hWnd, IDC_BUTTON1);m_dest.SubclassWindow(hWnd);m_cret.SubclassDlgItem(IDC_BUTTON2, this);// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);         // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标ShowWindow(SW_MAXIMIZE);// TODO:  在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CTestWinDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CTestWinDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTestWinDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}
void CTestWinDlg::OnBnClickedButton1()
{DestroyWindow();
}void CTestWinDlg::OnBnClickedButton2()
{
/*if (!m_list)m_list.CreateEx(WS_EX_CLIENTEDGE,_T("SysListView32"), NULL, WS_VISIBLE | WS_CHILD|LVS_REPORT, CRect(30, 110, 300, 260), this, 8921);*/
}
void CTestWinDlg::OnBnClickedButton3()
{CWnd * pWnd = GetDlgItem(IDOK);if (pWnd){HWND hWnd = pWnd->GetSafeHwnd();if (pWnd)pWnd->DestroyWindow();}
}void CTestWinDlg::OnBnClickedButton4()
{HWND hWnd=::GetDlgItem(m_hWnd, IDOK);CWnd *p = CWnd::FromHandle(hWnd);p->SetWindowText(L"临时对象");
}void CTestWinDlg::OnBnClickedButton5()
{m_edit.SetWindowTextW(L"长期有效");
}
void CTestWinDlg::OnEnChangeEdit1()
{}void CTestWinDlg::OnDestroy()
{CDialogEx::OnDestroy();m_dest.UnsubclassWindow();m_edit.Detach();}void CTestWinDlg::OnBnClickedButton6()
{DWORD dwStyle = m_list.GetStyle();m_list.ModifyStyle(0, LVS_NOSORTHEADER | LVS_SHOWSELALWAYS);
}
void CTestWinDlg::OnBnClickedButton7()
{DWORD dwExStyle = m_edit.GetExStyle();m_edit.ModifyStyleEx(dwExStyle,0);
}

吕鑫MFC学习系列七相关推荐

  1. 吕鑫MFC学习系列一

    前面有学习MFC比较零乱,利用假期好好恶补一下,接下来按照在网易公开课上吕鑫老师的MFC的教程来学习MFC的开发. 第一个学习的是员工管理系统,先把实现好的窗口贴上来. 主要的功能:添加(员工的工号, ...

  2. 吕鑫MFC学习系列十

    继续吕鑫VS2015的MFC类封装原理学习: 前面已经介绍过了,这一节实现一个员工管理系统中的数据管理和显示. 看一下代码: // workDlg.cpp : 实现文件 //#include &quo ...

  3. 吕鑫MFC学习系列四

    第一个是Win32工程转换而成MFC工程: 建一个win32项目,window应用程序,然后删除了所有函数,只留下主函数,编写过程中转MFC,所以右击项目,选择静态库MFC,然后在stdafx.h中用 ...

  4. 吕鑫MFC学习系列六

    这一章学习的相关知识框架: 一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档 ...

  5. 吕鑫MFC学习系列二

    第二个学习的是CString的类成员的使用,这个类是非常重要的,重点学习一下. 成员函数学习: 1.CString::GetLength() 2.CString::Format() 在vs2013编译 ...

  6. 吕鑫MFC学习系列三

    这节制作的是Ctime类的学习: 1.初始化 m_begintime=CTime(2004,1,1,0,0,0,-1);//参数依次为 year,month,day,hour,minite,secon ...

  7. 吕鑫MFC学习系列五

    这一节就是关于MFC工程管理,这里在主对话框出现之前添加一个登陆界面,最后在主对话框添加一个小小的功能就是关闭window已经打开的窗口. 下面是实现的过程: 主对话框还是上一节中那个MFC消息映射机 ...

  8. 吕鑫MFC学习系列九

    CWinApp类的基类:CObject->CCmdTarget->CWinThread->CWinApp 一.CWinApp类成员变量: 1.WinMain的四个参数: // Sta ...

  9. 【吕鑫MFC学习】一个简单的MFC程序

    开始学习MFC的第一天,实现一个简单的整数计算器用来说明MFC程序的基本流程. 平台:Visual Studio2015 实现的界面: 首先,新建一个MFC应用程序 这里简单说明控制台应用程序.MFC ...

最新文章

  1. 【ZJOI 2008】树的统计 Count
  2. java元婴期(31)----java进阶(springmvc(5)---数据回显数据交互拦截器)
  3. Hbase总结(八)Hbase中的Coprocessor
  4. 对软件测试的认识你了解多少
  5. file相对路径java_浅谈java 中文件的读取File、以及相对路径的问题
  6. VALSE学习(四):注意力机制-Attention Network
  7. Chromium OS编译手记
  8. WDS+MDT部署系统
  9. 【字符串】13. 罗马数字转整数
  10. vue m3u8格式 实现监控直播
  11. 九、软考·系统架构师——系统架构质量及评估
  12. outlook邮件标题乱码_如何在Outlook中阅读邮件标题
  13. 超实用Word技巧分享!这才是使用Word时常用到的高效率方法
  14. VC下载文件 + 显示进度条
  15. 古风男孩美名推荐分享
  16. Java Dependence Analysis(Java静态依赖分析)
  17. 医院信息系统基本功能规范---门急诊划价收费分系统功能规范
  18. 【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算
  19. GIS空间分析 网络分析2规划最佳路径
  20. 微信小程序好看的图文混排文章样式

热门文章

  1. 用于ECharts的全国省市区县乡镇街道级的行政区划边界数据(GeoJSON格式)
  2. 巨神奇,2013年的老Mac,竟直接装上macOS Ventura 13.1 Beta版
  3. 空格如何处理(全角和半角的区分)
  4. 三平面映射TriPlanar
  5. org.apache.jasper.JasperException: 无法为JSP编译类的解决方法
  6. Windows系统资源监控
  7. GBase 8s与Oracle对比分析
  8. CTCSS和CDCSS简介
  9. FCS20222-06-File Datebase
  10. 使用图新地球无法加载谷歌地球的完美解决方法(附软件下载)