MFC以C++形式封装了Windows API

//实践

编写MFC需要的头文件#include <afxwin.h>

程序执行流程:

1.实例化应用程序对象(有且只有一个)

2.执行程序入口函数 InitInstance

3.给框架类MyFrame对象动态分配空间(自动调用他的构造函数),在其构造函数内部,通过CWnd::Create 创建窗口

4.框架类对象显示窗口 CWnd::ShowWindow

5.框架类对象更新窗口 CWnd::UpdateWindow

6.保存框架类对象指针 CWinThread::m_pMainWnd

文件名:mfc.h

#include <afxwin.h>//mfc头文件

//应用程序类CWinApp,派生类
Class MyApp: public CWinApp{
public:
virtual BOOL InitInstance(); //基类的虚函数,派生类只是重写,MFC程序的入口地址
}; //框架类CFrameWnd ,派生类MyFrame
Class MyFrame: public CFrameWnd{
public:
MyFrame();//构造函数
DECLARE_MESSAGE_MAP()//消息映射宏,声明必须用在类声明中,即 .h 文件中
afx_msg void OnLButtonDown(UINT,CPoint)//鼠标声明,value
afx_msg void OnChar(UINT,UINT,UINT)//键盘声明
afx_msg void OnPaint()//绘画
};

文件名:mfc.cpp

#include "mfc.h"//对应类声明的头文件

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

BOOL MyApp::InitInstance(){//程序入口地址
MyFrame *frame=new MyFrame;//1.创建框架类对象 frame->ShowWindow(SW_SHOWNORMAL);//2.显示窗口
frame->UpdateWindow();//3.更新窗口 m_pMainWnd=frame;//4.保存指向应用程序主窗口的指针,实现自动管理
return TRUE;//初始化正常则返回true
} //分界宏
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN()//鼠标左键按下 key
ON_WM_CHAR()//键盘按下
END_MESSAGE_MAP() MyFrame::MyFrame(){
Create(NULL,TEXT("mfc"));//创建窗口
} void MyFrame::OnLButtonDwon(UNIT,CPoint point){//鼠标按下
/*
TCHAR buf[1024];//TCHAR 是MFC中的字符数组
wsprintf(buf,TEXT("x=%d,y=%d"),point.x,point.y);//转译
MessageBox(buf);//区别于底层的MessageBox,MFC中实则是MessageBox method 在MSDN中可查
*/
//mfc中的字符串 CString
CString str;
str.Format(TEXT("x=%d,,,y=%d"),point.x,point.y);//格式化
MessageBox(str);
} void MyFrame::OnChar(UNIT key,UNIT,UNIT){//键盘按下
CString str;
str.Format(TEXT("按下了 %c 键"),key);
MessageBox(str);
} void MyFrame::OnPaint(){//绘画
CPaintDC dc(this);//this指定绘图设备
//帮助文档,在CDC里找其他能画的图形
dc.TextOutW(,,TEXT("为了部落"));
dc.Ellipse(,,,);//画椭圆,两点锁定矩形内切圆
}

帮助文档:《VC++之MFC类库中文手册》。最上面是层次结构;最下面是消息映射宏。

查找Create要搜索 :CFrameWnd::Create

ps:右键项目->属性->常规->MFC的使用->在共享DLL中使用MFC

//理论

  • 消息映射机制

即将消息和成员函数互相关联的表,MFC中没有事件和信号桥的概念,只有每个消息映射一个函数

ps:消息映射宏查找,在中文手册最下面。

声明宏:

DECLARE_MESSAGE_MAP()

分界宏:

BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)

END_MESSAGE_MAP()

程序执行流程:

    • 声明宏 写到 .h 中
    • 分界宏 写到 .cpp 中
    • 找消息宏 写到 分界宏 中
    • 把函数原型声明 写到 .h 中
    • 函数实现 写到 .cpp 中
  • windows 字符集

MessageBox(TEXT(“aaa”));

TEXT 自适应编码转换(即,定义里可定制多字节和宽字节):

右键项目->属性->常规->字符集->使用多字节字符集/使用Unicode字符集

Ps:TCHAR 也有自适应编码转换

“aaa”   多字节:一个字符对应一个字节

L“aaa” 宽字节:一个字符对应多个字节 Unicode:UTF-8 3个;GBK 2个;

多字节转为宽字节:MessageBox(L “aaa”);

//统计字符串长度

int num=;

char *p="aaa";
num=strlen(p); wchar_t *p2="bbbb";
num=wcslen(p2);

//char* 与 CString 之间的转换

C++ string 与 MFC CString 不可直接转换,要通过 char * .c_str();

//char*->CString
char *p3="ccc";
CString str=CString(p3); //CString->char*
CStringA tmp=str;
char *pp=tmp.GetBuffer();

MFC/QT 学习笔记(二)——MFC入门的更多相关文章

  1. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  2. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)

    新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...

  3. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...

  4. MFC/QT 学习笔记(一)——认识windows基础库

    MFC (微软基础类库),Windows系统平台做GUI尚且OK,但不支持跨平台. //Windows消息机制: //1.SDK与API Software Development Kit,为特定软件框 ...

  5. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(下)

    //5.列表控件 ListControl 属性 报表模式 view:Report:添加变量 //Cdemo5Dlg.cpp ps:资源视图 右键 类向导 成员变量 查看对象所属类 // TODO: 在 ...

  6. 【Qt编程】Qt学习笔记<二>

    1.      QApplication类和QWidget类都包含在QtGui模块中.所以我们可以只包含这个头文件即可. 2.      在c++中,用new分配了内存空间就需要用delete来释放空 ...

  7. Mybatis学习笔记(二) —— mybatis入门程序

    一.mybatis下载 mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases 下载完后的目录结构: 二. ...

  8. netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...

  9. tensorflow学习笔记二:入门基础

    TensorFlow用张量这种数据结构来表示所有的数据.用一阶张量来表示向量,如:v = [1.2, 2.3, 3.5] ,如二阶张量表示矩阵,如:m = [[1, 2, 3], [4, 5, 6], ...

随机推荐

  1. 在ubuntu18.04下搭建kvm

    前一段时间一直在尝试Ubuntu上搭建xen,一直出现各种问题,各种坑 首先先感谢下面这个公司对我的耐心解答,非常感谢.特别是后面来的电话对我进行了详细的解答,所以选择搭建kvm. 1. 需要检查一下 ...

  2. 创建dynamics CRM client-side (八) - 获取attribute的值 和 设置disable

    大家可以用下面的方式来获取attribute的值 formContext.getAttribute("address1_shippingmethodcode").getText() ...

  3. 【WPF学习】第二十一章 特殊容器

    内容控件不仅包括基本控件,如标签.按钮以及工具提示:它们还包含特殊容器,这些容器可用于构造用户界面中比较大的部分区域. 首先介绍ScrollViewer控件,该控件直接继承自ContentContro ...

  4. JS-01-js的三种引入方式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. c++中值传递,址传递,引用传递

    概念详解 1. 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值. 从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出: 当函数内部需要修改参数,并 ...

  6. ubuntu18.04系统下无外部显示问题解决

    记录一下自己作死过程. 由于学习的需要,在windows10下装了ubuntu18.04系统,第一次装这个系统时,也出现了无外部显示,那时候是老师帮忙搞好的,当时没太在意,只是走马关花的看了老师操作了 ...

  7. 每日一练PAT_B_PRAC_1002

    NowCoder最近在研究一个数列:* F(0) = 7* F(1) = 11* F(n) = F(n-1) + F(n-2) (n≥2)他称之为NowCoder数列.请你帮忙确认一下数列中第n个数是 ...

  8. HDU_1222_GCD

    http://acm.hdu.edu.cn/showproblem.php?pid=1222 直接用GCD就可以了,gcd大于1表明每次一周后偏移量为0. #include<iostream&g ...

  9. POJ_1222_高斯消元

    题目描述: 每组数据给出一个5*6的0 1矩阵,每次操作可以把某个位置及其四周的位置0 1置换,要求输出操作位置的矩阵. 思路: 每个位置操作2次则等于没有操作,所以每个位置有操作和不操作两种选择,爆 ...

  10. JCL、SLF4J、Log4J、Log4J2、LogBack和JUL之间的关系,你搞清楚了吗?

    写在前面 日志组件是我们平时开发过程中必然会用到的组件.在系统中正确的打印日志至少有下面的这些好处: 调试:在程序的开发过程中,必然需要我们不断的调试以达到程序能正确执行的状态 .记录日志可以让开发人 ...