3.5、设备信息
一个设备对象通常与一个物理显示设备(例如显示器和打印机等)相关联,这些设备的有关信息可以通过调用GetDeviceCaps函数来获取。表3-8给出了该函数的一些使用说明,在本指南中,当需要用该函数的其他功能时,再进行有关的讨论。
表3-8 GetDeviceCaps 函数
| 用 途 |
获取一个设备的设备信息。 |
| 原 型 |
| int GetDeviceCaps( |
|
| HDC hDC, |
设备对象句柄 |
| int nIndex |
|
| ); |
| |
| 返回值 |
返回所需要项的值。 |
表3-8-1 nIndex 值
| 常量 |
说明 |
| HORZSIZE |
物理显示器的宽度(mm) |
| VERTSIZE |
物理显示器的高度(mm) |
| HORZRES |
物理显示器的宽度(象素) |
| VERTRES |
物理显示器的高度(象素,严格说是光栅行数) |
| LOGPIEXLSX |
沿显示宽度方向每逻辑英寸的象素数 |
| LOGPIEXLSY |
沿显示高度方向每逻辑英寸的象素数 |
| BITSPIEXL |
表示每个象素所需要的位数目 |
| PLANES |
色平面数 |
| NUMBRUSHES |
刷子的数目 |
| NUMPENS |
笔的数目 |
| NUMFONTS |
字体的数目 |
| NUMCOLORS |
设备的颜色表中的项目数 |
| ASPECTX |
一个象素的相对宽度 |
| ASPECTY |
一个象素的相对高度 |
| ASPECTXY |
象素的相对对角线宽度 |
LOGPIXELSX和LOGPIXELSY的值分别是水平和垂直方向每一“逻辑寸”中的象素数。一个逻辑寸大小约是1.5英寸,这取决于显示设备的分辨率。逻辑寸实际上放大显示,以便将所显示的文本放大到一个适当的大小。
3.6、颜色的使用 关于颜色的定量表示,有许多方法,其中一种方法分别使用0到255的数值来表示一种颜色中红(
R)、绿(
G)和蓝(
B)三基色的相对强度,这中方法被称为RGB颜色模型。Windows用一个无符号长整数来表示颜色,其中最低三字节分别指定0到255范围内的红、绿和蓝三基色的相对强度。在Windows中,使用COLORREF类型(或DWORD类型)的数据表示RGB颜色值。
在Windows.h中定义的宏RGB将三个表示红、绿、蓝的值组成一个RGB颜色值。例如:RGB(0,0,0)表示黑色,RGB(255,255,255)表示白色,其他常见的RGB颜色如下:
| 类型 |
说明 |
| RGB(255, 0, 0) |
红色 |
| RGB(0, 255, 0) |
绿色 |
| RGB(0, 0, 255) |
蓝色 |
| RGB(255, 0, 255) |
紫色 |
| RGB(255, 255, 0) |
黄色 |
| RGB(0, 255, 255) |
青色 |
宏GetRValue、GetGValue和GetBValue从RGB值中提取无符号单字节的基色值。
Windows还可以通过灰度比方式来显示附加的颜色,即将不同的单色象素组合成象素图案,不同的红、绿、蓝颜色组成不同的灰度比图案。
另外,Windows为了对各个显示元素进行着色,还维护着19种系统颜色(见表示表3-9),程序员可以使用函数GetSysColor或SetSysColors来获取或设置这些系统颜色(见表3-10)。这些颜色的缺省值是由设备驱动程序提供的。
表3-9 Windows的缺省系统颜色
| 常量 |
说明 |
| COLOR_SCROLLBAR |
滚动杠的灰色区域 |
| COLOR_BACKGROUND |
桌面的背景(屏幕背景) |
| COLOR_ACTIVECAPTION |
活动窗口的标题栏 |
| COLOR_INACTIVECAPTION |
非活动窗口的标题栏 |
| COLOR_MENU |
选单背景 |
| COLOR_MENUTEXT |
选单文本 |
| COLOR_WINDOW |
窗口的背景 |
| COLOR_WINDOWFRAME |
窗口的框架 |
| COLOR_CAPTIONTEXT |
标题栏中的文本 |
| COLOR_ACTIVEBORDER |
活动窗口的边框 |
| COLOR_APPWORKSPACE |
多文档界面应用程序的背景 |
| COLOR_HIGHLIGHT |
选项 |
| COLOR_HIGHLIGHTTEXT |
选项中的文本 |
| COLOR_BTNFACE |
按钮的边缘 |
| COLOR_BTNTEXT |
按钮上的文本 |
| COLOR_GRAYTEXT |
按钮(灰色文本) |
表3-10-1 SetSysColors 函数
| 用 途 |
该函数为一个或多个显示元素设置系统颜色(显示元素指的是系统和窗口的各个不同的部分。 |
| 原 型 |
| VOID SetSysColors( |
|
| int nChanges, |
需改变的系统颜色数目。 |
| LPINT lpSysColor, |
int类型的指针,所指向的变量中指定了将要改变的元素,可用的值见表3-9。 |
| DWORD FAR *lpColorValue |
所指向的变量中包含了每个元素新的RGB颜色值。 |
| ); |
| |
| 注 意 |
该函数将改变当前正运行的所有应用程序的窗口颜色。该函数将各窗口发送WM_SYSCOLORCHANG消息,通知颜色的变化。 |
表3-10-2 GetSysColor 函数
| 用 途 |
检索指定的显示元素的当前色。 |
| 原 型 |
| VOID GetSysColors( |
|
| int nIndex, |
指定要检索其颜色的显示元素,见表3-9。 |
| ); |
| |
| 返回值 |
所指定的显示元素的RGB值,对单色显示器,系统颜色可解释为灰度图案。 |
3.7、使用刷子 刷子用于擦除用户区中显示的内容,也用于填充GDI图形函数建立的封闭图形。Windows提供的可供程序员使用的库存刷子有:
| 常量 |
说明 |
| WHITE_BRUSH |
白色刷子 |
| LTGRAY_BRUSH |
浅灰色刷子 |
| GRAY_BRUSH |
灰色刷子 |
| DKGRAY_BRUSH |
深灰色刷子 |
| BLACK_BRUSH |
黑色刷子 |
| HOLLOW(or NULL)_BRUSH |
空刷子 |
一个刷子由HBRUSH类型的句柄标识。库存刷子的句柄可由函数GetStockObject函数获得。例如,下面的语句获得一个灰色刷子,并将其句柄存于hBrush中。
HBRUSH hBrush = GetStockObject(GRAY_BRUSH); 使用函数SelectObject将一个刷子选入一个设备对象中,这样,在以后填充封闭图形时,使用选入到设备对象中的刷子。例如,将上面的语句所获得的库存刷子选入hDC标识的设备对象中,使用语句:
hOldBrush = SelectObject(hDC, hBrush); 函数SelectObject返回设备对象中先前已存在的刷子,在上例中,将它保存在HBRUSH类型的变量hOldBrush中。程序员可以使用函数CreateSolidBrush和CreateHatchBrush创建自己的刷子,表3-11给出了这两个函数的说明。
表3-11-1 CreateSolidBrush 函数
| 用 途 |
创建一个指定颜色的逻辑刷子。 |
| 原 型 |
| HBRUSH CreateSolidBrush |
|
| COLORREF crColor |
RGB颜色值。 |
| ); |
| |
| 注 意 |
如果调用成功,返回一个刷子句柄,否则返回NULL。 |
表3-11-2 CreateHatchBrush 函数
| 用 途 |
创建一个具有指定阴影图案和颜色的逻辑刷子。 |
| 原 型 |
| HBRUSH CreateHatchBrush |
|
| int nIndex, |
刷子的阴影类型,见后面的说明。 |
| COLORREF crColor |
刷子影线的颜色。 |
| ); |
| |
| 返回值 |
如果调用成功,返回一个刷子句柄,否则返回NULL。 |
| 常量 |
说明 |
| HS_HORIZONTAL |
- - - - 水平影线 |
| HS_VERTICAL |
| | | | 垂直影线 |
| HS_FDIAGONAL |
/ / / / 45度向上影线 |
| HS_BDIAGONAL |
\ \ \ \ 45度向下影线 |
| HS_CROSS |
+ + + + 水平和垂直交叉影线 |
| HS_DIAGCROSS |
X X X X 45度交叉影线 |
例如,下列程序段分别创建一个绿色刷子和一个红色影线刷子。
hGreenBrush = CreateSolidBrush(RGB(0,255,0));
hRedHatchedBrush = CreateHatchBrush(HS_CROSS, RGB(255,0,0)); 程序员创建的刷子在不再使用时一定要删除(使用函数DeleteObject)。删除库存刷子是非法的。
DeleteObject(hGreenBrush);
DeleteObject(hRedHatchedBrush); 下面的程序建立一个背景色为交叉影线的窗口。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBRUSH OrgBrush, hBrush;
HDC hDC;
char msg[256] = "Hello, Welcome to cgd.gamedoor.net!";
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
OrgBrush = GetClassWord(hwnd, GCW_HBRBACKGROUND);
hBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,255,0));
SetClassWord(hwnd, GCW_HBRBACKGROUND, hBrush);
InvalidateRect(hwnd, NULL, TRUE);
UpdateWidnow(hwnd);
return 0;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 0, 0, msg, sizeof(msg)-1);
ValidateRect(hwnd, NULL);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
SetClassWord(hwnd, GCW_HBRBACKGROUND, OrgBrush);
DeleteObject(hBrush);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
} 在程序中,语句:
GetClassWord(hwnd, GCW_HBRBACKGROUND); 获取在类所指定的刷子的句柄,语句:
SetClassWord(hwnd, GCW_HBRBACKGROUND, hBrush); 重新将类刷子设置为程序员所创建的刷子。为了用新刷子清楚用户区,语句:
InvalidateRect(hwnd, NULL, TRUE); 使整个用户区无效。程序中使用的函数SetBkMode见3.9节。
3.8、使用笔
GDI函数使用笔画线或绘制图形的轮廓。Windows库存的笔包括:
| 常量 |
说明 |
| WHITE_PEN |
白色笔 |
| BLACK_PEN |
黑色笔 |
| NULL_PEN |
空笔 |
笔有类型为HPEN的句柄来标识,库存的笔可用函数GetStockObject来获取:
HPEN hPen = GetStockObject(WHITE_PEN); 它返回标识一个库存笔的句柄。设备对象中缺省的笔是BLACK_PEN。程序员也可以使用函数GreatePen创建定制的笔,如表3-12。
表3-12-1 GreatePen 函数
| 用 途 |
创建一支具有指定类型、宽度和颜色的逻辑笔。 |
| 原 型 |
| HPEN CreatePen( |
|
| int nPenStyle, |
笔的类型,见后面的说明 |
| int nWidth, |
以逻辑单位定义的笔的宽度 |
| COLORREF crColor |
RGB颜色值 |
| ) |
| |
| 返回值 |
如果函数成功,则返回值是标识一个逻辑笔对象的句柄,否则为NULL。 |
表3-12-2 GreatePenIndirect 函数
| 用 途 |
创建一支逻辑笔。 |
| 原 型 |
| HPEN CreatePenIndirect( |
|
| LOGPEN FAR *lpLogPen |
指向包含逻辑笔类型、宽度和颜色的一个LOGPEN类型的变量 |
| ) |
| |
| 返回值 |
返回一个逻辑笔对象的句柄,如果不成功,返回NULL。 |
类型LOGPEN的说明为:
typedef struct tagLOGPEN {
WORD lopnStyle; // 笔的类型,见后表的说明。 POINT lopnWidth; // 笔的宽度(逻辑单位),若要为0,则宽度为一个象素宽。 COLORREF lopnColor; // 笔的颜色,为RGB颜色值。 } LOGPEN;
| 常量 |
说明 |
| PS_SOLID |
_______ |
| PS_DASH |
------- |
| PS_DOT |
....... |
| PS_DASHDOT |
_._._._ |
| PS_DASHDOTDOT |
_.._.._.._ |
| PS_NULL |
空笔 |
| PS_INSIDEFRAME |
________ |
|
笔的类型由上列常量定义 |
注意:如果笔的宽大于1,并且笔的类型为PS_INSIDEFRAME,则线条被画在多边形基本框架里边;如果笔的宽度大小或等于1,则类型PS_INSIDEFRAME与类型PS_SOLIDE完全相同;如果笔的颜色不能与可利用的RGB值相匹配,则PS_INSIDEFRAME类型的笔的颜色使用逻辑颜色,它通过将几种纯颜色混合形成所需要的颜色。物理宽度大于1象素的笔总为空或实类型的笔。
下面的程序片段使用函数CreatePen创建一支红色笔,并选入到设备对象中:
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255,0,0));
hPen = SelectObject(hDC, hPen); 当程序创建的笔不再使用时,应使用函数DeletObject将其删除:
DeleteObject(hPen); 但删除库存笔是非法的。库存笔和程序员创建的任何宽度为0的笔的实际宽度为1个象素,这在高分辨率的显示器上表示为极细的线。如果当前的映射方式是MM_TEXT方式,最好通过调用带有SM_CXBORDER和SM_CYBORDER索引的GetSystemMetrics(见表3-13)来获得单线窗口边框的宽度,将这些值用作笔宽。也可使用其他映射方式为程序中创建的笔设置特定的物理宽度。
表3-13 GetSystemMetrics 函数
| 用 途 |
检索系统度量。系统度量是Windows显示的各种元素的宽和高。 |
| 原 型 |
| int GetSystemMetrics( |
|
| int nIndex |
指定要检索的系统度量,见后面的说明 |
| ) |
| |
| 返回值 |
返回所要求的以象素给出的系统度量。 |
| 常量 |
说明 |
| SM_CXSCREEN |
屏幕的宽度 |
| SM_CYSCREEN |
屏幕的高度 |
| SM_CXFRAME |
能缩放窗口的边框的宽度 |
| SM_CYFRAME |
能缩放窗口的边框的高度 |
| SM_CXVSCROLL |
垂直滚动杠箭头的位图的宽度 |
| SM_CYVSCROLL |
垂直滚动杠箭头的位图的高度 |
| SM_CXHSCROLL |
水平滚动杠箭头的位图的宽度 |
| SM_CYHSCROLL |
水平滚动杠箭头的位图的高度 |
| SM_CXBORDER |
不能缩放的窗口的边框的宽度 |
| SM_CYBORDER |
不能缩放的窗口的边框的高度 |
| SM_CXDLGFRAME |
具有WS_DLGFRAME窗口的边框的宽度 |
| SM_CYDLGFRAME |
具有WS_DLGFRAME窗口的边框的高度 |
| SM_CXICON |
图标的宽度 |
| SM_CYICON |
图标的高度 |
| SM_CXCURSOR |
光标的宽度 |
| SM_CYCURSOR |
光标的高度 |
| SM_CXFULLSCREEN |
全屏幕窗口的窗口区宽度 |
| SM_CYFULLSCREEN |
全屏幕窗口的窗口区高度 |
上一页 [1] [2] [3] [4] 下一页