#include <windows.h>
#include <stdio.h>
#define LINENUMBER ((int) sizeof(DeviceCapsInfo) / sizeof( struct DeviceCaps))
struct DeviceCaps
{
 int  nIndex;
 TCHAR* szLabel;
 TCHAR* szInfo;
};
struct DeviceCaps DeviceCapsInfo[] =
{
 VREFRESH, TEXT("VREFRESH"), TEXT("垂直刷新率(赫兹):"),
 BITSPIXEL, TEXT("BITSPIXEL"), TEXT("表示每个像素所用的位数:"),
 HORZRES, TEXT("HORZRES"), TEXT("物理显示器的宽度(像素):"),
 VERTRES, TEXT("VERTRES"), TEXT("物理显示器的高度(像素):"),
 HORZSIZE, TEXT("HORZSIZE"), TEXT("物理显示器的宽度(毫米):"),
 VERTSIZE, TEXT("VERTSIZE"), TEXT("物理显示器的高度(毫米):"), 
 ASPECTX, TEXT("ASPECTX"), TEXT("单个像素的相对宽度(像素):"),
 ASPECTY, TEXT("ASPECTY"), TEXT("单个像素的相对高度(像素):"),
 ASPECTXY, TEXT("ASPECTXY"), TEXT("像素的相对对角线长(像素):"),
 LOGPIXELSX, TEXT("LOGPIXELSX"), TEXT("水平方向每逻辑英寸的象素数:"),
 LOGPIXELSY, TEXT("LOGPIXELSY"), TEXT("垂直方向每逻辑英寸的象素数:"),
 NUMCOLORS, TEXT("NUMCOLORS"), TEXT("设备颜色表中的项目数:"),
 NUMPENS, TEXT("NUMPENS"), TEXT("设备笔数:"),
 NUMBRUSHES, TEXT("NUMBRUSHES"), TEXT("设备刷子数:"),
 NUMFONTS, TEXT("NUMFONTS"), TEXT("设备字体数:"),
 PLANES,  TEXT("PLANES"),  TEXT("设备调色板数:")
};
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpcmdLine, int nCmdShow)
{
 static TCHAR szAppName[]= TEXT("DeviceCaps");
 static TCHAR szClassName[]= TEXT("DeviceCapsClass");
 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 = szClassName;
 
 if ( !RegisterClass( &wndclass ) )
 {
  MessageBox( NULL, TEXT("This program requires Windows NT!"),
     szAppName, MB_ICONERROR );
  return 0;
 }
 hwnd = CreateWindow( szClassName,
       TEXT("Dispaly DeviceCaps Infomation"),
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       NULL,
       NULL,
       hInstance,
       NULL ); 
 ShowWindow( hwnd, nCmdShow );
 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,cyChar;
 char szBuff[10];
 HDC   hdc;
 PAINTSTRUCT ps;
 TEXTMETRIC tm;
 int   i;
 switch( message )
 {
 case WM_CREATE:
  hdc = GetDC( hwnd );
  GetTextMetrics( hdc, &tm );
  cxChar = tm.tmAveCharWidth;
  cyChar = tm.tmHeight + tm.tmExternalLeading;
  ReleaseDC( hwnd, hdc );  
  return 0;
 case WM_PAINT:
  hdc = BeginPaint( hwnd, &ps );
  for( i = 0; i < LINENUMBER; i++ )
  {
   TextOut( hdc, 0, cyChar * i, DeviceCapsInfo[i].szLabel,
     strlen( DeviceCapsInfo[i].szLabel ) );
   TextOut( hdc, 120, cyChar * i,
     DeviceCapsInfo[i].szInfo,
     strlen( DeviceCapsInfo[i].szInfo ) );
   SetTextAlign( hdc, TA_RIGHT | TA_TOP );
   TextOut( hdc, 360, cyChar * i, szBuff,
     sprintf( szBuff, TEXT( "%d" ),
      GetDeviceCaps( hdc, DeviceCapsInfo[i].nIndex ) ) );
   SetTextAlign( hdc, TA_LEFT | TA_TOP );
  }
  EndPaint( hwnd, &ps );
  return 0;
 case WM_DESTROY:
  PostQuitMessage( 0 );
  return 0;
 }
 return DefWindowProc( hwnd, message, wParam, lParam );
}