ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:105.40KB ,
资源ID:4866149      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4866149.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Windows Api教案4.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Windows Api教案4.docx

1、Windows Api教案4 填充空隙问题:在使用点式画笔和虚线画笔时,点和虚线之间的空隙会怎样呢?这取决于DC的两个属性背景模式和背景颜色。默认背景模式为OPAQUE,在这种方式下,Windows使用背景色来填充空隙,默认的背景色为白色。1 SetBkColor函数 COLORREF SetBkColor( HDC hdc, / handle of device context COLORREF crColor / background color value );2 GetBkColor函数 COLORREF GetBkColor( HDC hdc / handle of device c

2、ontext );3 SetBkMode函数 int SetBkMode( HDC hdc, / handle of device context int iBkMode / flag specifying background mode);其中iBkMode为TRANSPARENT或者OPAQUE4 GetBkMode函数 int GetBkMode( HDC hdc / handle to device context of interest );说明:通过SetBkColor函数可以改变填充空隙的背景色,通过SetBkMode将背景模式转换为TRANSPARENT,可以阻止Windows

3、填充空隙。 绘图方式1 光栅运算像素间的按位布尔运算叫做“光栅运算”,简记为“ROP”。由于绘图只涉及两种像素(画笔和目标),因此又称为“ROP2”运算。即当Windows使用画笔来画线时,它实际上执行画笔像素与目标位置处原来像素之间的某种按位布尔运算。2 绘图模式种类绘图模式 布尔操作R2_BLACK 0R2_NOTMERGEPEN (P|D)R2_MASKNOTPEN P&DR2_NOTCOPYPEN PR2_MASKPENNOT P&DR2_NOT DR2_XORPEN PDR2_NOTMASKPEN (P&D)R2_MASKPEN P&DR2_NOTXORPEN (PD)R2_NOP

4、DR2_MERGENOTPEN P|DR2_COPYPEN(默认) PR2_MERGEPENNOT P|DR2_MERGEPEN P|DR2_WHITE 1注意:以上模式指在单色系统中绘图的模式。3 SetROP2函数 int SetROP2( HDC hdc, / handle of device context int fnDrawMode / drawing mode );4 GetROP2函数 int GetROP2( HDC hdc / handle of device context );六 绘制填充区域图形以当前设备描述表中选择的刷子来填充。 现有画刷WHITE_BRUSHLTG

5、RAY_BRUSHGRAY_BRUSHDKGRAY_BRUSHBLACK_BRUSHNULL_BRUSH(HOLLOW_BRUSH) 选择现有画刷HBRUSH hBrush;hBrush=GetStockObject(GRAY_BRUSH);SelectObject(hdc,hBrush);用下面语句画一个没有边界框的图形。SelectObject(hdc,GetStockObject(NULL_PEN);用下面语句画一个没有填充的图形。SelectObject(hdc,GetStockObject(NULL_BRUSH); Polygon函数和多边形填充方式1 Polygon函数 BOOL

6、Polygon( HDC hdc, / handle to device context CONST POINT *lpPoints, / pointer to polygons vertices int nCount / count of polygons vertices );其中nCount是点的数目,如果该数组中的最后一个点与第一个点不同,则Windows将会再加一条线,将最后一个点与第一个点连起来。(在Polyline函数中,Windows不会这么做)。2 SetPolyFillMode函数 int SetPolyFillMode( HDC hdc, / handle to devi

7、ce context int iPolyFillMode / polygon fill mode );其中,iPolyFillMode取值ALTERNATE或WINDING。说明:ALTERNATE方式,即假设从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填充封闭区域。WINDING方式,即假设从一个无穷大的封闭区域内部的点画线,如果假想的线穿过了奇数条边界线,区域就被填充。如果假想的线穿过了偶数条边界线,则如果一个方向的边界线数与另一个方向的边界线数不相等,就填充区域,否则不填充。例如,见上图中的物体。线上的箭头指出了画线的方向。两种方式都会填充三个封闭的L形区域,

8、号码为13。号码为4和5的两个小内部区域,在ALTERNATE方式下不会被填充。但是,在WINDING方式下,号码为5的区域会被填充,因为从区域内必须穿过两条相同方向的线才能到达图形外部。号码为4的区域不会被填充,因为必须穿过两条方向相反的线。 ALTWIND程序关键部分LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) static POINT aptFigure 10 = 10,70, 50,70, 50,10, 90,10, 90,50, 30,50, 30,90, 70,90,

9、 70,30, 10,30 ; static int cxClient, cyClient ; HDC hdc ; int i ; PAINTSTRUCT ps ; POINT apt10 ; switch (message) case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, GetStockObject (GRAY_BRUSH) ; for (i =

10、 0 ; i 10 ; i+) apti.x = cxClient * aptFigurei.x / 200 ; apti.y = cyClient * aptFigurei.y / 100 ; SetPolyFillMode (hdc, ALTERNATE) ; Polygon (hdc, apt, 10) ; for (i = 0 ; i 10 ; i+) apti.x += cxClient / 2 ; SetPolyFillMode (hdc, WINDING) ; Polygon (hdc, apt, 10) ; EndPaint (hwnd, &ps) ; return 0 ; c

11、ase WM_DESTROY: PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; 创建画刷1 CreateSolidBrush函数 HBRUSH CreateSolidBrush( COLORREF crColor / brush color value );说明:函数中的Solid并不是指画刷为纯色。在将画刷选入DC中时,Windows创建一个抖动色的位图,并为画刷使用该位图。2 CreateHatchBrush函数 HBRUSH CreateHatchBrush(

12、int fnStyle, / hatch style COLORREF clrref / color value );说明:其中,iHatchStyle参数描述影线标记的外观。取值如下: CreateBrushIndirect函数 HBRUSH CreateBrushIndirect( CONST LOGBRUSH *lplb / pointer to structure describing brush ); typedef struct tagLOGBRUSH / lb UINT lbStyle; COLORREF lbColor; LONG lbHatch; LOGBRUSH;lbSty

13、lelbColorlbHatchBS_SOLIDBS_HOLLOWBS_HATCHEDBS_PATTERNBS_DIBPATTERNPT画刷的色彩忽略影线的色彩忽略忽略忽略忽略影线画刷风格位图的句柄指向DIB的指针 选择、删除和获得画刷SelectObject(hd,hBrush);DeleteObject(hBrush);GetObject(hBrush,sizeof(LOGBRUSH),(LPVOID)&logbrush);七 GDI映射方式“映射方式”是一种几乎影响任何客户区绘图的设备描述表属性。另外有4种设备描述表属性窗口原点、视口原点、窗口范围和视口范围与映射方式密切相关。大多数GD

14、I绘图函数都需要使用坐标值,这种坐标值使用的都是一种“逻辑单位”。Windows必须将逻辑单位转换为“设备单位”,即像素。这种转换是由映射方式、窗口和视口的原点,以及窗口和视口的范围所控制的。映射方式还隐含地给出了x轴和y轴的指向。 映射方式种类映射方式逻辑单位增 加 值x值y值MM_TEXTMM_LOMETRICMM_HIMETRICMM_LOENGLISHMM_HIENGLISHMM_TWIPSMM_ISOTROPICMM_ANISOTROPIC像素0.1mm0.01mm0.01in.0.001in.1/1440 in.任意(x=y)任意(x!=y)右右右右右右可选可选下上上上上上可选可选

15、默认映射方式为MM_TEXT SetMapMode函数 int SetMapMode( HDC hdc, / handle of device context int fnMapMode / new mapping mode ); GetMapMode函数 int GetMapMode( HDC hdc / handle of device context );注意:虽然在GDI函数中指定的坐标是32位的值,但是仅有Windows NT 能够处理全32位。在Windows 98中,坐标被限制为16位,范围从-32768到32767。 设备坐标和逻辑坐标 使用设备坐标的情况Windows对所有消

16、息(如WM_MOVE、WM_SIZE和WM_MOUSEMOVE),对所有非GDI函数,甚至对一些GDI函数,永远使用设备坐标。GetSystemMetrics不是GDI函数,所以它总是以设备单位为量度来返回大小的。尽管GetDeviceCaps是GDI函数,但是Windows仍然对HORZRES和VERTRES以设备单位作为返回值,因为该函数的目的之一就是给程序提供以像素为单位的设备大小。 使用逻辑坐标的情况基本上大多数GDI函数使用逻辑坐标。而且GetTextMetrics调用中返回的TEXTMETRIC结构的值是使用逻辑单位的。 设备坐标系Windows将GDI函数中指定的逻辑坐标映射为设

17、备坐标。 屏幕坐标当我们使用整个屏幕时,就根据“屏幕坐标”进行操作。屏幕的左上角为(0,0)点,屏幕坐标用在WM_MOVE消息(对于非子窗口)以及下列Windows函数中:CreateWindow和MoveWindow(都是对于非子窗口)、GetMessagePos、GetCursorPos、SetCursorPos、GetWindowRect、WindowsFromPoint等。它们或者是与窗口无关的函数,或者是必须相对于整个屏幕点来移动(或者寻找)窗口的函数。如果以DISPLAY为参数调用CreateDC,以获取整个屏幕的设备描述表,则默认情况下GDI调用中指定的逻辑坐标将被映射为屏幕坐标

18、。 整窗口坐标“整窗口坐标”以程序的整个窗口为基准,如标题栏、菜单、滚动条和窗口框都包括在内。整窗口坐标在Windows极少使用,但是如果用GetWindowDC获取设备描述表,GDI函数中的逻辑坐标就会转换为整个窗口坐标。 客户区坐标客户区坐标是最常使用的坐标系,点(0,0)是客户区的左上角。当使用GetDc或BeginPaint获取设备表述表时,GDI函数中的逻辑坐标就会默认地转换为客户区坐标。 ClientToScreen函数 BOOL ClientToScreen( HWND hWnd, / window handle for source coordinates LPPOINT lp

19、Point / pointer to structure containing screen coordinates ); ScreenToClient函数 BOOL ScreenToClient( HWND hWnd, / window handle for source coordinates LPPOINT lpPoint / address of structure containing coordinates ); GetWindowRect函数 BOOL GetWindowRect( HWND hWnd, / handle to window LPRECT lpRect / add

20、ress of structure for window coordinates );说明:该函数用于获取屏幕坐标下的整个窗口的位置和大小。 视口和窗口 视口“视口”是基于设备坐标(像素)的。通常,视口和客户区相同,但是,如果用户已经用GetWindowDC或CreateDC获取了一个设备描述表,则视口也可以指整窗口坐标或者屏幕坐标。点(0,0)是客户区(或者整个窗口或屏幕)的左上角,x的值向右增加,y的值向下增加。 窗口“窗口”是基于逻辑坐标的,逻辑坐标可以是像素、mm、英寸,或者用户想要的任何其他单位。 转换公式 从窗口坐标转化为视口坐标:其中,(xWindow,yWindow)是待转换的

21、逻辑点;(xViewport,yViewport)是转换后的设备坐标点,更像客户区坐标;(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在默认的设备描述表中,这两个点均被设置为(0,0),但是它们可以改变。这表明,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。如果窗口和视口的原点是默认值(0,0),则公式简化为:在上公式中,(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围。在多数映射方式中,范围是映射方式所隐含的

22、,不能够改变。每个范围自身没有什么意义,但是视口范围与窗口范围的比是逻辑单位转换为设备单位的换算因子。例如,当用户设置MM_LOENGLISH映射方式时,Windows将xViewExt设置为某个像素而将xWinExt设置为xViewExt像素占据的一英寸内有几百像素的长度。比值给出了一英寸内有几百个像素的数值。注意:范围可以为负,逻辑x轴上的不一定非得在向右时增加;逻辑y轴上的值不一定非得在向下时增加。 从视口坐标转换为窗口坐标 DPtoLP函数 BOOL DPtoLP( HDC hdc, / handle to device context LPPOINT lpPoints, / poin

23、ter to array of points int nCount / count of points ); LPtoDP函数 BOOL LPtoDP( HDC hdc, / handle of device context LPPOINT lpPoints, / array of points int nCount / count of points );例如:GetClientRect(hwnd,&rect); DPtoLP(hdc,(PPOINT)&rect,2); 处理MM_TEXT 默认值窗口原点:(0,0) 可以改变视口原点:(0,0) 可以改变窗口范围:(1,1) 不可改变视口范

24、围:(1,1) 不可改变 简化公式 SetViewportOrgEx函数 BOOL SetViewportOrgEx( HDC hdc, / handle of device context int X, / new x-coordinate of viewport origin int Y, / new y-coordinate of viewport origin LPPOINT lpPoint / address of structure receiving original origin );说明:用于改变视口的原点。 SetWindowOrgEx函数 BOOL SetWindowOr

25、gEx( HDC hdc, / handle of device context int X, / new x-coordinate of window origin int Y, / new y-coordinate of window origin LPPOINT lpPoint / address of structure receiving original origin );说明:用于改变窗口的原点。如果将视口原点改变为(xViewOrg,yViewOrg),则逻辑点(0,0)就会映射为设备点(xViewOrg,yViewOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg

26、),则逻辑点(xWinOrg,yWinOrg)将会映射为设备点(0,0)。例如,假设客户区为cxClient个像素宽和cyClient个像素高。如果将逻辑点(0,0)定义为客户区的中心,则进行如下调用:SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);则客户区的坐标系变成如下形状:这时在客户区的左上角开始显示文本,需进行如下调用:TextOut(hdc,-cxClient/2,-cyClient/2,”HELLO”,5);用以下调用代替上述调用:(效果相同)SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NU

27、LL)TextOut(hdc,-cxClient/2,-cyClient/2,”HELLO”,5);一般情况下,不会将这两个函数一起用,除非知道这么做的结果:SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL); GetViewportOrgEx函数 BOOL GetViewportOrgEx( HDC hdc, / handle of device context LPPOINT lpPoint / address of structure recei

28、ving the viewport origin ); GetWindowOrgEx函数 BOOL GetWindowOrgEx( HDC hdc, / handle of device context LPPOINT lpPoint / address of structure receiving the window origin ); “度量”映射方式Windows包含5种以物理尺寸来表示逻辑坐标的映射方式。由于x轴和y轴的逻辑坐标映射为相同的物理单位,这些映射方式能使用户画出不变形的圆和矩形。映射方式逻辑单位英寸mmMM_LOENGLISHMM_LOMETRICMM_HIENGLISH

29、MM_TWIPSMM_HIMETRIC0.01英寸0.1mm0.001英寸1/1400英寸0.01mm0.010.003940.0010.0006940.0003940.2540.10.02540.01760.01 默认值窗口原点:(0,0) 可以改变视口原点:(0,0) 可以改变窗口范围:(?,?) 不可改变视口范围:(?,?) 不可改变对于MM_LOENGLISH,Windows计算的范围如下:例如:假设Windows 98使用96 dpi的系统字体,这样对MM_LOENGLISH来说,96除以100的比值是0.01英寸装像素数。对MM_LOMETRIC来说,96除以254的比值是0.1mm中的像素数。Windows 98下的映射方式:映射方式视口范围(x,y)窗口范围(x,y)MM_LOMETRIC MM_HIMETRICMM_LOENGLISH MM_HIENGLISH MM_TWIPS (96,96)(96,96)(96,96)(96,96)(96,96)(254,-254)(2540,-2540)(100,-100)(1000,-1000)(1440,-1440)Windows NT下的映射方式:映射方式视口范围(x,y)窗口范围(x,y)MM_LOMETRIC MM_HIMETRICMM_LOENGLISH MM_HIENGLISH MM_TWIP

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1