一个Windows应用程序中至少有一个窗口,称为主窗口。我们在客户区进行图案的绘制。
一个Windows应用程序是包含图标、光标等许多部件(资源),系统在为这些部件(资源)分配内存后会返回他们的标识号,也就是所谓的句柄。比如在Windows应用程序中,使用窗口句柄来标识每一个窗口。对窗口进行操作时候,首先就是得到这个窗口的标识。
Windows是事件驱动方式的程序设计,当一个Windows应用程序开始执行的时候,系统会产生一个消息队列,用于保存这个窗口的消息。eg:当你自己在一个窗口中按下键盘时候(事件),系统会收集到这个按下键盘事情(事件),然后包装成消息,放到这个窗口的消息队列中(窗口过程)。因为队列的先进先出的特点,这时候窗口会一个一个的读取消息,然后进行相应的执行处理。
控制台DOS中的入口是mian函数,而WinMain函数就是Windows程序的入口函数。启动一个应用程序时候就开始先调用WinMain函数
一个应用程序的功能是:创建一个窗口,然后响应键盘或者鼠标消息。
MFC是微软基础类库,以C++类的形式封装了Windows API,并且包含一个应用程序框架。类中包含了大量的windows句柄封装类和很多windows的组件和内建控件的封装类。MFC把Windows SDK API函数包装成了几百个类,MFC给Windows系统提供面向对象的接口,支持可重用性、自包含性以及OPP原则。
MFC.h
//mfc头文件
#include
//1、应用程序类CWinApp,MyAPP派生类
class MyApp : public CWinApp{
public:
//父类的虚函数,需要派生类进行重写
//也是MFC函数的入口函数
virtual BOOL InitInstance();
};
//2、框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
//构造函数
MyFrame();
}
MFC.cpp
//对应类的头文件
#include "mfc.h"
//有且只有一个的全局应用程序类的对象
MyApp app;
//程序入口
BOOL MyApp::InitInstance(){
//1、创建类框架
MyFrame *frame = new MyFrame;
//2、显示窗口
frame -> ShowWindow(SW_SHOWNORMAL);
//3、更新窗口
frame -> UpdateWindow();
//4、保存框架类对象指针
m_pMainWnd = frame;
return TRUE;
}
//重写构造函数
MyFrame::MyFrame(){
//创建窗口
Create(NULL,TEXT("mfc"));
}
息映射就是将消息和成员函数相互关联的表。比如,Windows将一个鼠标左击消息放到一个框架窗口消息队列中,然后这个窗口取到这个消息时候,MFC将搜索该窗口的消息映射,如果存在一个处理鼠标左击消息(WM_LBUTTONDOWN)的处理程序,就调用。
下面是如何在一个类中编写一个消息映射
mfc.h
class MyFrame : public CFrameWnd{
public:
MyFrame();
//声明消息宏
DECLARE_MESSAGE_MAP()
}
mfc.cpp
//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重写构造函数
MyFrame::MyFrame(){
//创建窗口
Create(NULL,TEXT("mfc"));
}
对应的处理函数分别在类中声明,类外定义
mfc.h
//框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
//构造函数
MyFrame();
//声明消息宏
DECLARE_MESSAGE_MAP()
//函数声明
dfx_msg void OnLButtonDown(UINT,CPoint);
}
mfc.cpp
//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重写构造函数
MyFrame::MyFrame(){
//创建窗口
Create(NULL,TEXT("mfc"));
}
//定义具体函数的实现
void OnLButtonDown(UINT,CPoint){
.......
.......
}
创建之后,会产生下面的几个类
其中要记住,我们的处理函数就是在视图类中编写。可以理解原来的框架类是作为底图,现在的视图类是叠加在上面的一个白板区域,就在这上面绘制渲染
ctrl+shift+x可以快速调出类向导。所谓类向导,就是帮助你快速的产生消息映射,再也不用像上面一样自己手写开始宏,结束宏…会自动帮你生成这些。
Windows GDI 是Windows提供的图像设备接口,可以将图形绘制在显示器上
MFC是提供2个类来支持调用GDI:
而在MFC中图像设备接口被抽象为CDC类,CDC类封装了所有的GDI函数,所以使用CDC类绘图,而窗口操作在CWnd类。
CDC类中又有4个子类
GetDC、releaseDC是CWnd类的成员函数
CreateDC、DeleteDC是CDC类的成员函数
下面是展示三种获取设备环境对象的方法、
void CDrawTestView::Draw(CDC *pDC)
{
//使用传入CDC的对象指针绘图指针
pDC -> LineTo(200,100);
//构造CClientDC设备环境对象指针
CClientDC dc(this);
dc.LineTo(200,200)
//通过GetDC函数获得设备环境对象指针
CDC* p = this ->GetDC();
p->LineTo(100,200);
//利用GetDC函数获得的设备环境对象必须使用ReleaseDC函数释放
this->ReleaseDC(p);
}