黑马程序员MFC学习第三天
0x00:MFC第三天是实现一个项目
,如下图
0x01:我记录了一些写这个项目的知识点(笔记略显粗糙)
//完整的老师的课件与手册地址:https://pan.baidu.com/s/1mqhKBSaJeZOoIFezNA090w 提取码vvhr
一、 新建项目
1、项目配置
2、修改图标
CMainFrame.h->CMainFrame.cpp->OnCreate
SetClassLong(m_hWnd,GCL_HICON,(LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN)); //句柄(为啥是这个句柄),修改的种类,加载图标
3、设置标题
右标题:Create():
SetTitle(TEXT("2021-12-19"));
左侧标题:
CSaleSystemDoc->OnNewDocument()
SetTitle();
4、设置窗口大小
MoveWindow(0,0,800,500);//x,y,宽高//
居中:
CenterWindow();
二、 文件处理
这里引入了两个文件 InfoFile.h与InfoFile.cpp,新构成了一个类,目的就是完成对文件的读写
三、登录对话框
1、caption :标题
2、exit(0)与CDialog::OnClodse的区别是前者退出所以窗口,后者退出当前窗口
3、设置Password为True:
4、IsEmpty()函数属于CStirng类的,判断str字符串中是否为空
5、在初始化之前打开登录弹窗
6、在CLoadDlg中重写初始化函数
7.重写OnOk();处理回车
8、重写OnClose(这是一个消息,当我们关闭该窗口时,就会触发这个消息,关闭当前窗口)
我们不要关闭当前窗口而要关闭所有窗口
9、CDialog下好像没有OnClose这个函数,不过可以使用OnCancel代替
PS:enum:强类型枚举与#define有点相似
PS:我觉得CMFC项目App那个类有点比较全局的感觉
而具体的操作都是在各个窗口中进行
PS:CMainFrame像是创建窗口的中心
四、静态拆分窗口
1、定义两个类:
CSelectView和CDisplayView(随便起名字)
CSelectView一定继承与CTreeview,CDisplay继承于CFormView
2、在CMainFrame中添加拆分窗口对象
3、CMainFrame函数中重写OnCreateClient函数
4、设置成拆分为一行两列
CreateStatic(this,1,2);代表一行两列
5、设置左侧右侧显示的内容
CreateView(0,1,RUNTIME_CLASS(CDisplay),CSize(200,500),pContext);
//指定用来放置新视的分隔器窗口行,列,指定新视的CRuntimeClass,大小,指向用来创建
此视的创建环境的指针
RUNTIME_CLASS利用这个宏通过C++类的名字获得一个运行时类结构。
6、
五、树视图
1、树控件的使用
2、
重写这个函数 OnInitialUpdate
3、添加指示选定项
添加这个消息
4、获取当前选定项目
m_treeCtrl->GetSelectedItem
5、
通过这个选定项,获取该项内容
m_treeCtrl->GetItemText(item)
六、个人信息界面搭建
1、为达到类似TableCtrl的效果,需要添加User界面
别忘了Style要改成Child类型
2、
注意基类继承CFormView
七、界面挂载
1、自定义消息
WM_USER是用户自定义消息的起始值
2、
OnMessageBox处理自定义消息
3、BEGIN_MESSAGE_MAP( theClass, baseClass )这是一个宏函数
theClass |
指定消息映射所属的类的名字。 |
baseClass |
指定theClass的基类的名字。 |
说明:
使用BEGIN_MESSAGE_MAP宏开始你的消息映射的定义。
在你的类的成员函数的实现文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏开始消息映射,
然后为每个消息处理函数加入一个入口,最后用END_MESSAGE_MAP宏结束消息映射。
中间是ON_MESSAGE
ON_MESSAGE:
这个宏指明哪个函数将处理用户定义的消息。用户定义的消息通常位于WM_USER和0x7FF
F之间。用户定义的消息是指不属于标准的WindowsWM_MESSAGE消息的任何消息。对于
每个需要被映射到消息处理函数的用户自定义消息,在你的消息映射中都必须有且只能有一
个ON_MESSAGE宏语句。
4、自定义消息处理函数
5、发送自定义信号
PostMessage,在CSelectView的OnTvnSelchanged函数中,发送自定义信号
6、就是通过宏让OnMychange函数处理PostMessage函数发送的消息
7、CCreateContext结构体
m_pNewViewClass |
待创建的视图的CRuntimeClass |
m_pCurrentDoc |
将在其上创建视图的文档 |
m_pNewDocTemplate |
待创建的新MDI框架窗口的文档模板 |
m_pLastView |
待创建视图所依据的原始视图,例如在创建分裂窗口的视图或文档的第二个框架窗口时 |
m_pCurrentFrame |
待创建框架窗口所依据的框架窗口,例如在文档上创建第二个框架窗口时 |
|
|
8、GetPane
9、CreateView
10、RecalcLayout()函数,激活布局
11、OnInitialUpdate初始化代码,属于CDUser类
12、SetActivePane激活指定位置的活动窗格
13、
在CSelectView的我们上次新填的OnTvnSelchanged中添加PostMessage
14、PostMessage加冒号的原因是告诉编译器这里使用的是全局函数
避免使用到局部定义的test命名空间或者函数
MFC中自己的PostMessage好像只能发给自己
15、CreateView
该函数在这一步尤其重要
16、
//CWnd::PostMessage 将一个消息放入窗口的消息队列
//AfxGetMainWnd():框架窗口对象的指针
//AfxGetMainWnd()->GetSafeHwnd():获取返回窗口的句柄,CWnd::GetSafeHwnd
//NM_A:发送自定义消息
//(WPARAM)NM_A:指定了附加的消息信息
//(LPARAM)0:指定了附加的消息信息,此参数这里没有意义
Ps:c语言#pragma once的意思:
https://zhuanlan.zhihu.com/p/407274136
八、个人信息完善
1、 重写OnInitialUpdate函数
2、 CString转CStringA
九、销售管理功能实现
1、下拉框,选择Drop List
2、编辑框,只读
3、重写初始化函数
4、string转CString
5、控件切换触发CBN_SELCHANGE
6、list容器
十、库存信息窗口
1、重写OnInitialUpdate
2、_T是TEXT的宏
十一、添加商品个数功能实现
1、 获取当前选定内容GetLBText
2、更新左边框
第一个方法:
//OnInitialUpdate();
//m_combo.ResetContent();//更新一下左边的增加数量功能的框//
//OnInitialUpdate();
//下面这个方法更好://
m_combo.InsertString(0,m_name2);
m_combo.SetCurSel(0);
OnInitialUpdate();
十二、库存删除窗口
。。。没啥好说的,到了后面都是重复的内容…
十三、菜单栏
1、菜单栏在Menu中
.....
0x10:小小纪念
我完成这个项目的时候是圣诞节前夜,我简单的贴了个圣诞树小小的纪念一下
0x11:GitHub链接
作业已上传到GitHub:https://github.com/TL-SN/MFCjob
__EOF__

本文链接:https://www.cnblogs.com/lordtianqiyi/articles/15729570.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现