我正在尝试创建一个窗口并使用
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;
}
我向下滚动时的图片(永远不会到达矩形的末尾
向上滚动时的图片