MFC中的GDI绘图(2)

二.MFC中GDI绘图

GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图。

1、获取设备环境

(1)在SDK编程中,获取设备环境的方法有两种:

<1>通过API函数BeginPaint。应用程序响应WM_PAINT消息进行图形刷新时主要通过BeginPaint函数获取设备环境,在消息处理函数返回前调用API函数EndPaint释放设备环境。

函数原型为:WINUSERAPI HDC WINAPI BeginPaint( HWND hWnd,LPPAINTSTRUCT lpPaint);

//以下为Win API示例::BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);

case WM_PAINT://窗口客户区需要重绘

{

char szText[]="Hello World";

PAINTSTRUCT ps;

HDC hdc=::BeginPaint(hWnd,&ps);

::TextOut(hdc,10,10,szText,strlen(szText));

::EndPaint(hWnd,&ps);

return 0;

}

MFC对BeginPaint进行了封装:

CWnd::BeginPaint,CDC* BeginPaint( LPPAINTSTRUCT lpPaint ); 等价于

::BeginPaint(CWnd::m_hWnd, LPPAINTSTRUCT lpPaint);

<2>通过API函数GetDC。在非WM_PAINT消息处理函数中,需要调用GetDC来获取设备环境,调用API函数ReleaseDC来释放设备环境。

函数原型为:WINUSERAPI HDC WINAPI GetDC( HWND hWnd);

(2)在MFC中,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。

<1> CPaintDC构造函数:CPaintDC(CWnd* pWnd); 构造一个CPaintDC对象(pWnd指向一个CPaintDC对象所属的CWnd对象),准备用于绘画的应用程序窗口。

// BeginPaint

void CView::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

OnPrepareDC(&dc);

OnDraw(&dc)

}

当我们改变了窗口尺寸、移动窗口或恢复了先前被覆盖的部分,应用程序窗口就会收到一个Windows系统发送来的WM_PAINT消息,然后调用基类Cview的OnPaint函数或我们自己添加的消息处理函数OnPaint。我们可以在OnPaint函数中重绘窗口中重新可见的部分(),但简单的处理办法是重绘整个窗口。上面的代码中,由于基类Cview的OnPaint函数调用了OnDraw函数,因此应用程序经常在OnDraw函数中绘制视图。

<2>CClientDC构造函数:CClientDC(CWnd* pWnd); 构造一个CClientDC对象,它将存取pWnd指向的CWnd的客户区。

// 鼠标左键事件处理

void CExView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC dc(this);//定义客户区设备环境

dc.LineTo(point);//绘制线段

}

CClientDC代表了窗口客户区对应的显示上下文,它在构造时调用了API函数GetDC,并将当前窗口的句柄m_hWnd作为函数参数;在析构时调用了API函数ReleaseDC。当在客户去绘图时,需要利用CClientDC类定义一个客户区设备环境句柄。

有时候需要访问与一个客户设备环境相关联的窗口对象,可以通过Attach函数把这个CClientDC的成员m_hWnd句柄传递给一个窗口对象,该窗口就是与客户区设备环境相关联的窗口。

CWnd::Attach,BOOL Attach( HWND hWndNew );

说明:将一个Windows窗口与CWnd对象相连接。

返回值:如果成功,则返回非零值;否则返回0。

参数:hWndNew指定了Windows窗口的句柄

<3>CWindowDC构造函数:CWindowDC( CWnd* pWnd );构造一个CWindowDC对象,它可以访问pWnd指向的CWnd对象的整个屏幕区域(包括客户区和非客户区)。比如我们在做屏幕保护程序时,一般以整个屏幕区域作为绘制区域。

--------------------To be continued------------------

时间: 2025-02-01 11:45:43

MFC中的GDI绘图(2)的相关文章

MFC中的GDI绘图&lt;转&gt;

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

MFC中的GDI绘图(1)

一.关于GDI的基本概念 什么是GDI         Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Progra

MFC中的GDI绘图(3)

2.设置坐标映射    (1)Windows坐标系统         Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系.一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标.         <1>逻辑坐标系是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标.         <2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能

MFC中的GDI绘图(4)

3.创建绘图工具并选入DC 有了画布,要绘图我们必须有画笔画刷.在Windows中有HPEN.HBRUSH等GDI对象,MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen.CBrush.CFont.CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类. 一般先创建画笔(刷),然后调用CDC::SelectObject函数将画笔(刷)选入设备环境最为当前绘图工具,绘图完毕恢复设备环境以前的画笔(刷)对象,最后调用CGdiObject::Del

MFC中的GDI绘图(5)

坐标映射实例 (1)建立单文档MFC项目Draw:New->Projects->MFC AppWizard(EXE)->Single Document. (2)找到CMainFrame::PreCreateWindow函数,在其中设置默认窗口大小为400 pixel*300 pixel. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return

VS2013中使用GDI+绘图

VC范例,400多个例子源代码下载 http://download.csdn.net/detail/bigtree_mfc/7727977 VS2013中使用GDI+绘图和VC6.0不同,在VC6.0中能绘出的图像在VS2013中不会显示,原因就是在VS2013中需要添加初始化GDI+: 绘图 对话框视图类中:(绘图部分大同小异,) void **View::OnDraw(CDC *pDC){ //初始化部分 GdiplusStartupInput gdiplusStartupInput; UL

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

【VS2013中使用GDI+绘图】

VS2013中使用GDI+绘图和VC6.0不同,在VC6.0中能绘出的图像在VS2013中不会显示,原因就是在VS2013中需要添加初始化GDI+: 绘图 对话框视图类中:(绘图部分大同小异,) void **View::OnDraw(CDC *pDC) { //初始化部分 GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartu

怎样在VS2013/MFC中使用TeeChart绘图控件

TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在VS2013中如何创建MFC项目. 工具/原料 Visual studio 2013 TeeChart.pro.v5.ActiveX 方法/步骤 1 在网上下载TeeChart控件并安装,安装自然不用多说,安装完后找到安装路径(带有TeeChart5.ocx文件),复制当前路径 2 安装完后需要对控件