vs2019-安装MFC


title: vs2019 安装配置MFC
time: 2019年8月27日22:55:57


vs2019 MFC

安装MFC

  • 打开vs安装程序

  • 选中c++桌面开发

  • 选择Visual Studio扩展开发

  • (若想快速配置)选择C++ MFC 生成工具(x86 和 x64)进行安装

  • 选择修改,等待安装

  • 创建新项目,选择MFC应用

空项目 配置MFC 快速构建

  • 新建头文件
  #include//mfc头文件
  //应用程序类CWinApp,定义MyAPP类,作为派生类(子类)
  class MyApp : public CWinApp
  {
  public:
  	//基类的虚函数(接口),子类去实现
  	//MFC程序的入口地址
  	virtual BOOL InitInstance();
  };//定义类结尾要加;

  class MyFrame:public CFrameWnd
  {
  public:
  	MyFrame();	//构造函数

  };
  • 新建源文件

    #include "mfc.h"
    
    MyApp myapp;
    
    //表示调用头文件的构造函数
    MyFrame::MyFrame() {
    	//创建入口
    	Create(NULL, TEXT("我的第一个MFC窗口"));
    
    }
    
    //实现父类方法
    BOOL MyApp::InitInstance() {
    	//1、创建框架类对象
    	MyFrame* myframe = new MyFrame; //调用上面的定义的方法
    	//2、显示窗口
    	myframe->ShowWindow(SW_SHOWNORMAL);
    	//3、更新窗口
    	myframe->UpdateWindow();
    	//4、保存框架类对象指针
    	m_pMainWnd = myframe;
    
    	return TRUE;//初始化正常,返回true
    }
    
  • 项目----属性----配置属性----高级----MFC的使用设为在共享DLL中使用MFC

  • 运行

  • 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)"报错

    • 项目----属性----配置属性----链接器----系统----子系统设为窗口Windows

消息映射

  • 声明宏,写到.h中

    //声明消息映射宏,必须在类声明中(相当于开启的入口)
    DECLARE_MESSAGE_MAP();
    
  • 分界宏

    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//开始
        
    END_MESSAGE_MAP()//结束
    
  • 找消息宏,放在分界宏中间

    //分界宏
    //定义消息宏,必须在类实现中
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//开始
    	ON_WM_LBUTTONDOWN()//鼠标左键按下
    	ON_WM_CHAR()//键盘
    	ON_WM_PAINT()//绘图
    END_MESSAGE_MAP()//结束
    
  • 找函数原型,声明写到.h中

    //函数的声明
    
    	//鼠标
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    	//键盘
    	afx_msg void OnChar(UINT, UINT, UINT);
    	//绘图
    	afx_msg void OnPaint();
    
  • 函数的实现,写到.cpp中

    void MyFrame::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	//底层的方式
    	/*TCHAR b[1024];
    	wsprintf(b, TEXT("x = %d,y = %d"), point.x, point.y);
    	MessageBox(b);*/
    
    	//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);
    	char str[1024] = TEXT("Inifited");//不能用String
    		
    	dc.TextOutA(100, 100, str);
    	dc.TextOutA(100, 200, TEXT("harder"));
    	
    	dc.Ellipse(100, 100, 200, 200);
    	
    }
    
  • 头文件

    #include//mfc头文件
    
    //应用程序类CWinApp,定义MyAPP类,作为派生类(子类)
    class MyApp : public CWinApp
    {
    public:
    	//基类的虚函数(接口),子类去实现
    	//MFC程序的入口地址
    	virtual BOOL InitInstance();
    };//定义类结尾要加;
    
    class MyFrame:public CFrameWnd
    {
    public:
    	MyFrame();	//构造函数
    
    	//声明消息映射宏,必须在类声明中(相当于开启的入口)
    	DECLARE_MESSAGE_MAP();
    	//函数的声明
    
    	//鼠标
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    	//键盘
    	afx_msg void OnChar(UINT, UINT, UINT);
    	//绘图
    	afx_msg void OnPaint();
    
    };
    
    
  • 源文件

    #include "mfc.h"//引入头文件
    
    MyApp myapp;
    
    //表示调用头文件的构造函数
    MyFrame::MyFrame() {
    	//创建入口
    	Create(NULL, TEXT("我的第一个MFC窗口"));
    
    }
    //分界宏
    //定义消息宏,必须在类实现中
    BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//开始
    	ON_WM_LBUTTONDOWN()//鼠标左键按下
    	ON_WM_CHAR()//键盘
    	ON_WM_PAINT()//绘图
    END_MESSAGE_MAP()//结束
    
    
    void MyFrame::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	//底层的方式
    	/*TCHAR b[1024];
    	wsprintf(b, TEXT("x = %d,y = %d"), point.x, point.y);
    	MessageBox(b);*/
    
    	//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);
    	char str[1024] = TEXT("Inifited");
    		
    	dc.TextOutA(100, 100, str);
    	dc.TextOutA(100, 200, TEXT("harder"));
    	
    	dc.Ellipse(100, 100, 200, 200);
    	
    }
    
    //实现父类方法
    BOOL MyApp::InitInstance() {
    	//1、创建框架类对象
    	MyFrame* myframe = new MyFrame; //调用上面的定义的方法
    	//2、显示窗口
    	myframe->ShowWindow(SW_SHOWNORMAL);
    	//3、更新窗口
    	myframe->UpdateWindow();
    	//4、保存框架类对象指针
    	m_pMainWnd = myframe;
    
    	return TRUE;//初始化正常,返回true
    }
    
    
  • Windows字符集

    • c++中的string操作

      #include
      #include 
      
      using namespace std;
      int main() {
      
      	//使用string 插入#include 
      	string s = "hello";
      	cout << s << endl;
      	const char* c = s.c_str();//string 类型转换为char类型,要在前面加上const
      	cout << c << endl;//输出c指针指向的内容
      	cout << *c << endl;//输出c指针指向的第一个字符
      	cout << *(c + 1) << endl;//输出c指针指向的第二个字符
      	cout << *c + 1 << endl;//输出c指针指向的第一个字符的下个ASCII码的序号
      	cout << char(*c + 1) << endl;//把ascii码转为字符
      
      	//出现 "const char *" 类型的值不能用于初始化 "char *" 类型的实体
      	//右键项目->属性->C/C++->语言->符合模式:选择否
      
      	//统计多字节的长度
      	char* ch = "helloWorld";
      	int num = strlen(ch);
      	cout << num << endl;
      
      
      	//统计宽字节的字符串长度
      	wchar_t* wc = L"start";
      	int num2 = wcslen(wc);
      	cout << num2 << endl;
      
      		return 0;
      }
      
    • 多字节字符串转宽字节L

      //默认是Unicode,宽字节,而“aaa”是多字节,要想能输出,需要把aaa前加个L,转为宽字节
      	MessageBox(L"baa");
      
    • 声明宽字节字符串 wchar_t

      wchar_t* wc = L"start";
      
    • 统计宽字节字符串 wcslen

      int num2 = wcslen(wc);
      
    • Text做了自适应编码转换

      //而加上Text则是,自适应编码的转换
      	MessageBox(TEXT("aaa"));
      
      	//TChar()也是自适应的编码的转换。所以在mfc中建议使用TChar()而不是Char
      
      
    • char*与CString的转换

      //char* 与CString之间的转换
      
      	//1、char*转CString
      	char* p = "right";
      	CString cs = CString(p);//调用有参构造函数。 
      
      	//2、CString转char*
      	CStringA csa = cs;
      	char* ps = csa.GetBuffer();
      
      	//若想string与CString转换,需要先把string转换为char* 再让char*与CString转换
      
      
  • 利用vs向导创建mfc

    • 流程
      • 单个文档
      • MFC standard
      • 完成
    • 视图
      • 类视图
    • 添加鼠标、键盘、绘图
      • 框架窗口是视窗口的父窗口,视窗口覆盖在框架窗口之上,所以要在视窗口添加消息
      • 右击CMFCView的属性,点击消息,选中自己需要的add就行了

你可能感兴趣的:(MFC)