当前位置:网站首页>vs2019 第一个MFC应用程序
vs2019 第一个MFC应用程序
2022-07-06 09:14:00 【imxlw00】
创建项目
项目的创建和之前一样,只是此次的源文件后缀为.cpp,因为MFC是由C++编写的,编写MFC程序需要包含**#include <afxwin.h>**头文件。
编写代码
mfc.h
#pragma once
#include <afxwin.h>
class MyApp :public CWinApp//CWinApp应用程序类
{
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFrame :public CFrameWnd
{
public :
MyFrame();
};
mfc.cpp
#include "mfc.h"
MyApp app;//全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame* frame = new MyFrame();
//显示和更新
frame->ShowWindow(SW_NORMAL);
frame->UpdateWindow();
//保存指向应用程序的主窗口的指针
m_pMainWnd = frame;
//返回正常初始化
return TRUE;
}
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));
}
运行程序
配置环境
右击项目属性
显示了一个空空的界面
程序执行流程
① 程序开始时,先实例化应用程序对象(有且只有一个)
② 执行程序的入口函数InitInstance()
③ 给框架类MyFrame对象动态分配空间(自动调用它的构造函数),在其构造函数内部,通过CWnd::Create创建窗口
④ 框架类对象显示窗口CWnd::ShowWindow
⑤ 框架类对象更新窗口CWnd::UpdateWindow
⑥ 保存框架类对象指针CWinThread::m_pMainWnd
消息映射
消息映射是一个将消息和成员函数相互关联的表。比如,框架窗口接收到一个鼠标左击消息,MFC将搜索该窗口的消息映射,如果存在一个处理WM_LBUTTONDOWN消息的处理程序,然后就调用OnLButtonDown。
下面是是将消息映射添加到一个类中所做的全部工作:
1)所操作类中,声明消息映射宏。
2)通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息。
3)对应消息处理函数分别在类中声明,类外定义:
增加消息处理
让程序动起来吧!!!
//声明宏 提供消息映射机制
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN() //鼠标左键按下
ON_WM_CHAR() //键盘
ON_WM_PAINT() //绘图宏
END_MESSAGE_MAP()
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;
char * p = "aaaa";
num = strlen(p);
//统计宽字节的字符串长度
wchar_t * p2 = L"bbbb";
num = wcslen(p2);
//char * 与 CString之间的转换 C++ string .c_str();
//char* -> CString
char * p3 = "ccc";
CString str = CString(p3);
//CString -> char *
CStringA tmp;
tmp = str;
char * pp = tmp.GetBuffer();
}
边栏推荐
猜你喜欢
QT creator specifies dependencies
[free setup] asp Net online course selection system design and Implementation (source code +lunwen)
Use dapr to shorten software development cycle and improve production efficiency
一键提取pdf中的表格
引入了junit为什么还是用不了@Test注解
Learning question 1:127.0.0.1 refused our visit
AI benchmark V5 ranking
QT creator test
Basic use of redis
QT creator custom build process
随机推荐
【博主推荐】asp.net WebService 后台数据API JSON(附源码)
Remember the interview algorithm of a company: find the number of times a number appears in an ordered array
Swagger、Yapi接口管理服务_SE
Introduction and use of automatic machine learning framework (flaml, H2O)
PyCharm中无法调用numpy,报错ModuleNotFoundError: No module named ‘numpy‘
[ahoi2009]chess Chinese chess - combination number optimization shape pressure DP
MySQL master-slave replication, read-write separation
Why can't I use the @test annotation after introducing JUnit
[recommended by bloggers] C # generate a good-looking QR code (with source code)
One click extraction of tables in PDF
图像识别问题 — pytesseract.TesseractNotFoundError: tesseract is not installed or it‘s not in your path
Install mongdb tutorial and redis tutorial under Windows
02-项目实战之后台员工信息管理
Principes JDBC
Ubuntu 20.04 安装 MySQL
JDBC原理
安装numpy问题总结
Leetcode 461 Hamming distance
报错解决 —— io.UnsupportedOperation: can‘t do nonzero end-relative seeks
一键提取pdf中的表格