C 使用 ScrollWindowEx() 错误内容制作自己的窗口(GUI)滚动查看器

问题描述 投票:0回答:0

我正在尝试创建一个窗口并使用

ScrollWindowEx()
创建自己的滚动查看器(v-scroll)来处理
WM_MOUSEWHEEL 
窗口消息,它有效但显示了错误和无效的内容。 我的窗口是一个具有
700 
宽度和
600 
高度的窗口,我绘制了一个具有
1000 
高度的矩形,我试图向下滚动窗口以查看矩形的末端但从未到达它的末端。

#include <stdio.h>
#include <windows.h>
#include <gdiplus.h>

int SCREEN_SIZE_WIDTH,
        SCREEN_SIZE_HEIGHT;

static unsigned long long GDI_PLUS_TOKEN;
static GdiplusStartupInput GDI_PLUS_STARTUP_INPUT = {
        .GdiplusVersion = 1,
        .SuppressExternalCodecs = FALSE,
        .SuppressBackgroundThread = FALSE };

static WNDCLASSEXW WINDOW_CLASS_DEFAULT = (WNDCLASSEXW) {
        sizeof(WNDCLASSEXW),
        CS_HREDRAW|CS_VREDRAW|CS_CLASSDC,
        NULL,
        0,
        16,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        L"MY_CLASS",
        NULL };

LRESULT CALLBACK
window_callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI
WinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        PSTR lpCmdLine,
        int nCmdShow) {
    HWND window;
    if((SCREEN_SIZE_WIDTH=GetSystemMetrics(SM_CXSCREEN))==0
       || (SCREEN_SIZE_HEIGHT=GetSystemMetrics(SM_CYSCREEN))==0) {
        printf("GetSystemMetrics() failed.\r\n");
        ExitProcess(EXIT_FAILURE);
    }
    if(GdiplusStartup(&GDI_PLUS_TOKEN, &GDI_PLUS_STARTUP_INPUT, NULL)!=Ok) {
        printf("GdiplusStartup() failed.\r\n");
        ExitProcess(EXIT_FAILURE);
    }
    WINDOW_CLASS_DEFAULT.hInstance=hInstance;
    WINDOW_CLASS_DEFAULT.hbrBackground= CreateSolidBrush(RGB(255,255,255));
    WINDOW_CLASS_DEFAULT.hCursor=LoadCursor(NULL, IDC_ARROW);
    WINDOW_CLASS_DEFAULT.lpfnWndProc=window_callback;
    if(!RegisterClassExW(&WINDOW_CLASS_DEFAULT)) {
        printf("RegisterClassExW() failed.\r\n");
        ExitProcess(EXIT_FAILURE);
    }
    window=CreateWindowExW(
            0, L"MY_CLASS",
            L"MY PROJECT",
            WS_POPUP|WS_OVERLAPPEDWINDOW,
            ((SCREEN_SIZE_WIDTH - 700) / 2), // Center of the screen
            ((SCREEN_SIZE_HEIGHT - 400) / 2), // Center of the screen
            700, 600, NULL,
            NULL, hInstance, NULL);
    if(window==NULL) {
        printf("CreateWindowExA() failed.\r\n");
        goto failure;
    }
    ShowWindow(window, SW_NORMAL);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    UnregisterClassA("DRAWPEN", hInstance);
    ExitProcess(EXIT_SUCCESS);
    failure:
    UnregisterClassA("DRAWPEN", hInstance);
    ExitProcess(EXIT_FAILURE);
}

LRESULT CALLBACK
window_callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    HDC hdc;
    PAINTSTRUCT ps;
    static int scroll_value = 0;
    switch (uMsg) {
        case WM_MOUSEWHEEL:
        {
            // On scroll wheel, let's use ScrollWindowEx() function
            // to scroll vertical only and here is my problem !
            ScrollWindowEx(
                    hwnd, 0, GET_WHEEL_DELTA_WPARAM(wParam),
                    NULL, NULL, NULL,
                    NULL, SW_INVALIDATE);
            UpdateWindow(hwnd);
        }
            break;
        case WM_PAINT:
            printf("WM_PAINT\r\n");
            hdc=BeginPaint(hwnd, &ps);
            GpGraphics *gfx;
            GdipCreateFromHDC(hdc, &gfx);
            GpPen *pen;
            GdipCreatePen1(0xFF4c4c4c, 15, UnitPixel, &pen);
            GdipDrawRectangle(gfx, pen, 20, 20, 100, 1000);
            EndPaint(hwnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProcW(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

应用程序启动时的图片。

我向下滚动时的图片(永远不会到达矩形的末尾

向上滚动时的图片

c windows window gdi+
© www.soinside.com 2019 - 2024. All rights reserved.