win32 滚动条 显示文本



#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 buttons 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 ("Horizontal 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 windows 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")




};













////////////////////////////////////////////////////////////////////////////



#include


#include"sysmetrics.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 ("Program requires Windows NT!"),
        
         szAppName, MB_ICONERROR) ;
        
           return 0 ;
        
    }
        


    hwnd = CreateWindow (szAppName, TEXT ("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, 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 ;
        


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 Windows 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) ;
        
    }
        


            EndPaint (hwnd, &ps) ;
        
            return 0 ;
        
        
        
    case   WM_DESTROY :
        
            PostQuitMessage (0) ;
        
            return 0 ;
        
}
        
    return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}
        

你可能感兴趣的:(win32)