windows GDI开发

  • Post author:
  • Post category:其他


画图流程是:

1、画图之前windows程序从GDI获取设备描述表句柄;

2、每次调用GDI输出函数时将句柄返回给GDI。

MFC的CDC类将windows设备描述表和获取设备描述表句柄的GDI函数就近封装在一起,CDC的派生类则代表不同类型的设备描述表。

类名    描述

CPaintDC    用于在窗口客户区画图(仅限于OnPaint处理程序)

CClientDC    用于在窗口客户区画图(除OnPaint处理程序外的任何处理程序)

CWindowDC    用于在窗口内任何地方画图,包括非客户区

CMetaFileDC    用于向GDI元文件画图


得到设备环境句柄

HDC的方法:BeginPaint、GetWindowDC、GetDC

1.

采用

GetDC

获取

HDC



HDC hdc = ::GetDC( hwnd );



//

此处添加绘图代码



::ReleaseDC( hwnd, hdc );



2.

采用

BeginPaint

获取

HDC

适合用

在OnPaint程序中,则需用CWnd::BeginPaint和CWnd::EndPaint分别代替GetDC和ReleaseDC以保证合理地处理WM_PAINT消息



HDC hdc;



PAINTSTRUCT ps;//

保存



hdc = ::BeginPaint( hwnd, &ps );



//

此处添加绘图代码



::EndPaint( hwnd, &ps );



注意:另外在


OnPaint程序中CDC类可以直接进行实例化,构造函数和析构函数调用相应的函数捕获和释放设备描述表

在栈中实例化


CPaintDC dc(this);


// Do some drawing

在堆中实例化


CPaintDC * pDC = new CPaintDC(this)


// Do some drawing


delete pDC;


3.







GetWindowDC

获取

HDC   在非


OnPaint程序



HDC hdc = ::GetWindowDC( hwnd );



//

此处添加绘图代码



::ReleaseDC( hwnd, hdc );



设备描述表属性



当使用CDC输出函数在屏幕上画图时,输出的某些特性并没有在函数调用过程中规定,但可通过设备描述表自身获得。




Attribute    Default    Set with    Get with

文本颜色    Black    CDC::SetTextColor    CDC::GetTextColor

背景颜色    White    CDC::SetBkColor    CDC::GetBkColor

背景模式    OPAQUE    CDC::SetBkMode    CDC::GetBkMode

映射模式    MM_TEXT    CDC::SetMapMode    CDC::GetMapMode

绘图模式    R2_COPYPEN    CDC::SetROP2    CDC::GetROP2

当前位置    (0,0)    CDC::MoveTo    CDC::GetCurrentPosition

当前画笔    BLACK_PEN    CDC::SelectObject    CDC::SelectObject

当前画刷    WHITE_BRUSH    CDC::SelectObject    CDC::SelectObject

当前字体    SYSTEM_FONT    CDC::SelectObject    CDC::SelectObject

创建这些对象

位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。

画刷:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。

字体:CreateFont, CreateFontIndirect。

笔:CreatePen, CreatePenIndirect。

区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。

返回值为类型,然后调用SelectObject函数选中。选中后,返回原来画刷的句柄用来恢复时使用。图形绘制完毕后使用DeleteObject函数将其释放。

所以其流程如下:

CreatePen 新的

SelectObject 新的

SelectObject 旧的

DeleteObject 新的

画图

1.直线   MoveTo 、LineTo

2.

椭圆

Ellipse


3. 矩形

Rectangle


4.点

SetPixel

5.文本显示 DrawText

6.画刷填充 FillRect

引申到双缓冲绘图

双缓冲绘图步骤:

创建兼容DC(CreateCompatibleDC)

创建兼容位图(CreateCompatibleBitmap)

将兼容位图选入兼容DC(SelectObject)

在兼容DC中进行绘制工作

将兼容DC中的像素拷贝至屏幕DC(BitBlt)

从兼容DC中换出兼容位图(SelectObject)

删除兼容位图(DeleteObject)

删除兼容DC(DeleteObject)

CDC dc;

dc.CreateCompatibleDC(pDc);//创建兼容DC

CBitmap memBmp;

memBmp.CreateCompatibleBitmap(pDc, zcRect.Width(), zcRect.Height());//创建兼容位图

CBitmap* OldBmp = dc.SelectObject(&memBmp);//将位图选入DC

//具体画图

pDc->BitBlt(0,0,zcRect.Width(),zcRect.Height(),&dc,0,0,SRCCOPY);//将兼容DC中位图拷贝至屏幕DC

dc.SelectObject(OldBmp);

memBmp.DeleteObject();

dc.DeleteDC();



版权声明:本文为baidu_16370559原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。