Следы при использовании ScrollWindow.WinAPI

185
27 июля 2021, 05:10

Пытаюсь создать полосу прокрутки. Использовал ScrollWindow после него вызываю UpdateWindow, но все равно получается что-то не то. Прокручиваю, но остаются следы от предыдущего изображения

#include <Windows.h>
#include <vector>
#include <string>
#define EMB(lpszError) MessageBox(NULL, lpszError, "ERROR", MB_ICONERROR | MB_OK)
#define VMB(value) MessageBox(NULL, std::to_string(int(value)).c_str(), "VALUE", MB_OK)
std::vector<std::string> buffer;

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static int cyChar;
    static int cyClient;
    static int iVScrollInc = 0;
    static int iVScrollPos = 0;
    static int iVScrollMax = 0; static int tes = 0;
    switch (msg)
    {
    case WM_CREATE:
    {
        TEXTMETRIC tm;
        HDC hDc = GetDC(hWnd);
        GetTextMetrics(hDc, &tm);
        cyChar = tm.tmHeight + tm.tmExternalLeading;
        ReleaseDC(hWnd, hDc);
        for (int i = 0; i < 100; ++i)
        {
            buffer.push_back(std::to_string(i));
        }
        break;
    }
    case WM_SIZE:
    {
        cyClient = HIWORD(lParam);
        iVScrollMax = max(0,static_cast<int>(buffer.size()) * cyChar - cyClient);
        iVScrollPos = min(iVScrollPos, iVScrollMax); buffer.push_back(std::to_string(cyClient));
        SetScrollRange(hWnd, SB_VERT, 0, iVScrollMax, TRUE); 
        break;
    }
    case WM_VSCROLL:
    {
        switch (LOWORD(wParam))
        {
        case SB_LINEDOWN:
            iVScrollInc = 1;
            break;
        case SB_LINEUP:
            iVScrollInc = -1;
            break;
        case SB_THUMBTRACK:
            iVScrollInc = HIWORD(wParam) - iVScrollPos;
            break;
        default:
            iVScrollInc = 0;
            break;
        }
        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);
        }
        return 0;
    }
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDc = BeginPaint(hWnd, &ps);
        for (int yPos = 0; yPos < buffer.size(); ++yPos)
        {
            TextOut(hDc, 10, 10 + yPos * cyChar, buffer[yPos].c_str(), buffer[yPos].length());
        }
        EndPaint(hWnd, &ps);
        break;
    }
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
ATOM RegisterMyClass(HINSTANCE hInstance, LPCSTR lpszClassName)
{
    WNDCLASSEX wndClass = { 0 };
    wndClass.cbClsExtra = 0;
    wndClass.cbSize = sizeof(wndClass);
    wndClass.cbWndExtra = 0;
    wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hIcon = LoadIcon(NULL, IDI_SHIELD);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WndProc;
    wndClass.lpszClassName = lpszClassName;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    return RegisterClassEx(&wndClass);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmd)
{
    LPCSTR lpszClassName = "INeedIt";
    HWND hWnd;
    MSG msg;
    if (!RegisterMyClass(hInstance, lpszClassName))
        EMB("Cant RegisterMyClass");
    if (!(hWnd = CreateWindow(lpszClassName, "Window", WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT
        , CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL)))
        EMB("Cant CreateWindow");
    ShowWindow(hWnd, nCmd);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }
}
READ ALSO
Что получится и как это работает?(c++)

Что получится и как это работает?(c++)

Подскажите, пожалуйста, что получится в каждом варианте и почему

214
Как повесить click на label с input?

Как повесить click на label с input?

Делаю на Wordpress форму с возможностью добавления нескольких фалов путём создание нескольких заранее определённых инпутов:

215
Помогите с Динамической Таблицей JAVASCRIPT

Помогите с Динамической Таблицей JAVASCRIPT

Я написала таблицу JS+HTML Но у меня возникла проблема с добавлением строкиВо время добавления строки дублируется значение первой строки

118