windows编程——滚动条


#include <windows.h>
#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_CYVSCROLL,TEXT("SM_CYVSCROLL"),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")
};

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数原型
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
    static TCHAR szAppName[]=TEXT("HelloWin");
    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 | 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);
    }
    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);
        iMaxWidth=40*cxChar+22*cxCaps;
        return 0;
    case WM_SIZE:
        cxClient=LOWORD(lParam);
        cyClient=HIWORD(lParam);
        return 0;
    case WM_VSCROLL:
        si.cbSize=sizeof(si);
        si.fMask=SIF_ALL;
        GetScrollInfo(hwnd,SB_VERT,&si);
        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;
        }
        si.fMask=SIF_POS;
        SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
        GetScrollInfo(hwnd,SB_VERT,&si);
        if (si.nPos!=iVertPos)
        {
            ScrollWindow(hwnd,0,cyChar*(iVertPos-si.nPos),NULL,NULL);
            UpdateWindow(hwnd);
        }
        return 0;
        case WM_HSCROLL:
            si.cbSize=sizeof(si);
            si.fMask=SIF_ALL;
            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;
            }
            si.fMask=SIF_POS;
            SetScrollInfo(hwnd,SB_HORZ,&si,TRUE);
            GetScrollInfo(hwnd,SB_HORZ,&si);
            if(si.nPos!=iHorzPos)
            {
                ScrollWindow(hwnd,cxChar* (iHorzPos-si.nPos),0,NULL,NULL);
            }
            return 0;
            case WM_PAINT:
                hdc=BeginPaint(hwnd,&ps);
                si.cbSize=sizeof(si);
                si.fMask=SIF_POS;
                GetScrollInfo(hwnd,SB_VERT,&si);
                iVertPos=si.nPos;
                GetScrollInfo(hwnd,SB_HORZ,&si);
                iHorzPos=si.nPos;
                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);
                }
                EndPaint(hwnd,&ps);
                return 0;
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
                }
                return DefWindowProc(hwnd,message,wParam,lParam);
                }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值