windows程序设计之 「DevCaps2.C」范例分析 笔记

/*------------------------------------------------------------------
   DEVCAPS2.C -- Displays Device Capability Information (Version 2)
                 (c) Charles Petzold, 1998
------------------------------------------------------------------*/


#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
void DoBasicInfo    (HDC, HDC, int, int) ;
void DoOtherInfo    (HDC, HDC, int, int) ;
void DoBitCodedCaps (HDC, HDC, int, int, int) ;

typedef struct
{
     int     iMask ;
     TCHAR * szDesc ;
}
BITS ;

#define IDM_DEVMODE       1000

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                         PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("DevCaps2 ") ;
     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   = szAppName ;
     wndclass.lpszClassName   = szAppName ;
    
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL , TEXT ("This program requires Windows NT! "),
                      szAppName, MB_ICONERROR ) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, NULL ,
                          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 TCHAR            szDevice[32], szWindowText[64] ;
     static int                  cxChar, cyChar, nCurrentDevice = IDM_SCREEN ,
                                                              nCurrentInfo     = IDM_BASIC ;
     static DWORD            dwNeeded, dwReturned ;
     static PRINTER_INFO_4 * pinfo4 ;
     static PRINTER_INFO_5 * pinfo5 ;
     DWORD                   i ;
     HDC                        hdc, hdcInfo ;
     HMENU                   hMenu ;
     HANDLE                  hPrint ;
     PAINTSTRUCT             ps ;
     TEXTMETRIC               tm ;
    
     switch (message)
     {
     case WM_CREATE :
          //获取系统文字宽高
          hdc = GetDC (hwnd) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT )) ;
          GetTextMetrics (hdc, &tm) ;
          cxChar = tm.tmAveCharWidth ;
          cyChar = tm.tmHeight + tm.tmExternalLeading ;
          ReleaseDC (hwnd, hdc) ;
          // fall through
     case WM_SETTINGCHANGE :
          //取得 Device 菜单中激活的下拉式菜单或子菜单的句柄
          hMenu = GetSubMenu (GetMenu (hwnd), 0) ;
         
          /* GetMenuItemCount 返回菜单中条目(菜单项)的数量 */
          while (GetMenuItemCount (hMenu) > 1)
          /*DeleteMenu 删除指定的菜单条目
            (菜单句柄, 条目在菜单中的位置, wFlags中设置的标志)*/

               DeleteMenu (hMenu, 1, MF_BYPOSITION ) ;  //删除screen菜单项之后的所有条目

          if (GetVersion () & 0x80000000 )         // Windows 98
          {
       /* EnumPrinters (枚举本地打印机, 欲对打印机进行枚举的服务器的名字,
                                  欲枚举的结构类型, PRINTER_ENUM_x结构的缓冲区,
                                  缓冲区中的字符数量, 保存请求的缓冲区长度, 保存载入缓冲区的结构数量)*/

               EnumPrinters (PRINTER_ENUM_LOCAL , NULL , 5, NULL ,
                             0, &dwNeeded, &dwReturned) ;

               pinfo5 = malloc (dwNeeded) ;

               EnumPrinters (PRINTER_ENUM_LOCAL , NULL , 5, (PBYTE) pinfo5,
                             dwNeeded, &dwNeeded, &dwReturned) ;

               for (i = 0 ; i < dwReturned ; i++)
               {
                   /* 在指定的位置末尾追加一个新菜单项
                      (将被修改的菜单条句柄, 以16为单位添加垂直分割线, 新菜单项的标识符,新菜单项的内容)*/

                    AppendMenu (hMenu, (i+1) % 16 ? 0 : MF_MENUBARBREAK , i + 1,
                                pinfo5[i].pPrinterName) ;
               }
               free (pinfo5) ;
          }
          else                                    // Windows NT
          {
               EnumPrinters (PRINTER_ENUM_LOCAL , NULL , 4, NULL ,
                             0, &dwNeeded, &dwReturned) ;

               pinfo4 = malloc (dwNeeded) ;

               EnumPrinters (PRINTER_ENUM_LOCAL , NULL , 4, (PBYTE) pinfo4,
                             dwNeeded, &dwNeeded, &dwReturned) ;

               for (i = 0 ; i < dwReturned ; i++)
               {
                    AppendMenu (hMenu, (i+1) % 16 ? 0 : MF_MENUBARBREAK , i + 1,
                                pinfo4[i].pPrinterName) ;
               }
               free (pinfo4) ;
          }
         
          AppendMenu (hMenu, MF_SEPARATOR , 0, NULL ) ; //添加一个分割线
          AppendMenu (hMenu, 0, IDM_DEVMODE , TEXT ("Properties ")) ;  //添加打印机对话框菜单项
         
          wParam = IDM_SCREEN ;
                                             // fall through
     case WM_COMMAND :
          hMenu = GetMenu (hwnd) ;
          /* || 逻辑或
             当选择 screen 或者 打印机 时为真*/

          if (LOWORD (wParam) == IDM_SCREEN ||
              LOWORD (wParam) < IDM_DEVMODE )      
          {
              /* 设置当前选择的菜单项标记 */
               CheckMenuItem (hMenu, nCurrentDevice, MF_UNCHECKED ) ;
               nCurrentDevice = LOWORD (wParam) ;
               CheckMenuItem (hMenu, nCurrentDevice, MF_CHECKED ) ;
          }
          else if (LOWORD (wParam) == IDM_DEVMODE )     //选择 Properties 菜单项时
          {
               //将nCurrentDevice标识的菜单项的正文字符串拷贝到szDevice缓冲区
               GetMenuString (hMenu, nCurrentDevice, szDevice,
                              sizeof (szDevice) / sizeof (TCHAR), MF_BYCOMMAND );
               /*打开选择的打印机,并获取打印机的句柄
               (要打开的打印机的名字, 保存该打印机的句柄, 保存要载入的打印机信息的结构指针)*/

               if (OpenPrinter (szDevice, &hPrint, NULL ))
               {
                    /*启动打印机属性对话框
                    (对话框的父窗口, 已打开的打印机的句柄)*/

                    PrinterProperties (hwnd, hPrint) ;
                    ClosePrinter (hPrint) ; //关闭一个打开的打印机对象
               }
          }
          else  //如果选择的菜单项在 Capabilities 中,则仅保存菜单标识和修改选择标记
          {
               CheckMenuItem (hMenu, nCurrentInfo, MF_UNCHECKED ) ;
               nCurrentInfo = LOWORD (wParam) ;
               CheckMenuItem (hMenu, nCurrentInfo, MF_CHECKED ) ;
          }
          InvalidateRect (hwnd, NULL , TRUE ) ;
          return 0 ;
         
     case WM_INITMENUPOPUP : //当Windows准备显示一个弹出式菜单时
          if (lParam == 0)   //确定是菜单消息
               //如果 Device 中选择的非 screen 则 Properties 有效

               EnableMenuItem (GetMenu (hwnd), IDM_DEVMODE ,
                    nCurrentDevice == IDM_SCREEN ? MF_GRAYED : MF_ENABLED ) ;
          return 0 ;
         
     case WM_PAINT :
          //复制字符串
          lstrcpy (szWindowText, TEXT ("Device Capabilities: ")) ;
         
          if (nCurrentDevice == IDM_SCREEN )
          {
               lstrcpy (szDevice, TEXT ("DISPLAY ")) ;
               /*为专用设备创建一个信息场景(获取整个屏幕的设备场景)*/
               hdcInfo = CreateIC (szDevice, NULL , NULL , NULL ) ;
          }
          else
          {
               hMenu = GetMenu (hwnd) ;
               //将nCurrentDevice标识的菜单项的正文字符串拷贝到szDevice缓冲区
               GetMenuString (hMenu, nCurrentDevice, szDevice,
                              sizeof (szDevice) / sizeof (TCHAR), MF_BYCOMMAND ) ;
               /* szDevice 指定了所用专门设备的名称。该名由打印管理器分配显示*/
               hdcInfo = CreateIC (NULL , szDevice, NULL , NULL ) ;
          }
          // 拼接字符串,并显示到窗口标题栏
          lstrcat (szWindowText, szDevice) ;
          SetWindowText (hwnd, szWindowText) ;
         
          hdc = BeginPaint (hwnd, &ps) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT )) ;
         
          if (hdcInfo)
          {
               switch (nCurrentInfo)
               {
               case IDM_BASIC :
                    DoBasicInfo (hdc, hdcInfo, cxChar, cyChar) ;
                    break ;
                   
               case IDM_OTHER :
                    DoOtherInfo (hdc, hdcInfo, cxChar, cyChar) ;
                    break ;
                   
               case IDM_CURVE :
               case IDM_LINE :
               case IDM_POLY :
               case IDM_TEXT :
                    DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
                                    nCurrentInfo - IDM_CURVE ) ;
                    break ;
               }
               DeleteDC (hdcInfo) ;
          }
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
         
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
    
void DoBasicInfo (HDC hdc, HDC hdcInfo, int cxChar, int cyChar)
{
     static struct
     {
          int           nIndex ;
          TCHAR * szDesc ;
     }
     info[] =
     {
          HORZSIZE ,                TEXT ("HORZSIZE        Width in millimeters: "),
          VERTSIZE ,                 TEXT ("VERTSIZE        Height in millimeters: "),
          HORZRES ,                 TEXT ("HORZRES         Width in pixels: "),
          VERTRES ,                  TEXT ("VERTRES         Height in raster lines: "),
          BITSPIXEL ,                TEXT ("BITSPIXEL       Color bits per pixel: "),
          PLANES ,                    TEXT ("PLANES          Number of color planes: "),
          NUMBRUSHES ,          TEXT ("NUMBRUSHES      Number of device brushes: "),
          NUMPENS ,                TEXT ("NUMPENS         Number of device pens: "),
          NUMMARKERS ,          TEXT ("NUMMARKERS      Number of device markers: "),
          NUMFONTS ,              TEXT ("NUMFONTS        Number of device fonts: "),
          NUMCOLORS ,           TEXT ("NUMCOLORS       Number of device colors: "),
          PDEVICESIZE ,          TEXT ("PDEVICESIZE     Size of device structure: "),
          ASPECTX ,                 TEXT ("ASPECTX         Relative width of pixel: "),
          ASPECTY ,                 TEXT ("ASPECTY         Relative height of pixel: "),
          ASPECTXY ,               TEXT ("ASPECTXY        Relative diagonal of pixel: "),
          LOGPIXELSX ,           TEXT ("LOGPIXELSX      Horizontal dots per inch: "),
          LOGPIXELSY ,           TEXT ("LOGPIXELSY      Vertical dots per inch: "),
          SIZEPALETTE ,          TEXT ("SIZEPALETTE     Number of palette entries: "),
          NUMRESERVED ,       TEXT ("NUMRESERVED     Reserved palette entries: "),
          COLORRES ,             TEXT ("COLORRES        Actual color resolution: "),
          PHYSICALWIDTH ,    TEXT ("PHYSICALWIDTH   Printer page pixel width: "),
          PHYSICALHEIGHT ,   TEXT ("PHYSICALHEIGHT  Printer page pixel height: "),
          PHYSICALOFFSETX , TEXT ("PHYSICALOFFSETX Printer page x offset: "),
          PHYSICALOFFSETY , TEXT ("PHYSICALOFFSETY Printer page y offset: ")
     } ;
     int   i ;
     TCHAR szBuffer[80] ;
         
     for (i = 0 ; i < sizeof (info) / sizeof (info[0]) ; i++)
          TextOut (hdc, cxChar, (i + 1) * cyChar, szBuffer,
               wsprintf (szBuffer, TEXT ("%-45s%8d "), info[i].szDesc,
                    GetDeviceCaps (hdcInfo, info[i].nIndex))) ;
}
   
void DoOtherInfo (HDC hdc, HDC hdcInfo, int cxChar, int cyChar)
{
     static BITS clip[] =
     {
          CP_RECTANGLE ,    TEXT ("CP_RECTANGLE    Can Clip To Rectangle: ")
     } ;
         
     static BITS raster[] =
     {
          RC_BITBLT ,                TEXT ("RC_BITBLT       Capable of simple BitBlt: "),
          RC_BANDING ,            TEXT ("RC_BANDING      Requires banding support: "),
          RC_SCALING ,             TEXT ("RC_SCALING      Requires scaling support: "),
          RC_BITMAP64 ,           TEXT ("RC_BITMAP64     Supports bitmaps >64K: "),
          RC_GDI20_OUTPUT ,  TEXT ("RC_GDI20_OUTPUT Has 2.0 output calls: "),
          RC_DI_BITMAP ,         TEXT ("RC_DI_BITMAP    Supports DIB to memory: "),
          RC_PALETTE ,             TEXT ("RC_PALETTE      Supports a palette: "),
          RC_DIBTODEV ,          TEXT ("RC_DIBTODEV     Supports bitmap conversion: "),
          RC_BIGFONT ,             TEXT ("RC_BIGFONT      Supports fonts >64K: "),
          RC_STRETCHBLT ,       TEXT ("RC_STRETCHBLT   Supports StretchBlt: "),
          RC_FLOODFILL ,         TEXT ("RC_FLOODFILL    Supports FloodFill: "),
          RC_STRETCHDIB ,       TEXT ("RC_STRETCHDIB   Supports StretchDIBits: ")
     } ;
         
     static TCHAR * szTech[] = { TEXT ("DT_PLOTTER (Vector plotter) "),
                                                 TEXT ("DT_RASDISPLAY (Raster display) "),
                                                 TEXT ("DT_RASPRINTER (Raster printer) "),
                                                 TEXT ("DT_RASCAMERA (Raster camera) "),
                                                 TEXT ("DT_CHARSTREAM (Character stream) "),
                                                 TEXT ("DT_METAFILE (Metafile) "),
                                                 TEXT ("DT_DISPFILE (Display file) ") } ;
     int            i ;
     TCHAR          szBuffer[80] ;
         
     TextOut (hdc, cxChar, cyChar, szBuffer,
          wsprintf (szBuffer, TEXT ("%-24s%04XH "), TEXT ("DRIVERVERSION :"),
               GetDeviceCaps (hdcInfo, DRIVERVERSION ))) ;
         
     TextOut (hdc, cxChar, 2 * cyChar, szBuffer,
          wsprintf (szBuffer, TEXT ("%-24s%-40s "), TEXT ("TECHNOLOGY :"),
               szTech[GetDeviceCaps (hdcInfo, TECHNOLOGY )])) ;
         
     TextOut (hdc, cxChar, 4 * cyChar, szBuffer,
          wsprintf (szBuffer, TEXT ("CLIPCAPS (Clipping capabilities) "))) ;
         
     for (i = 0 ; i < sizeof (clip) / sizeof (clip[0]) ; i++)
          TextOut (hdc, 9 * cxChar, (i + 6) * cyChar, szBuffer,
               wsprintf (szBuffer, TEXT ("%-45s %3s "), clip[i].szDesc,
                    GetDeviceCaps (hdcInfo, CLIPCAPS ) & clip[i].iMask ?
                         TEXT ("Yes ") : TEXT ("No "))) ;
         
     TextOut (hdc, cxChar, 8 * cyChar, szBuffer,
          wsprintf (szBuffer, TEXT ("RASTERCAPS (Raster capabilities) "))) ;
     
     for (i = 0 ; i < sizeof (raster) / sizeof (raster[0]) ; i++)
          TextOut (hdc, 9 * cxChar, (i + 10) * cyChar, szBuffer,
               wsprintf (szBuffer, TEXT ("%-45s %3s "), raster[i].szDesc,
                    GetDeviceCaps (hdcInfo, RASTERCAPS ) & raster[i].iMask ?
                         TEXT ("Yes ") : TEXT ("No "))) ;
}

void DoBitCodedCaps (HDC hdc, HDC hdcInfo, int cxChar, int cyChar, int iType)
{
     static BITS curves[] =
     {
          CC_CIRCLES ,          TEXT ("CC_CIRCLES    Can do circles: "),
          CC_PIE ,                  TEXT ("CC_PIE        Can do pie wedges: "),
          CC_CHORD ,            TEXT ("CC_CHORD      Can do chord arcs: "),
          CC_ELLIPSES ,        TEXT ("CC_ELLIPSES   Can do ellipses: "),
          CC_WIDE ,              TEXT ("CC_WIDE       Can do wide borders: "),
          CC_STYLED ,           TEXT ("CC_STYLED     Can do styled borders: "),
          CC_WIDESTYLED ,  TEXT ("CC_WIDESTYLED Can do wide and styled borders: "),
          CC_INTERIORS ,     TEXT ("CC_INTERIORS  Can do interiors: ")
     } ;
    
     static BITS lines[] =
     {
          LC_POLYLINE ,        TEXT ("LC_POLYLINE   Can do polyline: "),
          LC_MARKER ,           TEXT ("LC_MARKER     Can do markers: "),
          LC_POLYMARKER ,   TEXT ("LC_POLYMARKER Can do polymarkers "),
          LC_WIDE ,               TEXT ("LC_WIDE       Can do wide lines: "),
          LC_STYLED ,            TEXT ("LC_STYLED     Can do styled lines: "),
          LC_WIDESTYLED ,    TEXT ("LC_WIDESTYLED Can do wide and styled lines: "),
          LC_INTERIORS ,       TEXT ("LC_INTERIORS  Can do interiors: ")
     } ;
    
     static BITS poly[] =
     {
          PC_POLYGON ,           TEXT ("PC_POLYGON     Can do alternate fill polygon: "),
          PC_RECTANGLE ,        TEXT ("PC_RECTANGLE   Can do rectangle: "),
          PC_WINDPOLYGON ,  TEXT ("PC_WINDPOLYGON Can do winding number fill polygon: "),
          PC_SCANLINE ,          TEXT ("PC_SCANLINE    Can do scanlines: "),
          PC_WIDE ,                 TEXT ("PC_WIDE        Can do wide borders: "),
          PC_STYLED ,              TEXT ("PC_STYLED      Can do styled borders: "),
          PC_WIDESTYLED ,     TEXT ("PC_WIDESTYLED  Can do wide and styled borders: "),
          PC_INTERIORS ,        TEXT ("PC_INTERIORS   Can do interiors: ")
     } ;
    
     static BITS text[] =
     {
          TC_OP_CHARACTER ,
               TEXT ("TC_OP_CHARACTER Can do character output precision: "),
          TC_OP_STROKE ,   
               TEXT ("TC_OP_STROKE    Can do stroke output precision: "),
          TC_CP_STROKE ,   
               TEXT ("TC_CP_STROKE    Can do stroke clip precision: "),
          TC_CR_90 ,       
               TEXT ("TC_CP_90        Can do 90 degree character rotation: "),
          TC_CR_ANY ,      
               TEXT ("TC_CR_ANY       Can do any character rotation: "),
          TC_SF_X_YINDEP
               TEXT ("TC_SF_X_YINDEP  Can do scaling independent of X and Y: "),
          TC_SA_DOUBLE ,   
               TEXT ("TC_SA_DOUBLE    Can do doubled character for scaling: "),
          TC_SA_INTEGER ,  
               TEXT ("TC_SA_INTEGER   Can do integer multiples for scaling: "),
          TC_SA_CONTIN ,   
               TEXT ("TC_SA_CONTIN    Can do any multiples for exact scaling: "),
          TC_EA_DOUBLE ,   
               TEXT ("TC_EA_DOUBLE    Can do double weight characters: "),
          TC_IA_ABLE ,       TEXT ("TC_IA_ABLE      Can do italicizing: "),
          TC_UA_ABLE ,      TEXT ("TC_UA_ABLE      Can do underlining: "),
          TC_SO_ABLE ,      TEXT ("TC_SO_ABLE      Can do strikeouts: "),
          TC_RA_ABLE ,      TEXT ("TC_RA_ABLE      Can do raster fonts: "),
          TC_VA_ABLE ,      TEXT ("TC_VA_ABLE      Can do vector fonts: ")
     } ;
    
     static struct
     {
          int           iIndex ;
          TCHAR * szTitle ;
          BITS       (*pbits)[] ; //名为pbits的指向BITS结构数组的指针
          int           iSize ;
     }
     bitinfo[] =
     {
          CURVECAPS ,  TEXT ("CURVCAPS (Curve Capabilities) "),
               //强制类型转换 curves 为一个指向BITS结构数组的指针
               (BITS (*)[]) curves, sizeof (curves) / sizeof (curves[0]),
          LINECAPS ,   TEXT ("LINECAPS (Line Capabilities) "),
               (BITS (*)[]) lines, sizeof (lines) / sizeof (lines[0]),
          POLYGONALCAPS , TEXT ("POLYGONALCAPS (Polygonal Capabilities) "),
               (BITS (*)[]) poly, sizeof (poly) / sizeof (poly[0]),
          TEXTCAPS ,   TEXT ("TEXTCAPS (Text Capabilities) "),
               (BITS (*)[]) text, sizeof (text) / sizeof (text[0])
     } ;
    
     static TCHAR szBuffer[80] ;
     // 定义 pbits 是指向 BITS 结构数组的指针,赋值后变为指向 bitinfo[iType].pbits 指针的指针
     BITS         (*pbits)[] = bitinfo[iType].pbits ;
                                         //返回设备所支持的特性,由多个旗标组合而成
     int          i, iDevCaps = GetDeviceCaps (hdcInfo, bitinfo[iType].iIndex) ;
    
     TextOut (hdc, cxChar, cyChar, bitinfo[iType].szTitle,
              lstrlen (bitinfo[iType].szTitle)) ;
    
     for (i = 0 ; i < bitinfo[iType].iSize ; i++)
          TextOut (hdc, cxChar, (i + 3) * cyChar, szBuffer,
               wsprintf (szBuffer, TEXT ("%-55s %3s "), (*pbits)[i].szDesc,
                    //与 支持 旗标相与,判断设备是否支持该特性
                    iDevCaps & (*pbits)[i].iMask ? TEXT ("Yes ") : TEXT ("No ")));
}


/*------------------------------------------------------------------
   RESOURCE.H
------------------------------------------------------------------*/


//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by DevCaps2.rc
//

#define IDM_SCREEN                     40001
#define IDM_BASIC                        40002
#define IDM_OTHER                       40003
#define IDM_CURVE                       40004
#define IDM_LINE                          40005
#define IDM_POLY                         40006
#define IDM_TEXT                         40007

// Next default values for new objects
//

#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40008
#define _APS_NEXT_CONTROL_VALUE          1000
#define _APS_NEXT_SYMED_VALUE              101
#endif
#endif


/*------------------------------------------------------------------
   DevCaps2.rc
------------------------------------------------------------------*/

 

//Microsoft Developer Studio generated resource script.
//

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//

#include "afxres.h"

/

#undef APSTUDIO_READONLY_SYMBOLS

/
// English (U.S.) resources


#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif        //_WIN32

#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//


1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h/0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""/r/n"
    "/0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "/r/n"
    "/0"
END

#endif    // APSTUDIO_INVOKED


/
//
// Menu
//


DEVCAPS2 MENU DISCARDABLE
BEGIN
    POPUP "&Device"
    BEGIN
        MENUITEM "&Screen",                     IDM_SCREEN, CHECKED
    END
    POPUP "&Capabilities"
    BEGIN
        MENUITEM "&Basic Information",            IDM_BASIC
        MENUITEM "&Other Information",           IDM_OTHER
        MENUITEM "&Curve Capabilities",           IDM_CURVE
        MENUITEM "&Line Capabilities",              IDM_LINE
        MENUITEM "&Polygonal Capabilities",     IDM_POLY
        MENUITEM "&Text Capabilities",             IDM_TEXT
    END
END

#endif    // English (U.S.) resources
/




#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//


/

#endif    // not APSTUDIO_INVOKED

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
想要获取电脑精确的硬件信息,可以通过调用操作系统提供的API来获取。下面以Windows操作系统为例,介绍如何获取一些常见的硬件信息: 1. 获取CPU信息 可以使用WMI (Windows Management Instrumentation)来获取CPU信息。以下是C#代码示例: ```csharp using System.Management; public static string GetCpuInfo() { string cpuInfo = ""; ManagementClass mc = new ManagementClass("win32_processor"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { cpuInfo = mo.Properties["Name"].Value.ToString(); break; } return cpuInfo; } ``` 2. 获取内存信息 可以使用GlobalMemoryStatusEx函数来获取内存信息。以下是C#代码示例: ```csharp using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct MEMORYSTATUSEX { public uint dwLength; public uint dwMemoryLoad; public ulong ullTotalPhys; public ulong ullAvailPhys; public ulong ullTotalPageFile; public ulong ullAvailPageFile; public ulong ullTotalVirtual; public ulong ullAvailVirtual; public ulong ullAvailExtendedVirtual; } [DllImport("kernel32.dll")] public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); public static ulong GetTotalMemory() { MEMORYSTATUSEX memStatusEx = new MEMORYSTATUSEX(); memStatusEx.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX)); GlobalMemoryStatusEx(ref memStatusEx); return memStatusEx.ullTotalPhys; } ``` 3. 获取显卡信息 可以使用EnumDisplayDevices和GetDeviceCaps函数来获取显卡信息。以下是C#代码示例: ```csharp using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct DISPLAY_DEVICE { public uint cb; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string DeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceString; public uint StateFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceKey; } [DllImport("user32.dll")] public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags); [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public static string GetGraphicsCardInfo() { DISPLAY_DEVICE displayDevice = new DISPLAY_DEVICE(); displayDevice.cb = (uint)Marshal.SizeOf(typeof(DISPLAY_DEVICE)); EnumDisplayDevices(null, 0, ref displayDevice, 0); IntPtr hdc = CreateDC(displayDevice.DeviceName, null, null, IntPtr.Zero); int devCaps = GetDeviceCaps(hdc, 6); string graphicsCardInfo = string.Format("{0} (Memory: {1} MB)", displayDevice.DeviceString.Trim(), devCaps / 1024); return graphicsCardInfo; } ``` 需要注意的是,以上代码只是获取硬件信息的一种方式,不同的操作系统和硬件配置可能需要不同的API和方法来获取精确的硬件信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值