簡體   English   中英

如何在vc ++ win32中制作可滾動窗口

[英]how to make a scrollable window in vc++ win32

基本上,我在自定義窗口中有一個滾動條,可以在其中添加其他控件,例如按鈕,文本框等等,現在這是我創建的滾動條的問題,它可以上下滾動,但是問題是最大滾動應該指定它,然后阻止它滾動,但可以有用戶想要的盡可能多的控制,對我來說這是未知的,我的意思是想告訴問題更像是文本框的內置使用WM_VSCROLL或HSCROLL指定滾動條時,然后賦予用戶滾動與您在文本框中鍵入的內容一樣多的功能,這正是我想要的。 到目前為止,這是我已經可以通過的代碼:-

滾動條代碼:-

case WM_LBUTTONDOWN:
    {
            SCROLLINFO si = { 0 };
            si.cbSize = sizeof(SCROLLINFO);
            si.fMask = SIF_POS;
            si.nPos = 0;
            si.nTrackPos = 0;
            GetScrollInfo(hwnd, SB_VERT, &si);
            break;
    }
     case WM_VSCROLL:
    {
            auto action = LOWORD(wParam);
            HWND hScroll = (HWND)lParam;
            int pos = -1;
            if (action == SB_THUMBPOSITION || action == SB_THUMBTRACK) {
                    pos = HIWORD(wParam);
            } else if (action == SB_LINEDOWN) {
                    pos = g_scrollY + 50;
            } else if (action == SB_LINEUP) {
                    pos = g_scrollY - 50;
            } else if (action == SB_PAGEUP) {
                    GetClientRect(hwnd, &r);
                    pos = g_scrollY - r.bottom;
            } else if (action == SB_PAGEDOWN){
                    GetClientRect(hwnd, &r);
                    pos = g_scrollY + r.bottom;
            }
            if (pos == -1)
                    break;
            SCROLLINFO si = { 0 };
            si.cbSize = sizeof(SCROLLINFO);
            si.fMask = SIF_POS;
            si.nPos = pos;
            si.nTrackPos = 0;
            SetScrollInfo(hwnd, SB_VERT, &si, true);

            GetScrollInfo(hwnd, SB_VERT, &si);
            pos = si.nPos;
            POINT pt;
            pt.x = 0;
            pt.y = pos - g_scrollY;
            auto hdc = GetDC(hwnd);
            LPtoDP(hdc, &pt, 1);
            ReleaseDC(hwnd, hdc);
            ScrollWindow(hwnd, 0, -pt.y, NULL, NULL);
            g_scrollY = pos;
            return 0;
    }
case WM_SIZE:
    {
            RECT rc = { 0 };
            GetClientRect(hwnd, &rc);
            SCROLLINFO si = { 0 };
            si.cbSize = sizeof(SCROLLINFO);
            si.fMask = SIF_ALL;
            si.nMin = 0;
            si.nMax = MAX_RANGE;
            if(si.nPos > 100)
                si.nMax = 5000;
            if(SB_THUMBPOSITION == 100){

                si.nMax = MAX_RANGE;}
            si.nPage = (rc.bottom - rc.top);
            si.nPos = 0;
            si.nTrackPos = 0;
            SetScrollInfo(hwnd, SB_VERT, &si, true);
            break;
    }

如您所見,si.nMax值是它將能夠滾動的最大行數,但是我希望它與控件一樣多。

您必須知道窗口中有多少個控件,因此可以在SCROLLINFO結構中將nMax成員設置為所需的任何值,並在添加新控件時調用SetScrollInfo()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM