【MFC】01.MFC框架-笔记

基本概念

MFC Microsoft Fundation class 微软基础类库

框架 基于Win32 SDK进行的封装

属性:缓解库关闭

属性->C/C++/代码生成/运行库/MTD

属性->常规->MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库

SDK版本:开发软件的套件

WSK:开发驱动的套件

MFC基于类的管理

预编译头:

Demo01.h

Demo01.cpp

Demo01Dlg.cpp

  • Demo01Dlg.h

    绑定在对话框上的类

    类的继承关系:

    Cobject:处理序列化以及反序列化

    CCmdTarget:处理WM_COMMAND消息

    CWnd:窗口类

    CDialog:对话框

    CDialogEx:对话框

    Demo01Dlg:自己创建的对话框

  • OnInitDialog:对话框MFC框架的入口

  • MFC里和窗口句柄有关的函数,均不需要填写窗口句柄函数

  • 如果需要,添加作用域强行退出MFC的命名空间

  • 模态对话框

  • 非模态对话框

MFC中依然支持SDK的做法

类绑定:

  1. 添加类
  2. 类名

MFC绑定变量:

值类型

控件类型

复习总结:

  • 创建MFC项目的时候,项目名称中不能出现中文。

  • 如果想要兼容让其他没有安装visual studio的计算机使用,那么就要使用在静态链接库中使用MFC

  • MFC是基于类的

  • Practice.h:

    该文件为我们创建了CPracticeApp类

    类的继承关系:

    (上面还有很多)

    CWinThread:应用程序线程,继承CCmdTarget

    CWWinApp:对话框,继承CWinThread

    CPraticeApp:是我们自己的应用程序类,继承CWinApp

  • PracticeDlg.h:

    这个头文件中是我们自己创建的对话框类

    类继承关系:

    CObject:基础类库中的主体基类,处理序列化与反序列化

    CCmdTarget:消息映射结构体系类,继承Cobject

    CWnd:窗口类,继承CCmdTarget

    CDialog:对话框类,继承CWnd

    CDialogEx:对话框类,继承CDialog

    CPraticeDlg:我们自己的对话框类,继承CDialogEx

相关操作:

  • 按钮操作:在对话框上双击按钮即可编辑相关操作

  • 添加对话框:比如说要在某个按钮上添加对话框,首先需要画出对话框,然后双击添加MFC类,在要显示的时候,先用这个类声明一个变量,然后使用DoModal方法,也可以先new出该对话框的类,然后使用Create方法,创建出对话框,但是这种方法需要ShowWindow方法,

    实例:

    第一种:

    c_cpp 复制代码
        CDialogOne obj;
        obj.DoModal();

    第二种:

    c_cpp 复制代码
      CDialogTwo *obj = NULL;
        obj = new CDialogTwo;
        obj->Create(IDD_DIALOG2, this);
        obj->ShowWindow(SW_SHOW);
  • 可以在按钮上添加变量,比如说在一个按钮上添加了一个文本框变量,将其添加为值的形式,字符串类型,那么我们在处理按钮的时候,可以直接:

    其中UpDateData方法的作用是同步

    c_cpp 复制代码
        UpdateData(TRUE);
        m_EDIT = L"欢迎来到MFC的世界!";
        UpdateData(FALSE);
  • 在MFC中,有很多消息是自己处理了,我们并不用关心,但是如果我们要自己处理消息

    • 处理SendMessage消息:

      在对话框中使用类向导,添加OnWndMsg方法,在OnOwnMsg方法中,我们可以像SDK那样处理消息。

      c_cpp 复制代码
      BOOL CPracitceDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
      {
      	// TODO: 在此添加专用代码和/或调用基类
      	switch (message) {
      	case WM_KEYDOWN: {
      		switch (wParam) {
      		case VK_F4: {
      			MessageBox(L"F!", L"MSG", NULL);
      			break;
      		}
      		}
      		break;
      	}
      	case WM_LBUTTONDOWN: {
      		MessageBox(L"WM_LBUTTONDOWN", L"MSG", NULL);
      		break;
      	}
      	case 199: {
      		MessageBox(L"SEND199", L"MSG", NULL);
      		break;
      	}
      	case 200: {
      		break;
      		MessageBox(L"SEND200", L"MSG", NULL);
      	}
      	case 201: {
      		MessageBox(L"SEND201", L"MSG", NULL);
      		break;
      	}
      	case 202: {
      		MessageBox(L"SEND202", L"MSG", NULL);
      		break;
      	}
      	}
      
      	return CDialogEx::OnWndMsg(message, wParam, lParam, pResult);
      }
    • 处理PostMessage消息:

      在对话框中使用类向导,添加PreTranslateMessage方法,在PreTranslateMessage方法中,我们可以像SDK那样处理消息。

      c_cpp 复制代码
      BOOL CPracitceDlg::PreTranslateMessage(MSG* pMsg)
      {
      	// TODO: 在此添加专用代码和/或调用基类
      	switch (pMsg->wParam) {
      	case 199: {
      		MessageBox(L"POST199", L"MSG", NULL);
      		break;
      	}
      	case 200: {
      		break;
      		MessageBox(L"POST200", L"MSG", NULL);
      	}
      	case 201: {
      		MessageBox(L"POST201", L"MSG", NULL);
      		break;
      	}
      	case 202: {
      		MessageBox(L"POST202", L"MSG", NULL);
      		break;
      	}
      	}
      	return CDialogEx::PreTranslateMessage(pMsg);
      }
  • SendMessage会等待消息响应,会阻塞,所以会按照顺序来,但是PostMessage不会等待消息返回,所以导致顺序倒置:

    c_cpp 复制代码
    void CPracitceDlg::OnBnClickedButton1()
    {
    	//CDialogOne obj;
    	//obj.DoModal();
    	///*
    	//HWND hEdit1Dlg = ::GetDlgItem(m_hWnd, IDC_EDIT1);
    	//::SetWindowText(hEdit1Dlg, L"欢迎来到MFC的世界!");*/
    	//UpdateData(TRUE);
    	//m_EDIT = L"欢迎来到MFC的世界!";
    	//UpdateData(FALSE);
    	//SendMessage(199, NULL, NULL);
    	//SendMessage(200, NULL, NULL);
    	//SendMessage(201, NULL, NULL);
    	//SendMessage(202, NULL, NULL);
    	PostMessage(199, NULL, NULL);
    	PostMessage(200, NULL, NULL);
    	PostMessage(201, NULL, NULL);
    	PostMessage(202, NULL, NULL);
    }
相关推荐
akinggw6 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
東隅已逝,桑榆非晚7 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
eggwyw8 小时前
C++相交链表和反转链表详解
开发语言·c++
杜 硕8 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
小超人诞生日记8 小时前
C++ STL 反向迭代器:从源码框架到适配器实现
c++·算法
青少儿编程课堂8 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园成语接龙大挑战解析
c++·python·算法·bfs·信息学竞赛
小贾要学习9 小时前
【C++后端开发项目】Reactor 模型 / C++ 仿写 muduo HTTP 服务器:让底层网络库真正跑起网页
linux·服务器·c++·http·网络编程·muduo·reactor模型
A7bert7779 小时前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
青少儿编程课堂10 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛