没有合适的资源?快使用搜索试试~ 我知道了~
DC、CDC、HDC
需积分: 9 2 下载量 62 浏览量
2014-08-14
11:20:29
上传
评论
收藏 100KB DOC 举报
温馨提示
试读
20页
在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数
资源推荐
资源详情
资源评论
请问 MFC 中的 DC、CDC、HDC、句柄、设备上下文究竟是什么意思? 希望
能解答详细一点点 谢谢了
推荐答案
都是什么回答啊 ...
楼主 你没有了解 MFC 的运行机制就去看他写他所以你先要了解他的机制 已经
各个 CPP .H 都是什么
下面我就给你说下
在 MFC 程序中,我们并不经常直接调用 Windows API,而是从 MFC 类创建对象
并调用属于这些对象的成员函数.也就是说 MFC 封装了 Windows API 你说你喜
欢 C++而 MFC 换一种说法就是一个用 C++写的一个函数库 然后你来调用 只不
过这个类不是你写的
MFC 提供数百个类,最重要的、也是编写任何 VC++应用程序都必不可
少的两个类 CWinApp 和 CFrameWnd,这两个类是编写复杂庞大应用程序的基
石。
1>封装特性:构成 MFC 框架的是 MFC 类库而 MFC 类库又是 C++的一个类库。
这些类封装 WIN32 应用程序编程接口,OLE(Object Link Embed 对象链接嵌
入)特性,ODBC 和 DAO 数据访问的功能。
2>继承特性:MFC 抽象出了众多类的共同特性,并设计出一些基类作为实现其
他类的基础,这些类中最重要的类是 CObject 类和 CCmdTarget 类,程序员可
以从适当的 MFC 类中派生出自己的类,实现特定的功能达到编程的目的。
3>虚拟和消息映射:MFC 是以 C++为基础,当然支持虚函数,但作为一个编程
框架必须要解决的是效率问题:如果 MFC 仅仅通过虚函数来支持动态约束必然
会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是 MFC
建立了消息映射机制这样降低了内存的使用却大大提高了效率
消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到
一个消息时,MFC 将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,
那么就调用该处理程序.
它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,
这样不需要为消息映射函数生成一个很大的虚拟函数表(V 表),节省内存。
MFC 消息映射机制:
将消息与消息处理函数联系起来,形成一一对应的机制。
消息映射宏
声明: DECLARE_MESSAGE_MAP
定义:
BEGIN_MESSAGE_MAP
ON_COMMAND
ON_CONTROL
ON_MESSAGE
END_MESSAGE_MAP
MFC 主要组成部分:类、宏和全局函数。
类是 MFC 中最主要的内容。MFC 类是以层次结构方式组织起来的。MFC 中的
类分成两部分,除了一些辅助类,大多数的 MFC 类是直接或间接从根类
CObject 派生而来。
MFC 宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。
MFC 约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀
MFC 类的层次关系
CObject 项目类)->CCmdTarget(消息响应类)->
{
CWinThread(线程类)->CWinApp(Window 应用程序类)
CDocument(文档类)
CWnd(窗体类)->[
CFrameWnd(框架类)
CView(视图类)
]
}
CObject 类由于 MFC 中大部分类是从 CObject 类继承而来的,CObject 类描述
了几乎所有的 MFC 类的一些公共特性,CObject 类为程序员提供了对象诊断、
运行时类型识别和序列化等功能。
CCmdTarget 类由 CObject 类直接派生而来,它负责将消息发送到能够响应这
些消息的对象。它是所有能进行消息映射的 MFC 类的基类。
CWinApp 类在任何 MFC 应用程序中有且仅有一个 CWinApp 派生类的对象,
它代表了程序中运行的主线程,也代表了应用程序本身。 CWinApp 类取代了
WinMain()主函数在 SDK 应用程序中的地位。传统 SDK 应用程序 WinMain()函
数完成的工作。现在由类 CWinApp 的 InitApplication(),InitInstance()和 Run()
三个成员函数承担。
CWnd 类由 CCmdTarget 类直接派生而来,该类及其派生类的实例是一个窗口。
CWnd 类代表了 MFC 中最基本的 GUI 对象,它是一个功能最完善、成员函数
最多的 MFC 类。
CFrameWnd 类是 CWnd 类的派生类,主要用来掌管一个窗口,它取代了 SDK
应用程序中窗口函数 WndProc()的地位。CFrameWnd 类的对象是一个框架窗
口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。
CDocument 类在应用程序中作为用户文档类的基类,它代表了用户存储或打开
的一个文件。
CView 类是 MFC 中一个很基本的类,它作为其它 MFC 视图类和用户视图派生
类的基类。
从 API 编程到 MFC 编程的过渡:
WinMain()
{ 初始化 WNDCLASS
注册窗体结构
创建窗口 ->>>>>>>>应用程序类 CWinApp
显示窗口
消息循环
}
WndProc()
{ switch(…)
->>>>>>>>>框架窗口类 CFrameWnd
}
MFC Object 和 Windows Object 的对应关系:
描述 Windows 句柄 MFC Object
窗口 HWND CWnd
设备上下文 HDC CDC
菜单 HMENU CMenu
笔 HPEN CPen
刷子 HBRUSH CBrush
字体 HFONT CFont
位图 HBITMAP CBitmap
套接字 SOCKET CSocket
三、手工创建一个 MFC 应用程序:
注意:创建 MFC 程序,要创建一个 Win32 空项目,并要选择项目属性中的”在共
享 DLL 文件中使用 MFC,然后新建我们的文件
例子:在”hello.h”头文件中添写如下代码:
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();//虚函数
};
class CMainWindow:public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();//声明消息映射
};
在”hello.cpp”源文件中添写如下代码:
#include <afxwin.h>
#include “hello.h"
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP() //消息映射
CMainWindow::CMainWindow() //构造函数初始化
{
Create(NULL,“我的第一个 MFC 应用程序”);//创建窗体
}
void CMainWindow::OnPaint()
{ CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.DrawText("Hello MFC",-1,&rect, DT_SINGLELINE|DT_CENTER|
DT_VCENTER);
}
CWinApp 是应用程序类,在 MFC 应用程序中必须从这个类派生出一个类,该
派生类是 MFC 应用程序的入口
必须定义这个派生类的对象,并且只能有一个这个对象代表整个应用程序。
成员函数:InitInstance()
功能:初始化应用程序实例和窗口实例,
虚函数 CWinApp::InitInstance 必须在派生类中重写。在 InitInstance 函数中,
编写初始化代码,如:
创建一个窗口
显示一个窗口
CFrameWnd 类
作用:为应用程序提供一个窗口,同时实现消息处理功能。
成员函数: Create()
功能:创建窗体,将之赋于 CFrameWnd 对象上。
BOOL Create(窗口类型, 窗口标题,显示风格,显示区域,符窗口句柄,菜单,
扩展显示风格,上下文对象)共有 8 个参数,前两个必须给出,后 6 个可以默认。
MFC 应用程序的核心就是基于 CWinApp 类的应用程序对象,CWinApp 提供了
消息循环来检索消息并将消息调度给应用程序的窗口.我们在编写 MFC 应用程
序时,要包含 afxwin.h,
一个 MFC 应用程序可以有且仅有一个应用程序对象,对象必须声明为在全局范
围内有效(也就是全局对象),以便它在程序开始时即在内存中被实例化
我们的 Hello MFC 的应用程序类被命名为 CMyApp,它在 hello.cpp 中用如下语
句进行了实例化:
CMyApp myApp;
CMyApp 的类声明在 hello.h 中代码如下:
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyApp 没有声明任何的数据成员,只是重写了一个从 CWinApp 类中继承来的
函数,在应用程序的生存期内 InitInstance 的调用比较早,是在应用程序开始运行
剩余19页未读,继续阅读
资源评论
wumaixin
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功