SYSMETS4.docx
《SYSMETS4.docx》由会员分享,可在线阅读,更多相关《SYSMETS4.docx(11页珍藏版)》请在冰豆网上搜索。
SYSMETS4
/*----------------------------------------------------
SYSMETS4.C--SystemMetricsDisplayProgramNo.4
(c)CharlesPetzold,1998
----------------------------------------------------*/
#defineWINVER0x0500
#include
#include"sysmets.h"
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
{
staticTCHARszAppName[]=TEXT("SysMets4");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
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("ProgramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,TEXT("GetSystemMetricsNo.4"),
WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
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);
}
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
staticintcxChar,cxCaps,cyChar,cxClient,cyClient,iMaxWidth;
HDChdc;
inti,x,y,iVertPos,iHorzPos,iPaintBeg,iPaintEnd;
PAINTSTRUCTps;
SCROLLINFOsi;
TCHARszBuffer[10];
TEXTMETRICtm;
switch(message)
{
caseWM_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);
//Savethewidthofthethreecolumns
iMaxWidth=40*cxChar+22*cxCaps;
return0;
caseWM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
//Setverticalscrollbarrangeandpagesize
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);
//Sethorizontalscrollbarrangeandpagesize
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);
return0;
caseWM_VSCROLL:
//Getalltheverticalscrollbarinformation
si.cbSize=sizeof(si);
si.fMask=SIF_ALL;
GetScrollInfo(hwnd,SB_VERT,&si);
//Savethepositionforcomparisonlateron
iVertPos=si.nPos;
switch(LOWORD(wParam))
{
caseSB_TOP:
si.nPos=si.nMin;
break;
caseSB_BOTTOM:
si.nPos=si.nMax;
break;
caseSB_LINEUP:
si.nPos-=1;
break;
caseSB_LINEDOWN:
si.nPos+=1;
break;
caseSB_PAGEUP:
si.nPos-=si.nPage;
break;
caseSB_PAGEDOWN:
si.nPos+=si.nPage;
break;
caseSB_THUMBTRACK:
si.nPos=si.nTrackPos;
break;
default:
break;
}
//Setthepositionandthenretrieveit.Duetoadjustments
//byWindowsitmightnotbethesameasthevalueset.
si.fMask=SIF_POS;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
GetScrollInfo(hwnd,SB_VERT,&si);
//Ifthepositionhaschanged,scrollthewindowandupdateit
if(si.nPos!
=iVertPos)
{
ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),
NULL,NULL);
UpdateWindow(hwnd);
}
return0;
caseWM_HSCROLL:
//Getalltheverticalscrollbarinformation
si.cbSize=sizeof(si);
si.fMask=SIF_ALL;
//Savethepositionforcomparisonlateron
GetScrollInfo(hwnd,SB_HORZ,&si);
iHorzPos=si.nPos;
switch(LOWORD(wParam))
{
caseSB_LINELEFT:
si.nPos-=1;
break;
caseSB_LINERIGHT:
si.nPos+=1;
break;
caseSB_PAGELEFT:
si.nPos-=si.nPage;
break;
caseSB_PAGERIGHT:
si.nPos+=si.nPage;
break;
caseSB_THUMBPOSITION:
si.nPos=si.nTrackPos;
break;
default:
break;
}
//Setthepositionandthenretrieveit.Duetoadjustments
//byWindowsitmightnotbethesameasthevalueset.
si.fMask=SIF_POS;
SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
GetScrollInfo(hwnd,SB_HORZ,&si);
//Ifthepositionhaschanged,scrollthewindow
if(si.nPos!
=iHorzPos)
{
ScrollWindow(hwnd,cxChar*(iHorzPos-si.nPos),0,
NULL,NULL);
}
return0;
caseWM_KEYDOWN:
switch(wParam)
{
caseVK_HOME:
SendMessage(hwnd,WM_VSCROLL,SB_TOP,0);
break;
caseVK_END:
SendMessage(hwnd,WM_VSCROLL,SB_BOTTOM,0);
break;
caseVK_PRIOR:
SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0);
break;
caseVK_NEXT:
SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0);
break;
caseVK_UP:
SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0);
break;
caseVK_DOWN:
SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0);
break;
caseVK_LEFT:
SendMessage(hwnd,WM_HSCROLL,SB_PAGEUP,0);
break;
caseVK_RIGHT:
SendMessage(hwnd,WM_HSCROLL,SB_PAGEDOWN,0);
break;
}
return0;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
//Getverticalscrollbarposition
si.cbSize=sizeof(si);
si.fMask=SIF_POS;
GetScrollInfo(hwnd,SB_VERT,&si);
iVertPos=si.nPos;
//Gethorizontalscrollbarposition
GetScrollInfo(hwnd,SB_HORZ,&si);
iHorzPos=si.nPos;
//Findpaintinglimits
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].iIndex)));
SetTextAlign(hdc,TA_LEFT|TA_TOP);
}
EndPaint(hwnd,&ps);
return0;
caseWM_DESTROY:
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}