黑马程序员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__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15729570.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示