MFC学习笔记--MFC创建窗口

MFC学习笔记--MFC创建窗口

MFC创建窗口

基本说明过程消息映射机制应用例子利用模版创建窗口文化建设

基本说明

mfc:微软基础类库(microsoft foundation classes)微软公司提供的类库,以 **c++** 形式封装了windows api,并且包含了一个应用程序框架,减少开发工作量。

mfc需要包含头文件#include

源文件是.cpp

配置:

过程

程序开始时,先实例化应用程序类对象执行程序的入口函数InitInstance给框架类MyFrame对象动态分配控件(调用他的构造函数),在构造函数内部,通过CWnd::Create创建窗口框架类对象显示窗口CWnd::ShowWindow框架类对象更新窗口CWnd::UpdateWindow保存框架类对象执行CWinThread::m_pMainWnd

消息映射机制

消息映射是一个将消息和成员函数相互关联的表:

比如,窗口接收到了一个鼠标单击消息,mfc将搜索该窗口的消息映射,如果有一个

处理WM_LBUTTONDOWN消息的处理程序,就会调用OnLButtonDown

声明宏写到.h中 DECLARE_MESSAGE_MAP()分界宏 写到.cpp中 BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) END_MESSAGE_MAP()找到消息宏 写到分界宏中间 ON_WM_LBUTTONDOWN() ON_WM_CHAR() ON_WM_PAINT()把函数原型声明写到.h中 afx_msg void OnLButtonDown(UINT, CPoint); afx_msg void OnChar(UINT, UINT,UINT); afx_msg void OnPaint();函数的实现写到.cpp中

应用例子

头文件

#pragma once

#include//mfc头文件

// 应用程序类CWinApp,派生类(子类)

class MyApp :public CWinApp

{

public:

// 基类的虚函数,派生类只是重写

// MFC程序的入口地址

virtual BOOL InitInstance();

};

// 框架类(窗口类) CFrameWnd派生类(子类)

class MyFrame : public 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 "mfcp.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()//鼠标左键按下

ON_WM_CHAR()//键盘

ON_WM_PAINT()//绘图

END_MESSAGE_MAP()//结束

MyFrame::MyFrame()

{

Create(NULL, TEXT("mfc"));//创建窗口

}

void MyFrame::OnLButtonDown(UINT, CPoint point)

{

TCHAR buf[1024];//mfc中的字符数组

wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);

MessageBox(buf);//mfc中的messagebox

//mfc中的字符串 CString

CString str;

str.Format(TEXT("cstring: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("forward"));

//画椭圆

dc.Ellipse(10, 10, 500, 500);

}

利用模版创建窗口

创建时选择MFC应用程序 暂时选择,单个文档,MFC标准 一路下一步,在这里可以配置窗口样式 鉴于解决方案比较多,可以在类视图中进行查看。 在类视图中双击其中一个类,可以定位到该类的头文件中;双击类视图下方的函数可进入cpp中。 类视图中右键类,选择属性,右侧选择消息 在创建出的五个类中,CAboutDlg为关于的窗口; 数据的存储和加载由文档类来完成,数据的显示和修改则通过视类(view)来完成; view覆盖在frame之上,所有鼠标事件写在view类中; 在Frame类中,有一个PreCreateWindow函数,可以在窗口生成前修改窗口外观,通过传递CREATESTRUCT结构体参数完成;create()创建窗口成功后会发送一个消息WM_CREATE,OnCreate()来相应这个消息; MFC中Afx前缀的函数都是全局函数; 如在CXXXXXView类中右键属性–消息–鼠标左键,在填充的代码中完成想要的操作 draw事件

void CMFCGuideView::OnDraw(CDC* pDC)

{

CMFCGuideDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 在此处为本机数据添加绘制代码

pDC->TextOutW(100, 100, TEXT("go to"));

}

如果有了OnDraw 就不要有OnPaint,同时存在时,OnPaint会把OnDraw覆盖。

文化建设

少年行

新丰美酒斗十千,咸阳游侠多少年。 相逢意气为君饮,系马高楼垂柳边。

汉家君臣欢宴终,高议云台论战功。 天子临轩赐侯印,将军佩出明光宫。

出身仕汉羽林郎,初随骠骑战渔阳。 孰知不向边庭苦,纵死犹闻侠骨香。

一身能臂两雕弧,虏骑千群只似无。 偏坐金鞍调白羽,纷纷射杀五单于。

相关文章

SSL:原理、应用、安全威胁与最佳实践
365在线体育

SSL:原理、应用、安全威胁与最佳实践

⌛ 08-06 👁️‍🗨️ 5093
崩坏2和崩坏3有什么区别 哪个更好玩
365bet网上手机投注

崩坏2和崩坏3有什么区别 哪个更好玩

⌛ 08-13 👁️‍🗨️ 1888
Swagger 教程:快速入门Swagger的使用指南(超详细)
bte365正规网站

Swagger 教程:快速入门Swagger的使用指南(超详细)

⌛ 08-13 👁️‍🗨️ 4428
为什么有些语言可以被反编译 而有的不能
365在线体育

为什么有些语言可以被反编译 而有的不能

⌛ 08-03 👁️‍🗨️ 6678
管易erp是什么(管易ERP的功能怎么样?)
365在线体育

管易erp是什么(管易ERP的功能怎么样?)

⌛ 08-27 👁️‍🗨️ 3072
android activity中动态添加view
bte365正规网站

android activity中动态添加view

⌛ 06-28 👁️‍🗨️ 311