Windows编程入门-设备环境的信息

来源:互联网 发布:cgi加载java class 编辑:程序博客网 时间:2024/06/05 05:59
设备环境通常指的是物理的显示设备,如视频显示器或者打印机。经常需要获取这些设备的某些信息,包括显示器的大小(以像素或者物理尺寸的方式)和它的色彩能力。这些信息可以通过调用GetDeviceCaps(意思为获取设备的能力)函数来获取:
iValue = GetDeviceCaps(hdc, iIndex);
其中,参数iIndex是定义在WINGDI.H头文件中的29个标识符之一。例如,当iIndex的值为HORZRES时,GetDeviceCaps函数以像素为单位返回设备的宽度;使用VERTRES参数值会以像素为单位返回设备的高度。如果hdc是一个屏幕设备环境的句柄,这里所获取的信息和从GetSystemMetrics函数获取的信息是一样的。如果hdc是一个打印机设备环境,那么GetDeviceCaps将以像素为单位返回打印机显示区域的高度和宽度。
还可以使用GetDeviceCaps函数来确定设备处理各种类型图形的能力。通常这对于视频显示器并不重要,但是对于打印机却非常重要。例如大多数的绘图仪不能绘制位图图像,通过调用GetDeviceCaps函数可以让你提前知道这一情况。
代码示例:
/*---------------------------------------------------------   DEVCAPS1.C -- Device Capabilities Display Program No. 1                 (c) Charles Petzold, 1998  ---------------------------------------------------------*/#include <windows.h>#define NUMLINES ((int) (sizeof devcaps / sizeof devcaps [0])) struct{     int     iIndex ;     TCHAR * szLabel ;     TCHAR * szDesc ;}devcaps [] ={     HORZSIZE,      TEXT ("HORZSIZE"),     TEXT ("Width in millimeters:"),     VERTSIZE,      TEXT ("VERTSIZE"),     TEXT ("Height in millimeters:"),     HORZRES,       TEXT ("HORZRES"),      TEXT ("Width in pixels:"),     VERTRES,       TEXT ("VERTRES"),      TEXT ("Height in raster lines:"),     BITSPIXEL,     TEXT ("BITSPIXEL"),    TEXT ("Color bits per pixel:"),     PLANES,        TEXT ("PLANES"),       TEXT ("Number of color planes:"),     NUMBRUSHES,    TEXT ("NUMBRUSHES"),   TEXT ("Number of device brushes:"),     NUMPENS,       TEXT ("NUMPENS"),      TEXT ("Number of device pens:"),     NUMMARKERS,    TEXT ("NUMMARKERS"),   TEXT ("Number of device markers:"),     NUMFONTS,      TEXT ("NUMFONTS"),     TEXT ("Number of device fonts:"),     NUMCOLORS,     TEXT ("NUMCOLORS"),    TEXT ("Number of device colors:"),     PDEVICESIZE,   TEXT ("PDEVICESIZE"),  TEXT ("Size of device structure:"),     ASPECTX,       TEXT ("ASPECTX"),      TEXT ("Relative width of pixel:"),     ASPECTY,       TEXT ("ASPECTY"),      TEXT ("Relative height of pixel:"),     ASPECTXY,      TEXT ("ASPECTXY"),     TEXT ("Relative diagonal of pixel:"),     LOGPIXELSX,    TEXT ("LOGPIXELSX"),   TEXT ("Horizontal dots per inch:"),     LOGPIXELSY,    TEXT ("LOGPIXELSY"),   TEXT ("Vertical dots per inch:"),     SIZEPALETTE,   TEXT ("SIZEPALETTE"),  TEXT ("Number of palette entries:"),     NUMRESERVED,   TEXT ("NUMRESERVED"),  TEXT ("Reserved palette entries:"),     COLORRES,      TEXT ("COLORRES"),     TEXT ("Actual color resolution:")} ;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("DevCaps1") ;     HWND         hwnd ;     MSG          msg ;     WNDCLASS     wndclass ;          wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = NULL ;     wndclass.lpszClassName = szAppName ;          if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }          hwnd = CreateWindow (szAppName, TEXT ("Device Capabilities"),                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;          ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;          while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static int  cxChar, cxCaps, cyChar ;     TCHAR       szBuffer[10] ;     HDC         hdc ;     int         i ;     PAINTSTRUCT ps ;     TEXTMETRIC  tm ;          switch (message)     {     case WM_CREATE:          hdc = GetDC (hwnd) ;                    GetTextMetrics (hdc, &tm) ;          cxChar = tm.tmAveCharWidth ;          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;          cyChar = tm.tmHeight + tm.tmExternalLeading ;                    ReleaseDC (hwnd, hdc) ;          return 0 ;               case WM_PAINT:          hdc = BeginPaint (hwnd, &ps) ;                    for (i = 0 ; i < NUMLINES ; i++)          {               TextOut (hdc, 0, cyChar * i,                        devcaps[i].szLabel,                        lstrlen (devcaps[i].szLabel)) ;                              TextOut (hdc, 14 * cxCaps, cyChar * i,                        devcaps[i].szDesc,                        lstrlen (devcaps[i].szDesc)) ;                              SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;                              TextOut (hdc, 14 * cxCaps + 35 * cxChar, cyChar * i, szBuffer,                        wsprintf (szBuffer, TEXT ("%5d"),                             GetDeviceCaps (hdc, devcaps[i].iIndex))) ;                              SetTextAlign (hdc, TA_LEFT | TA_TOP) ;          }                    EndPaint (hwnd, &ps) ;          return 0 ;               case WM_DESTROY:          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}


原创粉丝点击