// 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;

解决方案 »

  1.   

    max(
      value1, // low-order word
      value2  // high-order word
    );
    接受参数是什么类型返回就是什么类型,估计max的参数有一个被系统认为成无符号的数了。
      

  2.   

    载处理
    max前把后一个参数里的运算需要的变量的类型都看看!
            cxClient=int( LOWORD(lParam) );
            cyClient=int( HIWORD(lParam) );
    //注意!!temp=-22
            temp=iVscrollMax=max(0,NUMLINES+2-(cyClient/cyChar)); 总之还是:   jennyvenus(围巾是个大头鬼) 说的那句!
    “接受参数是什么类型返回就是什么类型”
    所以一定要保证Max两个参数的实际类型!
    “看上去的东西并不一定”
      

  3.   

    max(0,int(NUMLINES+2-(cyClient/cyChar))); 
    就可以了