Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在vc++;win32_C++_Visual Studio_Winapi - Fatal编程技术网

C++ 如何在vc++;win32

C++ 如何在vc++;win32,c++,visual-studio,winapi,C++,Visual Studio,Winapi,基本上,我在自定义窗口中有一个滚动条,我们可以在其中添加其他控件,如按钮、文本框等,现在的问题是,我创建了滚动条,它可以向下和向上滚动,但问题是应该指定最大滚动条,然后阻止它滚动到更多,但是可以有用户想要的任意多的控制,对我来说这是未知的,我的意思是,当你用WM_VSCROLL或HSCROLL指定它时,我想告诉你问题更像是一个文本框的内置滚动条,然后让用户能够滚动你在文本框上键入的内容,这正是我想要的。 以下是迄今为止我能够通过的代码:- 滚动条代码:- case WM_LBUTTONDOWN:

基本上,我在自定义窗口中有一个滚动条,我们可以在其中添加其他控件,如按钮、文本框等,现在的问题是,我创建了滚动条,它可以向下和向上滚动,但问题是应该指定最大滚动条,然后阻止它滚动到更多,但是可以有用户想要的任意多的控制,对我来说这是未知的,我的意思是,当你用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 value是它能够滚动的最大行数,但我希望它的行数与控件的行数一样多。

您必须知道窗口中有多少个控件,以便可以将SCROLLINFO结构中的nMax成员设置为您想要的任何值,并调用setScrolInfo()每当添加新控件时,

您可能想考虑使用像WxWistGET、Qt等的GUI框架:@ ToMasMatthWs:WxWigGET可能只是勉强可用。另一方面,Qt是如此的脆弱,以至于你不可能想要推荐它。甚至MFC也能产生更好的GUI,这说明了很多。除此之外,问题是关于Windows API编程,滚动窗口当然不是寻找框架的理由。如果要求提供框架建议是不合适的,那么建议他们也应该是。好的,你怎么知道,用户需要在自定义窗口的静态控件中显示多少张图片。@alasenburgers:通过应用数学。我的数学很差,但我想我有另一种想法,我的意思是你可以告诉我扩展si.nMax值,比如,如果用户向上滚动以结束si.nMax值应该扩展或其他什么,或者我们可以得到最后一个控件的位置并将最大值设置为那么多,没有你的帮助,我无法完成。有人能告诉我如何扩展它吗?