显示一个带滚动条的窗口

Posted xiyu714

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示一个带滚动条的窗口相关的知识,希望对你有一定的参考价值。

  1 //main.c
  2 #include <windows.h>
  3 #include "sysmets.h"
  4 
  5 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  6 
  7 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  8 {
  9     static TCHAR szAppName[] = TEXT("Sysmets1");
 10     HWND    hwnd;
 11     MSG        msg;
 12     WNDCLASS    wndclass;
 13 
 14     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 15     wndclass.lpfnWndProc = WndProc;
 16     wndclass.cbClsExtra = 0;
 17     wndclass.cbWndExtra = 0;
 18     wndclass.hInstance = hInstance;
 19     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 20     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 21     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 22     wndclass.lpszMenuName = NULL;
 23     wndclass.lpszClassName = szAppName;
 24 
 25     if (!RegisterClass(&wndclass))
 26     {
 27         MessageBox(NULL, TEXT("This program requires Windows NT"), szAppName, MB_ICONERROR);
 28         return 0;
 29     }
 30 
 31     hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No.1"),
 32         WS_OVERLAPPEDWINDOW | WS_VSCROLL,    //为窗口添加VSCROLL风格
 33         CW_USEDEFAULT, CW_USEDEFAULT,
 34         CW_USEDEFAULT, CW_USEDEFAULT,
 35         NULL, NULL, hInstance, NULL
 36     );
 37 
 38     ShowWindow(hwnd, iCmdShow);
 39     UpdateWindow(hwnd);
 40     while (GetMessage(&msg, NULL, 0, 0))
 41     {
 42         TranslateMessage(&msg);
 43         DispatchMessage(&msg);
 44     }
 45     return msg.wParam;
 46 }
 47 
 48 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 49 {
 50     static int cxChar, cxCaps, cyChar, cyClient, iVscrollPos;
 51     HDC    hdc;
 52     int i, y;
 53     PAINTSTRUCT ps;
 54     TCHAR szBuffer[10];
 55     TEXTMETRIC tm;
 56 
 57     switch (message)
 58     {
 59     case WM_CREATE:
 60         hdc = GetDC(hwnd);
 61 
 62         GetTextMetrics(hdc, &tm);
 63         cxChar = tm.tmAveCharWidth;
 64         cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
 65         cyChar = tm.tmHeight + tm.tmExternalLeading;
 66 
 67         ReleaseDC(hwnd, hdc);
 68 
 69         SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE);
 70         SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
 71         return 0;
 72 
 73     case WM_SIZE:    //当窗口大小发生改变时,发送这条消息
 74         cyClient = HIWORD(lParam);    //HIWORD获取高字节;高位字是高度,低位字是客户区的宽度
 75         return 0;
 76 
 77     case WM_VSCROLL:    //如果在滚动条的不同部分按住鼠标键不放,程序可能收到多条滚动条消息。当松开鼠标键时,程序会收到一条带有SB_ENDSCROLL通知码的消息
 78         switch (LOWORD(wParam)) {
 79         case SB_LINEUP:
 80             iVscrollPos -= 1;
 81             break;
 82         case SB_LINEDOWN:
 83             iVscrollPos += 1;
 84             break;
 85         case SB_PAGEUP:
 86             iVscrollPos -= cyClient / cyChar;
 87             break;
 88         case SB_PAGEDOWN:
 89             iVscrollPos += cyClient / cyChar;
 90             break;
 91         case SB_THUMBPOSITION:    //当wParam的低位字是SB_THUMBPOSITION时,wParam的高位字是用户松开鼠标键时滑块的最终位置
 92             iVscrollPos = HIWORD(wParam);
 93             break;
 94         default:
 95             break;
 96         }
 97 
 98         iVscrollPos = max(0, min(iVscrollPos, NUMLINES - 1));    //stdlib.h中定义的,只能在VS中使用
 99 
100         if (iVscrollPos != GetScrollPos(hwnd, SB_VERT))
101         {
102             SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);    //不管设置为TRUE还是FALSE位置都会改变,可能是还有消息使用了默认的窗口过程导致的
103             InvalidateRect(hwnd, NULL, TRUE);
104         }
105 
106     case WM_PAINT:
107         hdc = BeginPaint(hwnd, &ps);
108 
109         for (i = 0; i < NUMLINES; i++)
110         {
111             y = cyChar * (i - iVscrollPos);    //设置输出位置
112 
113             TextOut(hdc, 0, y,
114                 sysmetrics[i].szLabel,
115                 lstrlen(sysmetrics[i].szLabel)
116             );
117             TextOut(hdc, 22 * cxCaps, y,
118                 sysmetrics[i].szDesc,
119                 lstrlen(sysmetrics[i].szDesc)
120             );
121             SetTextAlign(hdc, TA_RIGHT | TA_TOP);
122 
123             TextOut(hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
124                 wsprintf(szBuffer, TEXT("%5d"),
125                     GetSystemMetrics(sysmetrics[i].iIndex)
126                 )
127             );
128             SetTextAlign(hdc, TA_LEFT | TA_TOP);
129 
130         }
131         EndPaint(hwnd, &ps);
132         return 0;
133     case WM_DESTROY:
134         PostQuitMessage(0);
135         return 0;
136     }
137     return DefWindowProc(hwnd, message, wParam, lParam);
138 }
//SYSMETS.h
#define NUMLINES ((int)(sizeof sysmetrics / sizeof sysmetrics[0]))

//原来,头文件中的内容也和头文件在源文件中的包含有关
struct
{
    int iIndex;
    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 dragable width"),
    SM_CYMAXTRACK,           TEXT("SM_CYMAXTRACK"),
    TEXT("Maximum dragable 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")
};

 

以上是关于显示一个带滚动条的窗口的主要内容,如果未能解决你的问题,请参考以下文章

javaswing 带滚动条文本域边框问题

带滚动条的div如何实现内容滑动,新手不懂,求高手支招

C# Winform 滚动条的问题

带滚动条的只读 TextArea [JavaFx]

VC中怎么滚动条宽度怎么解决

Qt 如何获取滚动窗体中鼠标点击的坐标