在ScrollWindow()之后更新窗口。WinAPI

在ScrollWindow()之后更新窗口。WinAPI,winapi,Winapi,我想滚动我的窗口,但当我这样做时,前面的图像仍然存在。我怎样才能修好它 我的代码,可能有一些问题: 开关低或低参数 { 案例SB_系列: IVINC=1; 打破 案例SB_阵容: IVINC=-1; 打破 案例SB_THUMBTRACK: iVScrollInc=HIWORDwParam-iVScrollPos; 打破 违约: ivc=0; 打破 } iVScrollInc=最大iVScrollPos,最小VScrollinc,iVScrollMax-iVScrollPos; 如果公司0 {

我想滚动我的窗口,但当我这样做时,前面的图像仍然存在。我怎样才能修好它

我的代码,可能有一些问题:

开关低或低参数 { 案例SB_系列: IVINC=1; 打破 案例SB_阵容: IVINC=-1; 打破 案例SB_THUMBTRACK: iVScrollInc=HIWORDwParam-iVScrollPos; 打破 违约: ivc=0; 打破 } iVScrollInc=最大iVScrollPos,最小VScrollinc,iVScrollMax-iVScrollPos; 如果公司0 { iVScrollPos+=iVScrollInc; ScrollWindowhWnd,0,-cyChar*iVScrollInc,NULL,NULL; 设置crollposhwnd,SB_VERT,iVScrollPos,TRUE; 更新内部wwnd; } 对于int i=0;i 此外,应该使用std::vector缓冲区

这是我的代码,你需要参考一下

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static int  cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth,
        iVscrollPos, iVscrollMax;
    HDC         hdc;
    int         i, y, iPaintBeg, iPaintEnd, iVscrollInc;
    PAINTSTRUCT ps;
    TEXTMETRIC  tm;

    switch (iMsg)
    {
    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);

        iVscrollMax = max(0,buffer.size() + 2 - cyClient / cyChar);
        iVscrollPos = min(iVscrollPos, iVscrollMax);

        SetScrollRange(hwnd, SB_VERT, 0, iVscrollMax, FALSE);
        SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);

        return 0;

    case WM_VSCROLL:
        switch (LOWORD(wParam))
        {
        case SB_TOP:
            iVscrollInc = -iVscrollPos;
            break;

        case SB_BOTTOM:
            iVscrollInc = iVscrollMax - iVscrollPos;
            break;

        case SB_LINEUP:
            iVscrollInc = -1;
            break;

        case SB_LINEDOWN:
            iVscrollInc = 1;
            break;

        case SB_PAGEUP:
            iVscrollInc = min(-1, -cyClient / cyChar);
            break;

        case SB_PAGEDOWN:
            iVscrollInc = max(1, cyClient / cyChar);
            break;

        case SB_THUMBTRACK:
            iVscrollInc = HIWORD(wParam) - iVscrollPos;
            break;

        default:
            iVscrollInc = 0;
        }
        iVscrollInc = max(-iVscrollPos,
            min(iVscrollInc, iVscrollMax - iVscrollPos));

        if (iVscrollInc != 0)
        {
            iVscrollPos += iVscrollInc;
            ScrollWindow(hwnd, 0, -cyChar * iVscrollInc, NULL, NULL);
            SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
            UpdateWindow(hwnd);
        }
        return 0;



    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        iPaintBeg = max(0, iVscrollPos + ps.rcPaint.top / cyChar - 1);
        iPaintEnd = min(buffer.size(),
            iVscrollPos + ps.rcPaint.bottom / cyChar);

        for (i = iPaintBeg; i < iPaintEnd; i++)
        {
            y = cyChar * (1 - iVscrollPos + i);

            TextOut(hdc, 0, y,
                buffer[i].c_str(),
                buffer[i].length());


            SetTextAlign(hdc, TA_LEFT | TA_TOP);
        }

        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

代码可能无法正确擦除窗口。默认为WNDCLASSEX.hbrBackground成员。请解释一下,好吗?Charlz Petsell。我现在读了。在我看来,我写的代码和他的一样,但我不明白为什么我的代码是错的。是的,我可以,但真的很抱歉,我没有笔记本电脑。后来为什么我们在TextOut之后写入SetTextAlign?请参阅SetTextAlign的说明它与iPainBeg和iPaIntellent一起工作,但我不明白如果iPainBeg和iPaIntellent告诉我们从缓冲区的哪个元素开始绘制,为什么我们需要滚动窗口。如果我想按像素滚动,而不是按字体高度滚动,该怎么办