// 1."sysmets.h"
#define NUMLINES (sizeof(sysmetrics)/sizeof(sysmetrics[0]))struct {
int iIndex;
char *szLabel;
char *szDesc;
}
sysmetrics[]={
SM_CXSCREEN, "SM_CXSCREEN", "Screen width in pixels",
SM_CYSCREEN, "SM_CYSCREEN", "Screen height in pixels",
SM_CXVSCROLL, "SM_CXVSCROLL", "Vertical scroll arrow width",
SM_ARRANGE, "SM_ARRANGE", "system arranged minimized windows",
SM_CLEANBOOT, "SM_CLEANBOOT", "how the system was started:",
SM_CMOUSEBUTTONS, "SM_CMOUSEBUTTONS", "mouse button ",
};
//2.#include <windows.h>
#include <string.h>
#include "sysmets.h"LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
static char szAppName[]="SysMets3";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass; wndclass.cbSize=sizeof(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;
wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); hwnd=CreateWindow(szAppName," Get system metrics No.3",WS_OVERLAPPEDWINDOW |WS_VSCROLL|WS_HSCROLL,
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 iMsg,WPARAM wParam,LPARAM lParam)
{
static int cxChar,cxCaps,cyChar,cxClient,cyClient,iMaxWidth,
iVscrollPos,iVscrollMax,iHscrollPos,iHscrollMax,temp;
char szBuffer[10];
HDC hdc;
int i,x,y,iPaintBeg,iPaintEnd,iVscrollInc,iHscrollInc,j;
PAINTSTRUCT ps;
TEXTMETRIC tm; switch(iMsg){
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); iMaxWidth=40*cxChar+22*cxCaps;
return 0; case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
//注意!!temp=-22
temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar));
iVscrollPos=min(iVscrollPos,iVscrollMax);
SetScrollRange(hwnd,SB_VERT,0,iVscrollMax,FALSE);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE); iHscrollMax=max(0,2+(iMaxWidth-cxClient)/cxChar);
iHscrollPos=min(iHscrollPos,iHscrollMax);
SetScrollRange(hwnd,SB_HORZ,0,iHscrollMax,FALSE);
SetScrollPos(hwnd,SB_HORZ,iHscrollPos,TRUE); return 0; case WM_VSCROLL:
switch(LOWORD(wParam)){
case SB_TOP:
iVscrollInc=-iVscrollPos;
break;
case SB_BOTTOM:
iVscrollInc=iVscrollMax-iVscrollPos;
break; case SB_LINEUP:
iVscrollInc=-1;
break; case SB_LINEDOWN:
iVscrollInc=1;
break; case SB_PAGEUP:
iVscrollInc=min(-1,-cyClient/cyChar);
break; case SB_PAGEDOWN:
iVscrollInc=max(1,cyClient/cyChar);
break; case SB_THUMBTRACK:
iVscrollInc=HIWORD(wParam)-iVscrollPos;
break; default:
iVscrollInc=0;
}
iVscrollInc=max(-iVscrollPos,min(iVscrollInc,iVscrollMax-iVscrollPos));
if(iVscrollInc!=0){
iVscrollPos+=iVscrollInc;
ScrollWindow(hwnd,0,-cyChar*iVscrollInc,NULL,NULL);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
UpdateWindow(hwnd);
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); iPaintBeg=max(0,iVscrollPos+ps.rcPaint.top/cyChar-1);
iPaintEnd=min(NUMLINES,iVscrollPos+ps.rcPaint.bottom/cyChar);
//注意temp=-23!!!
TextOut(hdc,500,10,szBuffer,sprintf(szBuffer,"hhh:(%d)",temp)); for(i=iPaintBeg;i<iPaintEnd;++i){
x=cxChar*(1-iHscrollPos);
y=cyChar*(1-iVscrollPos+i);
TextOut(hdc,x,y,sysmetrics[i].szLabel,strlen(sysmetrics[i].szLabel));
TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,strlen(sysmetrics[i].szDesc));
SetTextAlign(hdc,TA_RIGHT | TA_TOP);
TextOut(hdc,x+22*cxCaps+40*cxChar,y,
szBuffer,wsprintf(szBuffer,"%5d",GetSystemMetrics(sysmetrics[i].iIndex)));
SetTextAlign(hdc,TA_LEFT | TA_TOP);
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd,iMsg,wParam,lParam);
}//temp居然是负数!!
对:
temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar));
//temp=-22
如果改为:j=NUMLINES+2-(cyClient/cyChar);// int j;不是 static int j;
temp=iVscrollMax=max(0,j);//这时temp=0;
#define NUMLINES (sizeof(sysmetrics)/sizeof(sysmetrics[0]))struct {
int iIndex;
char *szLabel;
char *szDesc;
}
sysmetrics[]={
SM_CXSCREEN, "SM_CXSCREEN", "Screen width in pixels",
SM_CYSCREEN, "SM_CYSCREEN", "Screen height in pixels",
SM_CXVSCROLL, "SM_CXVSCROLL", "Vertical scroll arrow width",
SM_ARRANGE, "SM_ARRANGE", "system arranged minimized windows",
SM_CLEANBOOT, "SM_CLEANBOOT", "how the system was started:",
SM_CMOUSEBUTTONS, "SM_CMOUSEBUTTONS", "mouse button ",
};
//2.#include <windows.h>
#include <string.h>
#include "sysmets.h"LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
static char szAppName[]="SysMets3";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass; wndclass.cbSize=sizeof(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;
wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); hwnd=CreateWindow(szAppName," Get system metrics No.3",WS_OVERLAPPEDWINDOW |WS_VSCROLL|WS_HSCROLL,
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 iMsg,WPARAM wParam,LPARAM lParam)
{
static int cxChar,cxCaps,cyChar,cxClient,cyClient,iMaxWidth,
iVscrollPos,iVscrollMax,iHscrollPos,iHscrollMax,temp;
char szBuffer[10];
HDC hdc;
int i,x,y,iPaintBeg,iPaintEnd,iVscrollInc,iHscrollInc,j;
PAINTSTRUCT ps;
TEXTMETRIC tm; switch(iMsg){
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); iMaxWidth=40*cxChar+22*cxCaps;
return 0; case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
//注意!!temp=-22
temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar));
iVscrollPos=min(iVscrollPos,iVscrollMax);
SetScrollRange(hwnd,SB_VERT,0,iVscrollMax,FALSE);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE); iHscrollMax=max(0,2+(iMaxWidth-cxClient)/cxChar);
iHscrollPos=min(iHscrollPos,iHscrollMax);
SetScrollRange(hwnd,SB_HORZ,0,iHscrollMax,FALSE);
SetScrollPos(hwnd,SB_HORZ,iHscrollPos,TRUE); return 0; case WM_VSCROLL:
switch(LOWORD(wParam)){
case SB_TOP:
iVscrollInc=-iVscrollPos;
break;
case SB_BOTTOM:
iVscrollInc=iVscrollMax-iVscrollPos;
break; case SB_LINEUP:
iVscrollInc=-1;
break; case SB_LINEDOWN:
iVscrollInc=1;
break; case SB_PAGEUP:
iVscrollInc=min(-1,-cyClient/cyChar);
break; case SB_PAGEDOWN:
iVscrollInc=max(1,cyClient/cyChar);
break; case SB_THUMBTRACK:
iVscrollInc=HIWORD(wParam)-iVscrollPos;
break; default:
iVscrollInc=0;
}
iVscrollInc=max(-iVscrollPos,min(iVscrollInc,iVscrollMax-iVscrollPos));
if(iVscrollInc!=0){
iVscrollPos+=iVscrollInc;
ScrollWindow(hwnd,0,-cyChar*iVscrollInc,NULL,NULL);
SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
UpdateWindow(hwnd);
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); iPaintBeg=max(0,iVscrollPos+ps.rcPaint.top/cyChar-1);
iPaintEnd=min(NUMLINES,iVscrollPos+ps.rcPaint.bottom/cyChar);
//注意temp=-23!!!
TextOut(hdc,500,10,szBuffer,sprintf(szBuffer,"hhh:(%d)",temp)); for(i=iPaintBeg;i<iPaintEnd;++i){
x=cxChar*(1-iHscrollPos);
y=cyChar*(1-iVscrollPos+i);
TextOut(hdc,x,y,sysmetrics[i].szLabel,strlen(sysmetrics[i].szLabel));
TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,strlen(sysmetrics[i].szDesc));
SetTextAlign(hdc,TA_RIGHT | TA_TOP);
TextOut(hdc,x+22*cxCaps+40*cxChar,y,
szBuffer,wsprintf(szBuffer,"%5d",GetSystemMetrics(sysmetrics[i].iIndex)));
SetTextAlign(hdc,TA_LEFT | TA_TOP);
}
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd,iMsg,wParam,lParam);
}//temp居然是负数!!
对:
temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar));
//temp=-22
如果改为:j=NUMLINES+2-(cyClient/cyChar);// int j;不是 static int j;
temp=iVscrollMax=max(0,j);//这时temp=0;
value1, // low-order word
value2 // high-order word
);
接受参数是什么类型返回就是什么类型,估计max的参数有一个被系统认为成无符号的数了。
max前把后一个参数里的运算需要的变量的类型都看看!
cxClient=int( LOWORD(lParam) );
cyClient=int( HIWORD(lParam) );
//注意!!temp=-22
temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar)); 总之还是: jennyvenus(围巾是个大头鬼) 说的那句!
“接受参数是什么类型返回就是什么类型”
所以一定要保证Max两个参数的实际类型!
“看上去的东西并不一定”
就可以了