程序(2)GetSystemMetrics呼叫中取得的信息

来源:互联网 发布:办公软件是什么 编辑:程序博客网 时间:2024/05/16 05:01

/***运行平台VC++6.0****/

让我们来编写一个程序,显示一些可以从GetSystemMetrics呼叫中取得的信息,显示格式为每种视觉组件一行。如果我们建立一个表头文件,在表头文件中定义一个结构数组,此结构包含GetSystemMetrics索引对应的Windows表头文件标识符和呼叫所传回的每个值对应的字符串,这样处理起来要容易一些。表头文件名为SYSMETS.H

  /********************************************
SYSMETS.H -- System metrics display structure
********************************************/
#define NUMLINES ((int)(sizeof sysmetrics / sizeof sysmetrics[0]))
struct
{
 int Index;
 TCHAR* szLabel;
 TCHAR* szDesc;
}
sysmetrics[]=
{
 SM_CXSCREEN, TEXT("SM_CXSCREEN"),
  TEXT("Screen width in pixels"),
 SM_CYSCREEN,TEXT("SM_CYSCREEN"),
  TEXT("Screen height in pixels"),
 SM_CXVSCROLL,TEXT("SM_CXVSCROLL"),
  TEXT("Vertical scroll width"),
 SM_CYHSCROLL,TEXT("SM_CYHSCROLL"),
  TEXT("Horizontal scroll height"),
 SM_CYCAPTION,TEXT("SM_CYCAPTION"),
  TEXT("Caption bar height"),
 SM_CXBORDER,TEXT("SM_CXBORDER"),
  TEXT("Window border width"),
 SM_CYBORDER,TEXT("SM_CYBORDER"),
  TEXT("Window border height"),
 SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),
  TEXT("Dialog window frame width"),
 SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),
  TEXT("Dialog window frame height"),
 SM_CYVTHUMB,TEXT("SM_CYVTHUMB"),
  TEXT("Vertical scroll thumb height"),
 SM_CXHTHUMB,TEXT("SM_CXHTHUMB"),
  TEXT("Horizontal scroll thumb width"),
 SM_CXICON, TEXT("SM_CXICON"),
  TEXT("Icon width"),
 SM_CYICON, TEXT("SM_CYICON"),
  TEXT("Icon height"),
 SM_CXCURSOR,TEXT("SM_CXCURSOR"),
  TEXT("Cursor width"),
 SM_CYCURSOR,TEXT("SM_CYCURSOR"),
  TEXT("Cursor height"),
 SM_CYMENU,TEXT("SM_CYMENU"),
  TEXT("Menu bar height"),
 SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),
  TEXT("Full screen client area width"),
 SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),
  TEXT("Full screen client area height"),
 SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),
  TEXT("Kanji window height"),
 SM_MOUSEPRESENT,TEXT("SM_MOUSEPRESENT"),
  TEXT("Mouse present flag"),
 SM_CYVSCROLL,TEXT("SM_CYVSCROLL"),
  TEXT("Vertical scroll arrow height"),
 SM_CXHSCROLL,TEXT("SM_CXHSCROLL"),
  TEXT("Horizontal scroll arrow width"),
 SM_DEBUG, TEXT("SM_DEBUG"),
  TEXT("Debug version flag"),
 SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"),
  TEXT("Mouse bottons swapped flag"),
 SM_CXMIN, TEXT("SM_CXMIN"),
  TEXT("Minimum window width"),
 SM_CYMIN,TEXT("SM_CYMIN"),
  TEXT("Minimum window height"),
 SM_CXSIZE,TEXT("SM_CXSIZE"),
  TEXT("Min/Max/Close button width"),
 SM_CYSIZE,TEXT("SM_CYSIZE"),
  TEXT("Min/Max/Close button height"),
 SM_CXSIZEFRAME,TEXT("SM_CXSIZEFRAME"),
  TEXT("Window sizing frame width"),
 SM_CYSIZEFRAME,TEXT("SM_CYSIZEFRAME"),
  TEXT("Window sizing frame height"),
 SM_CXMINTRACK,TEXT("SM_CXMINTRACK"),
  TEXT("Minimum window tracking width"),
 SM_CYMINTRACK,TEXT("SM_CYMINTRACK"),
  TEXT("Minimum window tracking height"),
 SM_CXDOUBLECLK,TEXT("SM_CXDOUBLECLK"),
  TEXT("Double click x tolerance"),
 SM_CYDOUBLECLK,TEXT("SM_CYDOUBLECLK"),
  TEXT("Double click y tolerance"),
 SM_CXICONSPACING,TEXT("SM_CXICONSPACING"),
  TEXT("Horizongtal icon spacing"),
 SM_CYICONSPACING,TEXT("SM_CYICONSPACING"),
  TEXT("Vertical icon spacing"),
 SM_MENUDROPALIGNMENT,TEXT("SM_MENUDROPALIGNMENT"),
  TEXT("Left or right menu drop"),
 SM_PENWINDOWS,TEXT("SM_PENWINDOWS"),
  TEXT("Pen extensions installed"),
 SM_DBCSENABLED,TEXT("SM_DBCSENABLED"),
  TEXT("Double-Byte Char Set enabled"),
 SM_CMOUSEBUTTONS,TEXT("SM_CMOUSEBUTTONS"),
  TEXT("Number of mouse buttons"),
 SM_SECURE,TEXT("SM_SECURE"),
  TEXT("Security present flag"),
 SM_CXEDGE,TEXT("SM_CXEDGE"),
  TEXT("3-D border width"),
 SM_CYEDGE,TEXT("SM_CYEDGE"),
  TEXT("3-D border height"),
 SM_CXMINSPACING,TEXT("SM_CXMINSPACING"),
  TEXT("Minimized window spacing width"),
 SM_CYMINSPACING,TEXT("SM_CYMINSPACING"),
  TEXT("Minimized window spacing height"),
 SM_CXSMICON,TEXT("SM_CXSMICON"),
  TEXT("Small icon width"),
 SM_CYSMICON,TEXT("SM_CYSMICON"),
  TEXT("Small icon height"),
 SM_CYSMCAPTION,TEXT("SM_CYSMCAPTION"),
  TEXT("Small caption height"),
 SM_CXSMSIZE,TEXT("SM_CXSMSIZE"),
  TEXT("Small caption button width"),
 SM_CYSMSIZE,TEXT("SM_CYSMSIZE"),
  TEXT("Small caption button height"),
 SM_CXMENUSIZE,TEXT("SM_CXMENUSIZE"),
  TEXT("Menu bar button width"),
 SM_CYMENUSIZE,TEXT("SM_CYMENUSIZE"),
  TEXT("Menu bar button height"),
 SM_ARRANGE,TEXT("SM_ARRANGE"),
  TEXT("How minimized window arranged"),
 SM_CXMINIMIZED,TEXT("SM_CXMINIMIZED"),
  TEXT("Minimized window width"),
 SM_CYMINIMIZED,TEXT("SM_CYMINIMIZED"),
  TEXT("Minimized window height"),
 SM_CXMAXTRACK,TEXT("SM_CXMAXTRACK"),
  TEXT("Maximum draggable width"),
 SM_CYMAXTRACK,TEXT("SM_CYMAXTRACK"),
  TEXT("Maximum draggable height"),
 SM_CXMAXIMIZED,TEXT("SM_CXMAXIMIZED"),
  TEXT("Width of maximized window"),
 SM_CYMAXIMIZED,TEXT("SM_CYMAXIMIZED"),
  TEXT("Height of maximized window"),
 SM_NETWORK,TEXT("SM_NETWORK"),
  TEXT("Network present flag"),
 SM_CLEANBOOT,TEXT("SM_CLEANBOOT"),
  TEXT("How system was booted"),
 SM_CXDRAG,TEXT("SM_CXDRAG"),
  TEXT("Avoid drag x tolerance"),
 SM_CYDRAG,TEXT("SM_CYDRAG"),
  TEXT("Avoid drag y tolerance"),
 SM_SHOWSOUNDS,TEXT("SM_SHOWSOUNDS"),
  TEXT("Present sounds visually"),
 SM_CXMENUCHECK,TEXT("SM_CXMENUCHECK"),
  TEXT("Menu check-mark width"),
 SM_CYMENUCHECK,TEXT("SM_CYMENUCHECK"),
  TEXT("Menu check-mark height"),
 SM_SLOWMACHINE,TEXT("SM_SLOWMACHINE"),
  TEXT("Slow processor flag"),
 SM_MIDEASTENABLED,TEXT("SM_MIDEASTENABLED"),
  TEXT("Hebrew and Arabic enabled flag"),
 SM_MOUSEWHEELPRESENT,TEXT("SM_MOUSEWHEELPRESENT"),
  TEXT("Mouse wheel present flag"),
 SM_XVIRTUALSCREEN,TEXT("SM_XVIRTUALSCREEN"),
  TEXT("Virtual screen x origin"),
 SM_YVIRTUALSCREEN,TEXT("SM_YVIRTUALSCREEN"),
  TEXT("Virtual screen y origin"),
 SM_CXVIRTUALSCREEN,TEXT("SM_CXVIRTUALSCREEN"),
  TEXT("Virtual screen width"),
 SM_CYVIRTUALSCREEN,TEXT("SM_CYVIRTUALSCREEN"),
  TEXT("Virtual screen height"),
 SM_CMONITORS,TEXT("SM_CMONITORS"),
  TEXT("Number of monitors"),
 SM_SAMEDISPLAYFORMAT,TEXT("SM_SAMEDISPLAYFORMAT"),
  TEXT("Same color format flag")
};

/******************************************************

                        分                          割                            线

******************************************************/

显示信息的程序命名为SYSMETS3。SYSMETS3.C的原始码

/*****************************************
SYSMETS1.C -- System Metrics Display Program No.1
   (c) Charles Petzold,1998
******************************************/
#include <windows.h>
#include <stdafx.h>
#include "sysmets.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprevInstance,
       PSTR szCmdLine,int iCmdShow)
{
 static TCHAR szAppName[]=TEXT("SysMets3");
 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("The hello program"),
  WS_OVERLAPPEDWINDOW|WS_VSCROLL,
  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,cxClient,cyClient,iMaxWidth;
 HDC hdc;
 int i,x,y,iVertPos,iHorzPos,iPaintBeg,iPaintEnd;
 PAINTSTRUCT ps;
 SCROLLINFO si;
 TCHAR szBuffer[10];
 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);
   //Save the width of the three columns
  iMaxWidth=40*cxChar+22*cxCaps;
  return 0;
/************************************************************
  SetScrollRange(hwnd,SB_VERT,0,NUMLINES-1,FALSE);
  SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
  return 0;
 最终修改后的sysmets3  ,弥补sysmets2中的滚动条缺陷
************************************************************/
 case WM_SIZE:
  cxClient=LOWORD(lParam);
  cyClient=HIWORD(lParam);
   //Set vertical scroll bar range and page size
  si.cbSize =sizeof(si);
  si.fMask=SIF_RANGE|SIF_PAGE;
  si.nMin=0;
  si.nMax=NUMLINES-1;
  si.nPage=cyClient/cyChar;
  SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
   //Set horizontal scroll bar range and page size
  si.cbSize=sizeof(si);
  si.fMask=SIF_RANGE|SIF_PAGE;
  si.nMin=0;
  si.nMax=2+iMaxWidth/cxChar;
  si.nPage=cxClient/cxChar;
  SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
  return 0;

 case WM_VSCROLL:
   //Get all the vertical scroll bar information
  si.cbSize=sizeof(si);
  si.fMask=SIF_ALL;
  GetScrollInfo(hwnd,SB_VERT,&si);
   //Save the position for comparison later on
  iVertPos=si.nPos;


  switch(LOWORD(wParam))
  {
  case SB_TOP:
   si.nPos=si.nMin;
   break;
  case SB_BOTTOM:
   si.nPos =si.nMax ;
   break;
  case SB_LINEUP:
   si.nPos-=1;
   break;
  case SB_LINEDOWN:
   si.nPos+=1;
   break;
  case SB_PAGEUP:
   si.nPos-=si.nPage;
   break;
  case SB_PAGEDOWN:
   si.nPos+=si.nPage;
   break;
  case SB_THUMBTRACK:
   si.nPos=si.nTrackPos;
   break;
  default:
   break;
  }
  //Set the position and then retrieve it.Due to adjustments
  //by Windows it may not be the same as the value set.
 si.fMask=SIF_POS; 
 SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
 GetScrollInfo(hwnd,SB_VERT,&si);
  //if the position has changed,scroll the window and update it

 if(si.nPos!=iVertPos)
 {
  ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
  UpdateWindow(hwnd);
 }
  return 0;
 
 case WM_HSCROLL:
  //Get all the vertical scroll bar information
  si.cbSize=sizeof(si);
  si.fMask=SIF_ALL;
   //Save the position for comparison later on
  GetScrollInfo(hwnd,SB_HORZ,&si);
  iHorzPos=si.nPos;

     switch(LOWORD(wParam))
  {
  case SB_LINELEFT:
   si.nPos-=1;
   break;
  case SB_LINERIGHT:
   si.nPos+=1;
   break;
  case SB_PAGELEFT:
   si.nPos-=si.nPage;
   break;
  case SB_PAGERIGHT:
   si.nPos+=si.nPage;
   break;
  case SB_THUMBPOSITION:
   si.nPos=si.nTrackPos;
   break;
  default:
   break;
  }

   //Set the position and then retrieve it.Due to adjustments
   //by Window it may not be the same as the value set.
  si.fMask=SIF_POS;
  SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
  GetScrollInfo(hwnd,SB_HORZ,&si);
  //if the position has changed,scroll the window
 if(si.nPos!=iHorzPos)
 {
  ScrollWindow(hwnd,cxChar*(iHorzPos-si.nPos),0,NULL,NULL);
 }
  return 0;

 case WM_PAINT:
  hdc=BeginPaint(hwnd,&ps);
  //Get vertical scroll bar position
  si.cbSize =sizeof(si);
  si.fMask=SIF_POS;
  GetScrollInfo(hwnd,SB_VERT,&si);
  iVertPos=si.nPos ;
  //Get horizontal scroll bar position
  GetScrollInfo(hwnd,SB_HORZ,&si);
  iHorzPos=si.nPos ;
  //Find painting limits
  iPaintBeg=max(0,iVertPos+ps.rcPaint.top/cyChar);
  iPaintEnd=min(NUMLINES-1,iVertPos+ps.rcPaint.bottom/cyChar);

  for(i=iPaintBeg;i<=iPaintEnd;i++)
  {
   x=cxChar*(1-iHorzPos);
   y=cyChar*(i-iVertPos);

   TextOut(hdc,x,y,sysmetrics[i].szLabel,
    lstrlen(sysmetrics[i].szLabel));
   
   TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,
    lstrlen(sysmetrics[i].szDesc));
   
   SetTextAlign(hdc,TA_RIGHT|TA_TOP);
   TextOut(hdc,x+22*cxCaps+40*cxChar,y,szBuffer,
    wsprintf(szBuffer,TEXT("%5d"),
    GetSystemMetrics(sysmetrics[i].Index)));
   SetTextAlign(hdc,TA_LEFT|TA_TOP);
  }
/*************************************************************
  for(i=0;i<NUMLINES;i++)
  {
   y=cyChar*(i-iVscrollPos); 
   TextOut (hdc,0,y,
    sysmetrics[i].szLabel,
    lstrlen(sysmetrics[i].szLabel));
   TextOut (hdc,22*cxCaps,y,
    sysmetrics[i].szDesc,
    lstrlen(sysmetrics[i].szDesc));
    SetTextAlign(hdc,TA_RIGHT|TA_TOP);
   TextOut(hdc,22*cxCaps+40*cxChar,y,szBuffer,
        wsprintf(szBuffer,TEXT("%5d"),
      GetSystemMetrics(sysmetrics[i].Index)));
    SetTextAlign(hdc,TA_LEFT|TA_TOP);

 最终修改后的sysmets3  ,弥补sysmets2中的滚动条缺陷
************************************************************/


/**********************************************************************************
    没有滚动条的代码 与上面的不同之处在于  y=cyChar*(i-iVscrollPos); 
      其实下面也可以直接 用 cyChar*(i-iVscrollPos) 代替 cyChar*i 
   ********************分************割************线******************************
   TextOut (hdc,0,cyChar* i,
    sysmetrics[i].szLabel,
    lstrlen(sysmetrics[i].szLabel));
   TextOut (hdc,22*cxCaps,cyChar* i,
    sysmetrics[i].szDesc,
    lstrlen(sysmetrics[i].szDesc));
    SetTextAlign(hdc,TA_RIGHT|TA_TOP);
   TextOut(hdc,22*cxCaps+40*cxChar,cyChar* i,szBuffer,
        wsprintf(szBuffer,TEXT("%5d"),
      GetSystemMetrics(sysmetrics[i].Index)));
    SetTextAlign(hdc,TA_LEFT|TA_TOP);
***********************************************************************************/
  EndPaint(hwnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc(hwnd,message,wParam,lParam);
}

 

 

 

原创粉丝点击