第五章 图形基础(二)

5.3.5使用现有画笔

windows提供三种现有画笔,BLACK_PEN(默认黑色画笔,不论映射方式是什么,都画出一个像素宽的黑色实现来)  WHITE_PEB  NULL_PEN(什么都不画)

HPEN  hPen;

获得现有画笔

hPen = GetStockObject(WHITE_PEN);

现在必须将画笔选进设备描述表:

SelectObject(hdc,hPen);

可以显示为   selectObject(hdc,GetStockObject(WHITE_PEN));

5.3.6画笔的创建,选择与删除

创建一个逻辑画笔,CreatePen 或 CreatePenIndirect

第五章 图形基础(二)_第1张图片

 

第五章 图形基础(二)_第2张图片

       createPen的crColor参数时一个COLORREF值,它指定画笔的颜色。对于除了PS_INSIDEFRAME之外的画笔线型,如果将画笔选入设备描述表中,windows 会将颜色转换为设备所能表示的最接近的纯色。PS_INSIDEFRAME是唯一一种可以使用抖动色的画笔线型,并且只有在宽度大于1的情况下才如此。

第五章 图形基础(二)_第3张图片

使用CreatePenIndirect 首先需要定义一个LOGPEN类型的结构体

    LOGPEN logpen;
    logpen.lopnColor; //画笔颜色
    logpen.lopnStyle; //画笔线性
    logpen.lopnWidth; //画笔宽度

hPen = CreatePenIndirect (&logpen);

第五章 图形基础(二)_第4张图片

selectObject(hdc,hPen1);

DeleteObject(hPen1);

hPen= SelectObject(hdc, CreatePen(PS_DASH, 0, RGB(255, 0, 0)));

第五章 图形基础(二)_第5张图片

5.3.7填充空袭

第五章 图形基础(二)_第6张图片

5.3.8绘图方式

第五章 图形基础(二)_第7张图片

    画笔在目标上绘制后会得到什么呢?一种可能是不管画笔和目标的色彩,画出的线总是黑色,这种绘图方式有ROP2代码R2_BLACK表示。另一种可能只有当画笔与目标都是黑色时,画出的结果才是白色。其他情况画出的都是黑色,尽管这似乎有些奇怪,Windows还是位这种方式起了一个名字,叫做R2_NOTMERGEPEN。Windows 执行目标与画笔像素的按位“或”运算,然后反转所得色彩.。

          第五章 图形基础(二)_第8张图片

可以通过以下调用在设备描述表中设置新的绘图模式:

   SetROP2(hdc,iDRAWMode);

iDrawMode参数是表中“绘图模式” 栏中给出的值之一。你可以用函数

iDrawMode = GetROP2(hdc);

来获取当前的绘图方式

第五章 图形基础(二)_第9张图片

5.4 绘制填充区域

第五章 图形基础(二)_第10张图片

HNRUSH  hBrush;

您可以通过调用GetStockObject 来获取GRAY_BRUSH的句柄;

hBrush = GetStockObject(GRAY_BRUSH);

您可以调用SelectObject将它选进设备描述表

SelectObect(hdc,hBrush);

 

第五章 图形基础(二)_第11张图片

5.4.1 Polygon函数和多边形填充方式

    Polygon(hdc,apt,iCount);   与Polyline函数类似:

第五章 图形基础(二)_第12张图片

第五章 图形基础(二)_第13张图片

 

第五章 图形基础(二)_第14张图片

5.4.2用画刷填充内部

    第五章 图形基础(二)_第15张图片

 

第五章 图形基础(二)_第16张图片

第五章 图形基础(二)_第17张图片

第五章 图形基础(二)_第18张图片

5.5GDI映射方式

第五章 图形基础(二)_第19张图片

可以使用下面语句来设置映射方式:

setMapMode(hdc,iMapMode);

其中,iMapMode 是8个映射方式标识符之一。您可以通过以下调用获取当前的映射方式:

iMapMode = GetMapMode(hdc);

  第五章 图形基础(二)_第20张图片 

第五章 图形基础(二)_第21张图片

5.5.1设备坐标系与逻辑坐标系

    由于映射方式是一种设备描述表属性,所以,只有对需要设备描述表句柄做参数的GDI函数,映射方式才会起作用

   GetSystemMetrics不是GDI函数,所以它总是以设备单位(像素)为度量

   GetDeviceCaps是GDI函数,需要一个设备描述表做参数,但是windows 仍然对HORZRES和VERTRES以设备单位作为返回值,因为该函数的目的之一就是给u程序提供以像素位单位的设备大小

第五章 图形基础(二)_第22张图片

5.5.2设备坐标系

所有的设备坐标都是以像素为单位,水平轴(即x轴)上的值从左到右递增,垂直(即y轴)上的值从上到下递增

整窗口坐标 以程序的整个窗口为基准,对于普通窗口,点(0,0)是缩放边框的左上角

客户坐标系  是我们最常使用的“客户区坐标系” ,点(0,0)是客户区的左上角

ClientToScreen 和 ScreenToClient 可以将客户区坐标转换为屏幕坐标,或者反过来,将屏幕坐标转换为客户区坐标

也可以使用GetWindowRect 函数获取屏幕下的整个窗口的位置和大小

5.5.3视口和窗口

第五章 图形基础(二)_第23张图片

视口是实际存在的,,窗口是逻辑上的

设备点转换为逻辑点

DPtoLP(hdc,pPoints,iNumber);

第五章 图形基础(二)_第24张图片

GetClientRect(hwnd,&rect);

DPtoLP(hdc,(PPOINT)&rect,2);

下面的函数逻辑点转换为设备坐标:

LPtoDP(hdc,pPoints,iNumber);

5.5.4处理MM_TEXT

SetViewportOrgEx和SetWindowOrgEx,用来改变视口和窗口的原点

第五章 图形基础(二)_第25张图片

以下两个函数获取当前视口和窗口原点

GetViewportOrgEx(hdc,&pt);

GetWindowOrgEx(hdc,&pt);

第五章 图形基础(二)_第26张图片

第五章 图形基础(二)_第27张图片

5.5.6"自作主张的"映射方式

与上面讨论的度量方式相似,MM_ISOTROPIC使用相同的轴,x轴上的逻辑单位与y轴上的逻辑单位的物理尺寸相等。这对您创建纵横比与显示比无关的图像是有帮助的。

第五章 图形基础(二)_第28张图片

MM_ISOTROPIC映射方式

第五章 图形基础(二)_第29张图片

 

 

你可能感兴趣的:(windows,程序设计)