第五章 图形基础(二)

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

 

       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.7填充空袭

5.3.8绘图方式

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

         

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

   SetROP2(hdc,iDRAWMode);

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

iDrawMode = GetROP2(hdc);

来获取当前的绘图方式

5.4 绘制填充区域

HNRUSH  hBrush;

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

hBrush = GetStockObject(GRAY_BRUSH);

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

SelectObect(hdc,hBrush);

 

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

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

 

5.4.2用画刷填充内部

   

 

5.5GDI映射方式

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

setMapMode(hdc,iMapMode);

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

iMapMode = GetMapMode(hdc);

   

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

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

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

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

5.5.2设备坐标系

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

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

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

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

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

5.5.3视口和窗口

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

设备点转换为逻辑点

DPtoLP(hdc,pPoints,iNumber);

GetClientRect(hwnd,&rect);

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

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

LPtoDP(hdc,pPoints,iNumber);

5.5.4处理MM_TEXT

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

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

GetViewportOrgEx(hdc,&pt);

GetWindowOrgEx(hdc,&pt);

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

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

MM_ISOTROPIC映射方式

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值