windows提供三种现有画笔,BLACK_PEN(默认黑色画笔,不论映射方式是什么,都画出一个像素宽的黑色实现来) WHITE_PEB NULL_PEN(什么都不画)
HPEN hPen;
获得现有画笔
hPen = GetStockObject(WHITE_PEN);
现在必须将画笔选进设备描述表:
SelectObject(hdc,hPen);
可以显示为 selectObject(hdc,GetStockObject(WHITE_PEN));
创建一个逻辑画笔,CreatePen 或 CreatePenIndirect
createPen的crColor参数时一个COLORREF值,它指定画笔的颜色。对于除了PS_INSIDEFRAME之外的画笔线型,如果将画笔选入设备描述表中,windows 会将颜色转换为设备所能表示的最接近的纯色。PS_INSIDEFRAME是唯一一种可以使用抖动色的画笔线型,并且只有在宽度大于1的情况下才如此。
使用CreatePenIndirect 首先需要定义一个LOGPEN类型的结构体
LOGPEN logpen;
logpen.lopnColor; //画笔颜色
logpen.lopnStyle; //画笔线性
logpen.lopnWidth; //画笔宽度
hPen = CreatePenIndirect (&logpen);
selectObject(hdc,hPen1);
DeleteObject(hPen1);
hPen= SelectObject(hdc, CreatePen(PS_DASH, 0, RGB(255, 0, 0)));
5.3.8绘图方式
画笔在目标上绘制后会得到什么呢?一种可能是不管画笔和目标的色彩,画出的线总是黑色,这种绘图方式有ROP2代码R2_BLACK表示。另一种可能只有当画笔与目标都是黑色时,画出的结果才是白色。其他情况画出的都是黑色,尽管这似乎有些奇怪,Windows还是位这种方式起了一个名字,叫做R2_NOTMERGEPEN。Windows 执行目标与画笔像素的按位“或”运算,然后反转所得色彩.。
可以通过以下调用在设备描述表中设置新的绘图模式:
SetROP2(hdc,iDRAWMode);
iDrawMode参数是表中“绘图模式” 栏中给出的值之一。你可以用函数
iDrawMode = GetROP2(hdc);
来获取当前的绘图方式
HNRUSH hBrush;
您可以通过调用GetStockObject 来获取GRAY_BRUSH的句柄;
hBrush = GetStockObject(GRAY_BRUSH);
您可以调用SelectObject将它选进设备描述表
SelectObect(hdc,hBrush);
Polygon(hdc,apt,iCount); 与Polyline函数类似:
可以使用下面语句来设置映射方式:
setMapMode(hdc,iMapMode);
其中,iMapMode 是8个映射方式标识符之一。您可以通过以下调用获取当前的映射方式:
iMapMode = GetMapMode(hdc);
由于映射方式是一种设备描述表属性,所以,只有对需要设备描述表句柄做参数的GDI函数,映射方式才会起作用
GetSystemMetrics不是GDI函数,所以它总是以设备单位(像素)为度量
GetDeviceCaps是GDI函数,需要一个设备描述表做参数,但是windows 仍然对HORZRES和VERTRES以设备单位作为返回值,因为该函数的目的之一就是给u程序提供以像素位单位的设备大小
所有的设备坐标都是以像素为单位,水平轴(即x轴)上的值从左到右递增,垂直(即y轴)上的值从上到下递增
整窗口坐标 以程序的整个窗口为基准,对于普通窗口,点(0,0)是缩放边框的左上角
客户坐标系 是我们最常使用的“客户区坐标系” ,点(0,0)是客户区的左上角
ClientToScreen 和 ScreenToClient 可以将客户区坐标转换为屏幕坐标,或者反过来,将屏幕坐标转换为客户区坐标
也可以使用GetWindowRect 函数获取屏幕下的整个窗口的位置和大小
视口是实际存在的,,窗口是逻辑上的
设备点转换为逻辑点
DPtoLP(hdc,pPoints,iNumber);
GetClientRect(hwnd,&rect);
DPtoLP(hdc,(PPOINT)&rect,2);
下面的函数逻辑点转换为设备坐标:
LPtoDP(hdc,pPoints,iNumber);
SetViewportOrgEx和SetWindowOrgEx,用来改变视口和窗口的原点
以下两个函数获取当前视口和窗口原点
GetViewportOrgEx(hdc,&pt);
GetWindowOrgEx(hdc,&pt);
与上面讨论的度量方式相似,MM_ISOTROPIC使用相同的轴,x轴上的逻辑单位与y轴上的逻辑单位的物理尺寸相等。这对您创建纵横比与显示比无关的图像是有帮助的。