快捷搜索:

在窗口中画图 Windows GDI

Windows GDI

在单义务情况如 MS-DOS 中,运行中的利用法度榜样随时可自由地做它想做的工作,无论是在屏幕上画一条线,从新编写适配器的调色板,照样转换到另一种图像模式。而在窗口化多义务情况如 Windows 中,法度榜样则无此自由。由于法度榜样 A 的输出必须与法度榜样 B 的输出相隔离。首先这意味着各法度榜样的输出必须限定在自己的窗口中。 GDI 应用一简单的机制包管在窗口中画图的各法度榜样遵照这些规则。这种机制即为设备描述表(DC)。

当 Windows 法度榜样在屏幕、打印机或其他输出设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表(DC)表示的逻辑意义上的“显示平面”上去。设备描述表是探寓于 Windows 中的一种数据布局,它包孕 GDI 必要的所有关于显示平面环境的描述字段,包括相连的物理设备和各类各样的状态信息。在平面上画图之前, Windows 法度榜样从 GDI 获取设备描述表句柄,并在每次调用 GDI 输出函数时将句柄返回给 GDI 。若无有效的设备描述表句柄,则 GDI 不会画第一个像素点。经由过程设备描述表, GDI 可确保法度榜样所画的任何图形都能剪贴到屏幕的特定区域。设备描述表在使 GDI 开脱设备限定的历程中发挥了紧张的感化。得到设备描述表句柄后,同一 GDI 函数可用来向多种输出设备上画图。

在应用 MFC 体例 Windows 法度榜样时,设备描述表具有加倍凸起的感化。除了可作为通往各类输出设备的桥梁之外,设备描述表工具还封装了法度榜样用来孕育发生输出的 GDI 函数。在 MFC 中,您不用捕获设备描述表句柄和调用 GDI 输出函数,至少不必直接捕获和调用。而是经由过程创建一设备描述表工具并调用它的成员函数来画图。 MFC 的 CDC 类将 Windows 设备描述表和获取设备描述表句柄的 GDI 函数就近封装在一路,而 CDC 派生类如 CPaintDC 和 CClientDC 则代表 Windows 利用法度榜样应用的不合类型的设备描述表。

在 MFC 利用法度榜样中获取设备描述表的一种措施是调用CWnd::GetDC,它返回指向表示 Windows 设备描述表的 CDC 工具的指针。在画图完毕时,要用 CWnd::ReleaseDC 开释由 CWnd::GetDC 获取的设备描述表指针。

若同样的法度榜样代码呈现在 OnPaint 处置惩罚法度榜样中时,则需用 CWnd::BeginPaint 和 CWnd::EndPaint 分手代替 GetDC 和 ReleaseDC ,以包管合理地处置惩罚 WM_PAINT 消息。

GDI 还支持存储 GDI 敕令序列的元文件,这些敕令可从新履行以孕育发生实际输出。为获取元文件输出的设备描述表,还要应用另一套函数来获取和开释 CDC 指针。而且,为获取容许在窗口内任一地周遭图的设备描述表 CDC 指针(与只容许在窗口客户区画图的设备描述表 CDC 指针不合),必要调用 CWnd::GetWindowDC 而不是 GetDC ,但仍用 ReleaseDC 来开释设备描述表。

详情可参考下表:

CPaintDC        用于在窗口客户区画图(仅限于 OnPaint 处置惩罚法度榜样)

CClientDC        用于在窗口客户区画图(除 OnPaint 外的任何处置惩罚法度榜样)

CWindowDC        用于在窗口内随意率性地方画图,包括非客户区

CMetaFileDC        用于向 GDI 元文件画图

这些类被设计为可直接进行实例化。各个类的构造函数和析构函数调用响应的函数捕获和开释响应的设备描述表,从而使得设备描述表的应用异常方便简捷:

CPaintDc dc(this);

传送给类构造函数的指针确定了设备描述表所属的窗口。

当在栈上构造设备描述表工具时,若工具的生命周期停止,则它的析构函数会被自动调用。而且析构函数一旦被调用,设备描述表就会被返回给 Windows 。在堆上用 new 创扶植备描述表时,要留意亲身开释设备描述表。示例如下:

CPaintDC* pDC = new CPaintDC(this);

在这种环境下,有需要在创扶植备描述表的函数停止之前履行删除语句

delete pDC;

一边调用工具的析构函数和开释设备描述表。在某些场合下,在堆上创扶植备描述表要比在栈上创建更有用,但平日在栈上创扶植备描述表工具并让编译法度榜样履行删除义务会使您的编程轻松很多。

CPaintDC

MFC 的 CPaintDC 类相应 WM_PAINT 消息,容许您在窗口客户区画图。但您只能在 OnPaint 处置惩罚法度榜样中,而而不能在其他地方应用它。WM_PAINT 消息在一个很紧张的方面不合于其他 Windows 消息,假如处置惩罚法度榜样调用 Windows 的 ::BeginPaint 和 ::EndPaint 函数掉败(或其他等价函数),那么不管有若干绘图事情,都不能将该消息从消息对列中删除。是以,利用法度榜样将一遍又一各处处置惩罚同一个 WM_PAINT 消息而陷入逝世轮回。而 CPaintDC 能包管这种环境不会发生,由于 CPaintDC 经由过程其构造函数和析构函数调用 ::BeginPaint 和 ::EndPaint。

CClientDC CWindowDC:

CClientDC 可以在非 OnPaint (比如 OnLButtonDown ) 函数中创建一个 DC。例如:

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

{

CRect rect;

GetClientRect(&rect);

CClientDC dc(this);

dc.MoveTo(rect.left, rect.top);

dc.LineTo(rect.right, rect.bottom);

}

假如您不仅要应用窗口客户区,还要应用非客户区(标题栏、窗口边框等),则可以应用 CWindowDC类。

还有一种更少见的场合是法度榜样必要全屏幕的造访权。此时可创建 CClientDC 或 CWindowDC 工具,并给其构造函数传送一个 NULL 指针。

设置设备描述表的属性:

CDC::SetTextColor,CDC::SetBkColor,CDC::SetBkMode,CDC::SetMapMode,CDC::SetROP2,CDC::MoveTo(移动当前操作点),CDC::SelectObject(选择当前画笔,画刷或字体)。

每当从 Windows 中获取设备描述表时,设备描述表都被设置为默认值。是以,假如想在相应 WM_PAINT 消息时应用血色画笔和蓝色笔刷画您的窗口,则每逢 OnPaint 被调用时都要将所需的画笔和笔刷选入设备描述表,也便是创建一个新的 CPaintDC 工具。否则,将应用默认的画笔和笔刷。假如不想在应用设备描述表时反复对它进行初始化设定,那么可用 CDC::SaveDC 函数保存它的状态,并鄙人次应用时用 CDC:RestoreDC 将它规复。另一种措施是:注册一个自定义的 WNDCLASS ,此中包孕 CS_OWNDC 样式,它使 Windows 为每个利用法度榜样实例分配它已设置好的设备描述表。(有一个相关但很少应用的 WNDCLASS 样式,CS_CLASSDC,它分配一个“半私有”设备描述表。该设备描述表可被同一 WNDCLASS 创建的所有窗口共享。)将血色画笔和蓝色笔刷选人某个私有设备描述表后,假如没有被显示地调换,则它们依旧处于选中状态。

绘图模式:

GDI将像素点输出到逻辑显示平面上时,它不光是简单地输出像素点颜色。相反,它经由过程一系列的布尔运算将输出像素点的颜色和输出目标位置上像素点的颜色合成在一路。(假如您在工程中必要应用到诸如“橡皮线”之类的功能时,可以具体参看次选项的有关赞助。)

映射模式:

简单地说,映射模式是设备描述表的属性,用于确定从逻辑坐标值到设备坐标值的转换要领。(假如您在工程中必要应用到诸如以厘米为单位画图等功能时,可以具体参看次选项的有关赞助。)

调用 CDC::LPtoDP 函数可将逻辑坐标值转换为设备坐标值。反之,调用 CDC::DPtoLP 函数可将设备坐标值转换为逻辑坐标值。

默认要领下,设备描述表的原点位于显示平面的左上角。纵然改变映射模式.也不会改变原点的位置。然而,同改变映射模式一样,您也可以移动原点。 MFC 的 CDC 类供给了两个可移动原点的函数。

CDC::SetWindowOrg 移动窗口的原点, CDC::SetViewportOrg 移动视口的原点。正常环境下,只能应用此中之一。同时应用两个会搞得一团糟。

无意偶尔,您会听到 Windows 法度榜样员讨论“用户坐标值”和“屏幕坐标值”。用户坐标值是原点设立在窗口客户区左上角的设备坐标值。屏幕坐标值是原点位于屏幕左上角的设备坐标值。调用 CWnd::ClientToScreen 和 CWnd::ScreenToClient 函数可实现用户坐标值与屏幕坐标值之间的转换。

获取设备信息:CDC::GetDeviceCaps。

用 GDI 绘图:

CDC 中的一些图形函数:

MoveTo        在画线前设定当前位置

LineTo        从当前文职画一条线到指定位置(不包孕指定位置点),并将当前位置移至线的终点。

Polyline        将一系列点用线段连接起来

polylineTo        从当前位置开始将一系列点用线段连接起来,并将当前位置移至折线的终点。

Arc        回一个弧

ArcTo        画一个弧并将当前位置移至弧的终点

PolyBezier        画一条或多条贝塞尔样条曲线

PolyBezierTo        一条或多条贝塞尔样条曲线,并将当前位置移至着末—段样条曲线的终点

PolyDraw        经由过程一组点画一系列线段和贝塞尔样条曲线.并将当前位置移至着末一个线段或样条曲线的终点

Chord        画一个由椭圆和直线订交后围成的封闭图形

Ellipse        画一个圆或椭圆

Pie        画一个饼状的楔形物

Polygon        连接一组点形成一个多边形

Rectangle        画一个带直角的矩形

RoundRect        画一个带圆角的矩形

您可能还会对下面的文章感兴趣: