《Windows程序设计》读书笔记------------->>设备内容句柄之二<<
2007-07-20 21:57
549 查看
这一节主要是书商设备内容的第二部分,地址在这里:http://www.ai86.cn/book/windows_programming/5.htm#205002
设备内容里面包含了很多写字、画画使用的属性,这些如果不指定直接都是可以用的,那么就是默认值了。但是,如果被改变了,这些属性会在释放设备句柄时失去。所以记得随改随用,在释放前用了。具体拥有的属性在下面这个表里面有:
[align=center][/align]
保存设备内容
通常,在您呼叫GetDC或BeginPaint时,Windows用默认值建立一个新的设备内容,您对属性所做的一切改变在设备内容用ReleaseDC或EndPaint呼叫释放时,都会丢失。如果您的程序需要使用非内定的设备内容属性,则您必须在每次取得设备内容句柄时初始化设备内容:
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//设备内容属性
//绘制窗口显示区域
EndPaint(hwnd,&ps);
return0;
虽然在通常情况下这种方法已经很令人满意了,但是您还可能想要在释放设备内容之后,仍然保存程序中对设备内容属性所做的改变,以便在下一次呼叫GetDC和BeginPaint时它们仍然能够起作用。为此,可在登录窗口类别时,将CS_OWNDC旗标纳入窗口类别的一部分:
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
现在,依据这个窗口类别所建立的每个窗口都将拥有自己的设备内容,它一直存在,直到窗口被删除。如果使用了CS_OWNDC风格,就只需初始化设备内容一次,可以在处理WM_CREATE消息处理期间完成这一操作:
caseWM_CREATE:
hdc=GetDC(hwnd);
//初始化设备内容属性
ReleaseDC(hwnd,hdc);
这些属性在改变之前一直有效。
CS_OWNDC风格只影响GetDC和BeginPaint获得的设备内容,不影响其它函数(如GetWindowDC)获得的设备内容。以前不提倡使用CS_OWNDC风格,因为它需要内存;现在,在处理大量图形的WindowsNT应用程序中,它可以提高性能。即使用了CS_OWNDC,您仍然应该在退出窗口消息处理程序之前释放设备内容。
某些情况下,您可能想改变某些设备内容属性,用改变后的属性进行绘图,然后恢复原来的设备内容。要简化这一过程,可以通过如下呼叫来保存设备内容的状态:
现在,可以改变一些属性,在想要回到呼叫SaveDC前存在的设备内容时,呼叫:
您可以在呼叫RestoreDC之前呼叫SaveDC数次。
大多数程序写作者以不同的方式使用SaveDC和RestoreDC。然而,更像汇编语言中的PUSH和POP指令,当您呼叫SaveDC时,不需要保存传回值:
然后,您可以更改某些属性并再次呼叫SaveDC。要将设备内容恢复到一个已经保存的状态,呼叫:
这就将设备内容恢复到最近由SaveDC函数保存的状态中。
设置画笔(后面的内容文章本身写的就很简单了,没有什么写的必要了,就把关键的留下来吧)
①使用标准画笔:
BLACK_PEN是Windows提供的三种现有画笔之一,其它两种是WHITE_PEN和NULL_PEN,NULL_PEN什么都不画。您也可以自己自订画笔。
Windows程序以句柄来使用画笔。
呼叫GetStockObject,可以获得现有画笔的句柄。例如,假设您想使用名为WHITE_PEN的现有画笔,可以如下取得画笔的句柄:
现在必须将画笔选进设备内容:
目前的画笔是白色。在这个呼叫后,您画的线将使用WHITE_PEN,直到您将另外一个画笔选进设备内容或者释放设备内容句柄为止。
您也可以不定义hPen变量,而将GetStockObject和SelectObject呼叫合并成一个叙述:
如果想恢复到使用BLACK_PEN的状态,可以用一个叙述取得这种画笔的句柄,并将其选进设备内容:
SelectObject的传回值是此呼叫前设备内容中的画笔句柄。如果启动一个新的设备内容并呼叫
则设备内容中的目前画笔将为WHITE_PEN,变量hPen将会是BLACK_PEN的句柄。以后通过呼叫
[/code]
[align=left]对于PS_SOLID、PS_NULL和PS_INSIDEFRAME画笔样式,iWidth参数是画笔的宽度。iWidth值为0则意味着画笔宽度为一个图素。现有画笔是一个图素宽。如果指定的是点划线或者虚线式画笔样式,同时又指定一个大于1的实际宽度,那么Windows将使用实线画笔来代替。在与定义一个填入区域的函数一起使用时,PS_INSIDEFRAME画笔样式还有另外一个奇特之处:对于除了PS_INSIDEFRAME以外的所有画笔样式来说,如果用来画边界框的画笔宽度大于1个图素,那么画笔将居中对齐在边界框在线,这样边界框线的一部分将位于边界框之外;而对于PS_INSIDEFRAME画笔样式来说,整条边界框线都画在边界框之内。[/align]
[align=left]CreatePen的crColor参数是一个COLORREF值,它指定画笔的颜色。对于除了PS_INSIDEFRAME之外的画笔样式,如果将画笔选入设备内容中,Windows会将颜色转换为设备所能表示的最相近的纯色。PS_INSIDEFRAME是唯一一种可以使用混色的画笔样式,并且只有在宽度大于1的情况下才如此。[/align]
[align=left][/align]
[align=left]您可以通过如下呼叫来改变Windows背景色:[/align]
与画笔色彩所使用的crColor参数一样,Windows将这里的背景色转换为纯色。可以通过用GetBkColor来取得设备内容中定义的目前背景色。
通过将背景模式转换为TRANSPARENT,可以阻止Windows填入空隙:
可以通过以下呼叫在设备内容中设定新的绘图模式:
设备内容里面包含了很多写字、画画使用的属性,这些如果不指定直接都是可以用的,那么就是默认值了。但是,如果被改变了,这些属性会在释放设备句柄时失去。所以记得随改随用,在释放前用了。具体拥有的属性在下面这个表里面有:
设备内容属性 | 默认值 | 修改该值的函数 | 取得该值的函数 |
MappingMode | MM_TEXT | SetMapMode | GetMapMode |
WindowOrigin | (0,0) | SetWindowOrgEx OffsetWindowOrgEx | GetWindowOrgEx |
ViewportOrigin | (0,0) | SetViewportOrgEx OffsetViewportOrgEx | GetViewportOrgEx |
WindowExtents | (1,1) | SetWindowExtEx SetMapMode ScaleWindowExtEx | GetWindowExtEx |
ViewportExtents | (1,1) | SetViewportExtEx SetMapMode ScaleViewportExtEx | GetViewportExtEx |
Pen | BLACK_PEN | SelectObject | SelectObject |
Brush | WHITE_BRUSH | SelectObject | SelectObject |
Font | SYSTEM_FONT | SelectObject | SelectObject |
Bitmap | None | SelectObject | SelectObject |
CurrentPosition | (0,0) | MoveToEx LineTo PolylineTo PolyBezierTo | GetCurrentPositionEx |
BackgroundMode | OPAQUE | SetBkMode | GetBkMode |
BackgroundColor | White | SetBkColor | GetBkColor |
TextColor | Black | SetTextColor | GetTextColor |
DrawingMode | R2_COPYPEN | SetROP2 | GetROP2 |
StretchingMode | BLACKONWHITE | SetStretchBltMode | GetStretchBltMode |
PolygonFillMode | ALTERNATE | SetPolyFillMode | GetPolyFillMode |
IntercharacterSpacing | 0 | SetTextCharacterExtra | GetTextCharacterExtra |
BrushOrigin | (0,0) | SetBrushOrgEx | GetBrushOrgEx |
ClippingRegion | None | SelectObject SelectClipRgn IntersectClipRgn OffsetClipRgn ExcludeClipRect SelectClipPath | GetClipBox |
保存设备内容
通常,在您呼叫GetDC或BeginPaint时,Windows用默认值建立一个新的设备内容,您对属性所做的一切改变在设备内容用ReleaseDC或EndPaint呼叫释放时,都会丢失。如果您的程序需要使用非内定的设备内容属性,则您必须在每次取得设备内容句柄时初始化设备内容:
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//设备内容属性
//绘制窗口显示区域
EndPaint(hwnd,&ps);
return0;
虽然在通常情况下这种方法已经很令人满意了,但是您还可能想要在释放设备内容之后,仍然保存程序中对设备内容属性所做的改变,以便在下一次呼叫GetDC和BeginPaint时它们仍然能够起作用。为此,可在登录窗口类别时,将CS_OWNDC旗标纳入窗口类别的一部分:
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
现在,依据这个窗口类别所建立的每个窗口都将拥有自己的设备内容,它一直存在,直到窗口被删除。如果使用了CS_OWNDC风格,就只需初始化设备内容一次,可以在处理WM_CREATE消息处理期间完成这一操作:
caseWM_CREATE:
hdc=GetDC(hwnd);
//初始化设备内容属性
ReleaseDC(hwnd,hdc);
这些属性在改变之前一直有效。
CS_OWNDC风格只影响GetDC和BeginPaint获得的设备内容,不影响其它函数(如GetWindowDC)获得的设备内容。以前不提倡使用CS_OWNDC风格,因为它需要内存;现在,在处理大量图形的WindowsNT应用程序中,它可以提高性能。即使用了CS_OWNDC,您仍然应该在退出窗口消息处理程序之前释放设备内容。
某些情况下,您可能想改变某些设备内容属性,用改变后的属性进行绘图,然后恢复原来的设备内容。要简化这一过程,可以通过如下呼叫来保存设备内容的状态:
idSaved=SaveDC(hdc);
现在,可以改变一些属性,在想要回到呼叫SaveDC前存在的设备内容时,呼叫:
RestoreDC(hdc,idSaved);
您可以在呼叫RestoreDC之前呼叫SaveDC数次。
大多数程序写作者以不同的方式使用SaveDC和RestoreDC。然而,更像汇编语言中的PUSH和POP指令,当您呼叫SaveDC时,不需要保存传回值:
SaveDC(hdc);
然后,您可以更改某些属性并再次呼叫SaveDC。要将设备内容恢复到一个已经保存的状态,呼叫:
RestoreDC(hdc,-1);
这就将设备内容恢复到最近由SaveDC函数保存的状态中。
设置画笔(后面的内容文章本身写的就很简单了,没有什么写的必要了,就把关键的留下来吧)
①使用标准画笔:
BLACK_PEN是Windows提供的三种现有画笔之一,其它两种是WHITE_PEN和NULL_PEN,NULL_PEN什么都不画。您也可以自己自订画笔。
Windows程序以句柄来使用画笔。
HPENhPen;
呼叫GetStockObject,可以获得现有画笔的句柄。例如,假设您想使用名为WHITE_PEN的现有画笔,可以如下取得画笔的句柄:
hPen=GetStockObject(WHITE_PEN);
现在必须将画笔选进设备内容:
SelectObject(hdc,hPen);
目前的画笔是白色。在这个呼叫后,您画的线将使用WHITE_PEN,直到您将另外一个画笔选进设备内容或者释放设备内容句柄为止。
您也可以不定义hPen变量,而将GetStockObject和SelectObject呼叫合并成一个叙述:
SelectObject(hdc,GetStockObject(WHITE_PEN));
如果想恢复到使用BLACK_PEN的状态,可以用一个叙述取得这种画笔的句柄,并将其选进设备内容:
SelectObject(hdc,GetStockObject(BLACK_PEN));
SelectObject的传回值是此呼叫前设备内容中的画笔句柄。如果启动一个新的设备内容并呼叫
hPen=SelectObject(hdc,GetStockobject(WHITE_PEN));
则设备内容中的目前画笔将为WHITE_PEN,变量hPen将会是BLACK_PEN的句柄。以后通过呼叫
SelectObject(hdc,hPen);
就能够将BLACK_PEN选进设备内容。
②自定义画笔
在使用画笔等GDI对象时,应该遵守以下三条规则: 最后要删除自己建立的所有GDI对象。 当GDI对象正在一个有效的设备内容中使用时,不要删除它。 不要删除现有对象。 这些规则当然是有道理的,而且有时这道理还挺微妙的。下面我们将举些例子来帮助理解这些规则。 CreatePen函数的语法形如: [code]hPen=CreatePen(iPenStyle,iWidth,crColor);
[/code]
七种画笔样式 |
[align=left]CreatePen的crColor参数是一个COLORREF值,它指定画笔的颜色。对于除了PS_INSIDEFRAME之外的画笔样式,如果将画笔选入设备内容中,Windows会将颜色转换为设备所能表示的最相近的纯色。PS_INSIDEFRAME是唯一一种可以使用混色的画笔样式,并且只有在宽度大于1的情况下才如此。[/align]
[align=left][/align]
[align=left]您可以通过如下呼叫来改变Windows背景色:[/align]
SetBkColor(hdc,crColor);
与画笔色彩所使用的crColor参数一样,Windows将这里的背景色转换为纯色。可以通过用GetBkColor来取得设备内容中定义的目前背景色。
通过将背景模式转换为TRANSPARENT,可以阻止Windows填入空隙:
SetBkMode(hdc,TRANSPARENT);
可以通过以下呼叫在设备内容中设定新的绘图模式:
SetROP2(hdc,iDrawMode);
各种绘图模式如下表:
画笔(P):目标(D): | 11 | 10 | 01 | 00 | 布尔操作 | 绘图模式 |
结果: | 0 | 0 | 0 | 0 | 0 | R2_BLACK |
0 | 0 | 0 | 1 | ~(P|D) | R2_NOTMERGEPEN | |
0 | 0 | 1 | 0 | ~P&D | R2_MASKNOTPEN | |
0 | 0 | 1 | 1 | ~P | R2_NOTCOPYPEN | |
0 | 1 | 0 | 0 | P&~D | R2_MASKPENNOT | |
0 | 1 | 0 | 1 | ~D | R2_NOT | |
0 | 1 | 1 | 0 | P^D | R2_XORPEN | |
0 | 1 | 1 | 1 | ~(P&D) | R2_NOTMASKPEN | |
1 | 0 | 0 | 0 | P&D | R2_MASKPEN | |
1 | 0 | 0 | 1 | ~(P^D) | R2_NOTXORPEN | |
1 | 0 | 1 | 0 | D | R2_NOP | |
1 | 0 | 1 | 1 | ~P|D | R2_MERGENOTPEN | |
1 | 1 | 0 | 0 | P | R2_COPYPEN(内定) | |
1 | 1 | 0 | 1 | P|~D | R2_MERGEPENNOT | |
1 | 1 | 1 | 0 | P|D | R2_MERGEPEN | |
1 | 1 | 1 | 1 | 1 | R2_WHITE |
③画刷
画刷决定了一个填充区域(比入说一个正方形的中间)的样式:
您可以用HBRUSHhBrush; hBrush=GetStockObject(GRAY_BRUSH); SelectObject(hdc,hBrush);
来使用包含如下6个的系统画刷:WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH
也可以自定义:
HBRUSHCreateSolidBrush( COLORREFcrColor//brushcolorvalue );
或者更改一下样式:
hBrush=CreateHatchBrush(iHatchStyle,crColor);
相关文章推荐
- 《Windows程序设计》读书笔记------------->>设备内容之一<<
- 《Windows程序设计》读书笔记------------->>窗口和消息 ---- 具体设定<<
- 《Windows程序设计》读书笔记------------->>输出文字----绘制和更新<<
- 《Windows程序设计》读书笔记------------->>基本滚动条<<
- 《Windows程序设计》读书笔记------------->>字符消息<<
- 《Windows程序设计》读书笔记------------->>字符集和字体<<
- 《Windows程序设计》读书笔记------------->>关于Unicode<<
- 《Windows程序设计》读书笔记------------->>窗口和消息 -- 代码结构和消息机制<<
- 《Windows程序设计》读书笔记------------->>开始画画!<<
- 《Windows程序设计》读书笔记------------->>矩形、区域和剪裁<<
- 《Windows程序设计》读书笔记------------->>第一个应用程序<<
- 《Windows程序设计》读书笔记------------->>Virtual-Key Codes (虚拟键码)<<翻译自MSDN
- 《Windows程序设计》读书笔记------------->>鼠标基础和显示区域鼠标消息<<
- 《Windows程序设计》读书笔记------------->>文字输出——多行文字<<
- 《Windows程序设计》读书笔记------------->>GDI的简单基础<<
- 《Windows程序设计》读书笔记------------->>GDI 映像方式<<
- 《Windows程序设计》读书笔记------------->>滚动条使用(翻译自MSDN)<<
- 《Windows程序设计》读书笔记------------->>键盘消息<<
- 《Windows程序设计》读书笔记------------->>文字输出---------TextOut单行输出<<
- HTML <div>标签 内容超出div固定高度,超出部分隐藏