---恢复内容开始---
# 一. MFC是什么
1.MFC是 windows 一整套应用程序开发框架
MFC(MicrosoftFoundationClasses)
是微软公司实现的一个c++类库,主要封装了大部分的windows API函数
2.QT C++图形用户界面应用程序开发框架
是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。
它既可以开发GUI程序
也可用于开发非GUI程序
比如控制台工具和服务器
3.Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。
提供所见即所得的开发工具UIDesigner。使用DirectUI后将使得我们的设计人员彻底解
DirectUI界面库使用XML来描述界面风格,界面布局,可 以很方便的构建高效,绚丽的,非常易于扩展的界面
Duilib界面库的出现解决了使用传统MFC界面库开发软件不美观、界面细节处理不好、使用硬编码、开发效率低下、生成程序体积大等问题。
# 二. 第一个MFC程序 计算编辑框内的文本数量
(图1)
(图2)
(图3)
1.创建第一个MFC应用程序解决方案
打开 VS2015 文件新建项目 快捷键 Ctrl + Shift + N (图1)
选择基于对话框 (图2)
如果要发布程序 选择静态库使用MFC 会把库文件打包. 程序体积会很大,打包库文件到程序中 (图2)
如果选择共享 DLL 中使用MFC 动态链接库 程序机体较小 不打包库文件到程序种 (图2)
创建完成 后一个所见即所得的界面 (图3)
(图4)
(图5)
(图6)
2.编辑框
工具栏拖拽一个编辑框到窗口内 (图4)
编辑窗口 设置编辑框的属性 (图5)
工具栏拖拽一个button 和 两个 startic Text 控件分别设置ID的属性 IDC_BTN_COUNT 和 IDC_OUTPUT (图6)
3.代码实现
双击button进入鼠标单击响应事件
输入以下代码 (图7)
编译运行程序 ( 图8 )
( 图7 )
1 CString strInput; 2 if (0 == GetDlgItemTextW(IDC_EDT_INPUT, strInput)) 3 { 4 SetDlgItemTextW(IDC_OUTPUT, L"获取统计资料失败!"); 5 return; 6 } 7 CString strOutput; 8 strOutput.Format(L"%d", strInput.GetLength()); 9 SetDlgItemTextW(IDC_OUTPUT, strOutput);
( 图8 )
4.代码分析
A版本和W版本函数区别
首先 函数SetDlgItemText 宏定义 如果编译器定义UNICODE 使用 SetDlgItemTextW 否则使用 SetDlgItemTextA
Windows 内核采用UNICODE 开发的,如果使用 A版本的函数,系统会将其转换成W版本然后调用运行,所以尽量使用W版本进行编程开发
CString strInput
Cstring 是MFC下的独有数据类型 定义(图9)
if (0 == GetDlgItemTextW(IDC_EDT_INPUT, strInput))
调用这个函数以获得与对话框中的控件相关的标题或文本。GetDlgItemText成员函数将文本拷贝到lpStr指向的位置并返回拷贝的字节的数目
如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。
如果函数调用失败,返回值为 0
这个判断的意思就是如果函数执行失败 设置 IDC_OUTPUT 控件的文本为 L"获取统计资料失败!"
CString strOutput;
新申请一个strOutput 用于显示输出编辑框文本的字符数量
strOutput.Format(L"%d", strInput.GetLength());
SetDlgItemTextW(IDC_OUTPUT, strOutput);
获取字符串的长度
修改设置IDC_OUTPUT 控件 用于显示字符串的数量
(图9)
#三 . 第二个MFC程序 CheckBokDemo 实现点击点选和多选按钮实现不通颜色的矩形和圆形
1.创建第一个MFC应用程序解决方案
新建项目,修改默认界面 可参照 图1 图2 图3
拖拽 单选框 和 多选框 设置 ID 和 文本 并排列(图10) (图11)
(图10)
(图11)
2.使用类向导将控件跟变量关联
方法一对控件点击右键 添加变量 命名变量名 (图 12) (图 13)
方法二点击鼠标右键 类向导 快捷键 Ctrl + Shift +X 成员变量 添加变量 (图 14) (图 15)
(图12)
(图13)
(图14)
(图15)
3.给程序增添一个消除窗口背景的消息 WM_ERASEBKGND
WM_ERASEBKGND 消息详解
当窗口背景必须被擦除时 (例如,窗口的移动,窗口的大小的改变)才发送
当窗口的一部分无效需要重绘时发送此消息。
#define WM_ERASEBKGND 0x0014 宏定义 编译时候自动替换
增添方法
单击鼠标右键类向导快捷键 Ctrl + Shift +X (图12)
切换到消息选卡中 选中要增添的消息点击确定 (图16)
(图16)
4.代码实现
输入代码 (图17)
(图17)
WM_ERASEBKGND 响应代码
BOOL CCheckBoxDemoDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 BOOL bRet = CDialogEx::OnEraseBkgnd(pDC); int nRed, nGreen, nBlue; nRed = m_chkred.GetCheck() ? 255 : 0; nGreen = m_chkgreen.GetCheck() ? 255 : 0; nBlue = m_chkblue.GetCheck() ? 255 : 0; COLORREF crColor = RGB(nRed, nGreen, nBlue); CBrush brush; brush.CreateSolidBrush(crColor); CBrush *pOldBrush = pDC->SelectObject(&brush); RECT rect = { 25,25,200,200 }; if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck()) { pDC->Rectangle(&rect); } else { pDC->Ellipse(&rect); } pDC->SelectObject(pOldBrush); return bRet; }
给窗口内所有控件 增添一个函数 设置无效区域 使窗口进行重绘 void Invalidate( BOOL bErase = TRUE );
void CCheckBoxDemoDlg::OnBnClickedCheckRed() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); } void CCheckBoxDemoDlg::OnBnClickedCheckGreen() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); } void CCheckBoxDemoDlg::OnBnClickedCheckBlue() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); } void CCheckBoxDemoDlg::OnBnClickedRadioRect() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); } void CCheckBoxDemoDlg::OnBnClickedRadio2() { // TODO: 在此添加控件通知处理程序代码 Invalidate(); }
5.代码分析
BOOL bRet = CDialogEx::OnEraseBkgnd(pDC); return bRet;
定义一个 bRet的变量 如果它擦除了背景,则返回非零值;否则返回0
int nRed, nGreen, nBlue; nRed = m_chkred.GetCheck() ? 255 : 0; nGreen = m_chkgreen.GetCheck() ? 255 : 0; nBlue = m_chkblue.GetCheck() ? 255 : 0;
定义三个整型变量
GetCheck() 控件是否被按下
用三目运算符 控件被按下 设置255 没有被按下设置为0
COLORREF crColor = RGB(nRed, nGreen, nBlue); CBrush brush; brush.CreateSolidBrush(crColor); CBrush *pOldBrush = pDC->SelectObject(&brush); RECT rect = { 25,25,200,200 }; if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck()) { pDC->Rectangle(&rect); } else { pDC->Ellipse(&rect); } pDC->SelectObject(pOldBrush);
COLORREF typedef DWORD COLORREF; DWORD类型的变量
RGB #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) 控制颜色取值
CBrush brush; 新建画刷
brush.CreateSolidBrush(crColor); 设置画刷的颜色,把我们的变量传递进去
CBrush *pOldBrush = pDC->SelectObject(&brush);
函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类
有点晕不是太懂 T_T 标记一下
RETC
结构体 窗口内 左上角的 坐标 跟 右下角的坐标 然后就可以画出图形了 (图18)
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
if (((CButton*)GetDlgItem(IDC_RADIO_RECT))->GetCheck())
如果矩形点选按钮按下 就执行画矩形 否则 画圆圈
(图18)
#四 . 第三个MFC程序 ComboBoxDemo 下拉框列表
新建MFC 项目 并在窗口增添控件 (图19)
拖拽 Combo Box 下拉框列表
设置属性 ID IDC_COMBO_DEMO
设置 TYPE 属性 下拉列表 Drop List
注意属性 Sort 自动排序属性
添加变量 设置变量名位 m_ListDemo
拖拽 List Box
设置属性 ID IDC_LIST_DEMO
添加变量 设置变量名位 m_cobDemo
拖拽 编辑框 Edit Box
设置ID IDC_EDIT_INPUT
拖拽 两个按钮
设置属性ID 一个为 IDC_BTN_ADD 标题设置为 添加
设置属性ID 一个为 IDC_BTN_DEL 标题设置为 删除
(图19)
代码实现
双击增添按钮 编写鼠标响应消息 图20
双击删除按钮 编写鼠标响应消息 图21
图20
void CComboBoxDemoDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CString strInput; if (GetDlgItemTextW((IDC_EDIT_INPUT), strInput) != 0) { int nIndex = m_cobDemo.AddString(strInput); m_cobDemo.SetCurSel(nIndex); nIndex = m_listDemo.AddString(strInput); m_listDemo.SetCurSel(nIndex); } }
图21
void CComboBoxDemoDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 int nIndex = m_cobDemo.GetCurSel(); if (-1 < nIndex) { m_cobDemo.DeleteString(nIndex); if (nIndex < m_cobDemo.GetCount()) m_cobDemo.SetCurSel(nIndex); else m_cobDemo.SetCurSel(0); } else { MessageBoxW(L"未选中待删除的项!"); } nIndex = m_listDemo.GetCurSel(); if (nIndex > -1) { m_listDemo.DeleteString(nIndex); if (nIndex < m_listDemo.GetCount()) m_listDemo.SetCurSel(nIndex); else m_listDemo.SetCurSel(0); } else { MessageBoxW(L"未选中待删除的项!"); } }
代码分析
CString strInput; if (GetDlgItemTextW((IDC_EDIT_INPUT), strInput) != 0)
创建 CString 变量 strInput 保存 从 编辑框中获得的数据 如果返回值不为0 说明获取成功
{ int nIndex = m_cobDemo.AddString(strInput); m_cobDemo.SetCurSel(nIndex); nIndex = m_listDemo.AddString(strInput); m_listDemo.SetCurSel(nIndex); }
int AddString( UINT nStringID );
如果成功则返回被添加的第一个新字符串的从零开始的索引;否则返回-1
参数: nStringID 要添加到工具条控件的字符串列表中去的字符串资源的资源标识符。
int SetCurSel( int nSelect );
调用成功时返回选中的项的下标。如果 nSelect 大于列表中项的个数,则返回 CB_ERR 。如果 nSelect 为 -1 ,则清除当前的选择并返回 CB_ERR 。
往下拉框 列表框 添加数据
nIndex 下拉框 列表框 选中的项下标
int nIndex = m_cobDemo.GetCurSel(); if (-1 < nIndex) { m_cobDemo.DeleteString(nIndex); if (nIndex < m_cobDemo.GetCount()) m_cobDemo.SetCurSel(nIndex); else m_cobDemo.SetCurSel(0); } else { MessageBoxW(L"未选中待删除的项!"); }
整型 nIndex 变量 用来保存 下拉框 列表框 选中的项下标
判断-1 < nIndex 为-1 说明 ComboBox内没有数据 位0 为第一个
删除 第[nIndex] 个 数据
判断 nInde < ComboBox内 个数
选择 第[nIndex] 个 数据
否则 选择 第1 个 数据
否则 弹出消息框 未选中的删除项目
nIndex = m_listDemo.GetCurSel(); if (nIndex > -1) { m_listDemo.DeleteString(nIndex); if (nIndex < m_listDemo.GetCount()) m_listDemo.SetCurSel(nIndex); else m_listDemo.SetCurSel(0); } else { MessageBoxW(L"未选中待删除的项!"); }
这个逻辑跟上面的差不多.......省略了.....
#五 . 总结
学习了如何创建MFC程序
第一个程序
获取控件的TEXT GetDlgItemTextW
设置控件的TEXT SetDlgItemTextW
第二个程序
如果获取当前控件的对象
一种是直接添加增援变量
一种是 通过 GetDlgItem 获取对象指针
GetCheck() 控件是否被按下
第三个程序
ComboBox几个函数
AddString 增加项字符数据
SetCurSel 返回选中的项的下标
GetCount 返回选中的个数
DeleteString 删除项字符串
GetDlgItemTextW