MFC学习记录—— MFC入门

        在上两篇中学习了窗口的底层实现,从本文开始将正式开始学习MFC编程

目录

1.MFC概念及作用

1.1什么是MFC

1.2 为什么要使用MFC呢?

2.MFC基本内容

2.1类层次结构

2.2 头文件

2.3 应用程序分类

3.MFC库中的类

3.1 MFC库中类的概述

3.2 类的导向功能(在此不展开)

代码


1.MFC概念及作用

1.1什么是MFC

        概念:Microsoft 基础类 (MFC) 库针对大部分 Win32 和 COM API 提供面向对象的包装器。 虽然此包装器可用于创建极为简单的桌面应用程序,但当你需要开发具有多个控件的更复杂的用户界面时,此包装器将最为有用。 可以使用 MFC 创建带有 Office 样式用户界面的应用程序。

1.2 为什么要使用MFC呢?

      基于框架编程,提高工作效率,减少开发周期,降低开发成本。

2.MFC基本内容

2.1类层次结构

        基本层次结构如图:

2.2 头文件

        afx.h--包含了MFC中绝大部分类的声明

   afxwin.h--包含了afx.h和windows.h

   afxext.h--提供了对扩展类的支持,例如:工具栏、状态栏...

   附:以Afx...开头的函数,可以确定为MFC库中的一个全局函数;

    以::...开头的函数,可以确定为Win32的API函数;

 2.3 应用程序分类

1、使用MFC库制作自己的控制台程序

  相比Win32控制台程序:

  多了一个全局对象 CWinApp theApp

  入口函数不同于以往的入口函数

2、使用MFC库制作自己的静态库程序

3、使用MFC库制作自己的动态库程序

    1--使用MFC库制作自己的规则动态库(静/动态MFC库)

    2--使用MFC库制作自己的扩展动态库

    区别:规则库可以被所有程序调用,扩展库只能被支持MFC的程序调用

4、使用MFC库制作自己的窗口程序

    1--单文档视图构架程序

   CFrameWnd-框架窗口类,封装了关于框架窗口的操作

   CWinApp-应用程序类,封装了关于程序流程的操作

   CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)

   CView-视图窗口类,封装了关于视图窗口的操作(绘图)

 2--多文档视图构架程序

   CMDIChildWnd-子框架窗口类,封装了关于子框架窗口的操作

   CMDIFrameWnd-主框架窗口类,封装了关于主框架窗口的操作

   CWinApp-应用程序类,封装了关于程序流程的操作

   CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)

   CView-视图窗口类,封装了关于视图窗口的操作(绘图)

   3--对话框构架程序

   CWinApp-应用程序类,封装了关于程序流程的操作

   CDialog-对话框窗口类,封装了关于对话框窗口的操作

3.MFC库中的类

3.1 MFC库中类的概述

        如上图所示, 其中Cobject是MFC中提供了绝大数类的基类。该类完成动态控件的分配与回收,支持一般的诊断、出错信息和文档序列化等。

        CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行。
  CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。
  CDocument类是文档类,包含了应用程序在运行期间所用到的数据。
  CWnd类是一个通用的窗口类,用来提供Windows 中的所有通用特性。
  CView 是用于让用户通过窗口来访问文档以及负责文档内容的显示。
  CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。
  CDialog 类用来控制对话框窗口。
  CMDIFrameWnd和CMDIChildWnd类分别用来多文档应用程序的主框架窗口和文档子窗口的显示和管理。
CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。

        有关类文档的下载:可以参考MFC 类层次结构图 | Microsoft Learn   

3.2 类的导向功能(在此不展开)

1、Message Maps选项卡

2、Member Variables选项卡

3、Automation选项卡

4、ActiveX Events选项卡

5、Class Info选项卡

代码

使用MFC库制作自己的程序窗口:

头文件:

#pragma once
#include<afxwin.h>

class MyApp :public CWinApp//继承应用程序类  
{
public:
	//程序入口
	virtual BOOL InitInstance();

};

class MyFrame :public CFrameWnd//继承CFrameWnd框架
{
public:
	MyFrame();

	//声明宏 提供消息映射机制
	DECLARE_MESSAGE_MAP()

	afx_msg void OnLButtonDown(UINT, CPoint);

	afx_msg void OnChar(UINT, UINT, UINT);

	afx_msg void OnPaint();
};

.cpp


#include"mfs.h"

MyApp app; //全局应用程序对象,有且仅有一个

BOOL MyApp::InitInstance()
{
	//创建窗口
	MyFrame* frame = new MyFrame;

	//显示和更新
	frame->ShowWindow(SW_SHOWNORMAL);
	frame->UpdateWindow();

	m_pMainWnd = frame; //保存指向应用程序的主窗口的指针

	return TRUE; //返回正常初始化

 }




//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)

	ON_WM_LBUTTONDOWN() //鼠标左键按下

	ON_WM_CHAR() //键盘

	ON_WM_PAINT() //绘图宏

END_MESSAGE_MAP()


MyFrame::MyFrame()//创建一个窗口
{
	Create(NULL, TEXT("mfc"));
}

void MyFrame::OnLButtonDown(UINT, CPoint point)//鼠标左键
{

	/*TCHAR buf[1024];
	wsprintf(buf, TEXT("x = %d, y =%d"), point.x, point.y);

	MessageBox(buf);*/

	//mfc中的字符串  CString

	CString str;
	str.Format(TEXT("x = %d ,,,, y = %d "), point.x, point.y);

	MessageBox(str);

}

void MyFrame::OnChar(UINT key, UINT, UINT)//键盘
{

	CString str;
	str.Format(TEXT("按下了%c 键"), key);

	MessageBox(str);

}

void MyFrame::OnPaint()//绘画
{
	CPaintDC dc(this);  //CDC里找其他的能画的图形 

	dc.TextOutW(100, 100, TEXT("这是一个⚪ "));
	//画椭圆
	dc.Ellipse(10, 10, 100, 100);

	//多字节转为 宽字节 
	//TEXT是由自适应编码的转换
	// TCHER 自适应编码的转换
	//MessageBox(L"aaa");

	//统计字符串长度
	int num = 0;
	const char* p = "aaaa";
	num = strlen(p);

	//统计宽字节的字符串长度
	const wchar_t* p2 = L"bbbb";
	num = wcslen(p2);

	//char * 与 CString之间的转换   C++  string  .c_str();
	//char* -> CString
	const char* p3 = "ccc";
	CString str = CString(p3);
	//CString  -> char *
	CStringA tmp;
	tmp = str;
	char* pp = tmp.GetBuffer();



}

文章参考:(21条消息) 初识MFC----MFC简介_weixin_30367169的博客-CSDN博客

(21条消息) MFC基础类及其层次结构_weixin_33797791的博客-CSDN博客

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VC++(MFC)数据库程序开发,需要以下几个步骤: 1. 创建数据库 2. 创建表 3. 编写 VC++(MFC)程序 4. 连接数据库 5. 增删改查数据 下面,我们一步一步来实现一个简单的 VC++(MFC)数据库程序。 1. 创建数据库 我们使用 Microsoft SQL Server 数据库。首先,在 SQL Server Management Studio 中创建一个新的数据库。假设我们的数据库名称为 "TestDB"。 2. 创建表 在 "TestDB" 数据库中,创建一个新的表 "Student"。该表包含以下字段: - 学生编号(StudentID):int 类型,主键,自增长 - 姓名(Name):nvarchar(50) 类型 - 年龄(Age):int 类型 - 性别(Gender):nvarchar(10) 类型 3. 编写 VC++(MFC)程序 打开 VC++(MFC) 编辑器,创建一个新的 MFC 应用程序。在 "应用程序类型" 中选择 "单文档",在 "使用 MFC 的类型" 中选择 "使用数据库支持"。 4. 连接数据库 在 "OnInitInstance" 函数中,添加以下代码: ```c++ if (!AfxDaoInit()) { AfxMessageBox("Failed to initialize DAO!"); return FALSE; } CDatabase database; if (!database.OpenEx(_T("ODBC;DSN=TestDB;UID=sa;PWD=123456"))) { AfxMessageBox("Failed to open database!"); return FALSE; } CDaoDatabase* pDaoDB = &database; ``` 这里,我们使用 ODBC 连接数据库。"DSN" 是数据源名称,"UID" 和 "PWD" 是登录数据库的用户名和密码。当然,你也可以使用其他的数据库连接方式。 5. 增删改查数据 在 "Student" 表中插入一条记录: ```c++ CDaoRecordset recordset(pDaoDB); recordset.Open(dbOpenDynaset, _T("SELECT * FROM Student"), dbAppendOnly); recordset.AddNew(); recordset.SetFieldValue(_T("Name"), _T("张三")); recordset.SetFieldValue(_T("Age"), 20); recordset.SetFieldValue(_T("Gender"), _T("男")); recordset.Update(); ``` 在 "Student" 表中查询记录: ```c++ CDaoRecordset recordset(pDaoDB); recordset.Open(dbOpenDynaset, _T("SELECT * FROM Student"), dbReadOnly); CString strResult; while (!recordset.IsEOF()) { CString strName, strGender; int nAge; recordset.GetFieldValue(_T("Name"), strName); recordset.GetFieldValue(_T("Age"), nAge); recordset.GetFieldValue(_T("Gender"), strGender); strResult.Format(_T("%s\t%d\t%s"), strName, nAge, strGender); AfxMessageBox(strResult); recordset.MoveNext(); } ``` 在 "Student" 表中更新记录: ```c++ CDaoRecordset recordset(pDaoDB); recordset.Open(dbOpenDynaset, _T("SELECT * FROM Student"), dbAppendOnly); recordset.MoveFirst(); recordset.SetFieldValue(_T("Age"), 21); recordset.Update(); ``` 在 "Student" 表中删除记录: ```c++ CDaoRecordset recordset(pDaoDB); recordset.Open(dbOpenDynaset, _T("SELECT * FROM Student"), dbAppendOnly); recordset.MoveFirst(); recordset.Delete(); ``` 到此为止,我们就完成了一个简单的 VC++(MFC)数据库程序。当然,这只是一个入门级别的程序,实际开发中还需要更多的功能和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值