| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> C++ >> C++技术资料 >> 正文
  ►  Windows编程基础 - 设备对象属性
Windows编程基础 - 设备对象属性
作者:未知    阅读人次:……    文章来源:未知    发布时间:2004-12-21    网友评论()条
 



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] 下一页

 

 
文章录入:静夜思    责任编辑:静夜思 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子