Я пытаюсь заставить работать частичную прокрутку. Приведенный ниже код выглядит так (визуально), что окно частично прокручивается, но кнопки на самом деле не двигаются. После прокрутки, если мы нажимаем кнопки или перекрываем другое окно, они возвращают кнопки в исходное положение без перемещения полосы прокрутки.
#include <windows.h>
#include <commctrl.h>
long scrollY = 0;
RECT rect;
HINSTANCE hinst;
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {
case WM_CREATE: {
CreateWindowEx(WS_OVERLAPPED,"Button","Button 1", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 5, 5, 200, 50, hwnd,(HMENU) 10001,hinst,NULL);
CreateWindowEx(WS_OVERLAPPED,"Button","Button 2", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 5, 55, 200, 50, hwnd,(HMENU) 10002,hinst,NULL);
CreateWindowEx(WS_OVERLAPPED,"Button","Button 3", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 5, 105, 200, 50, hwnd,(HMENU) 10003,hinst,NULL);
CreateWindowEx(WS_OVERLAPPED,"Button","Button 4", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 5, 155, 200, 50, hwnd,(HMENU) 10004,hinst,NULL);
CreateWindowEx(WS_OVERLAPPED,"Button","Button 5", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 5, 205, 200, 50, hwnd,(HMENU) 10005,hinst,NULL);
SCROLLINFO si;
si.cbSize = sizeof(SCROLLBARINFO);
si.fMask = SIF_ALL;
si.nMax = 40;
si.nMin = 0;
si.nPage = 10;
si.nPos = 0;
si.nTrackPos = 0;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
GetClientRect(hwnd, &rect);
break;
}
case WM_VSCROLL:{
RECT rc;
int CurPos = scrollY;
int TemPos = CurPos;
switch (LOWORD(wParam))
{
case SB_TOP: CurPos = 0; break;
case SB_LINEUP: CurPos = (CurPos > 0)? CurPos - 1 : 0; break;
case SB_THUMBPOSITION: CurPos = HIWORD(wParam); break;
case SB_THUMBTRACK: CurPos = HIWORD(wParam); break;
case SB_LINEDOWN: CurPos = (CurPos < 240)? CurPos + 1 : 240; break;
case SB_BOTTOM: CurPos = 240; break;
case SB_ENDSCROLL: break;
}
SetScrollPos(hwnd, SB_VERT, CurPos, TRUE);
TemPos = CurPos - TemPos;
rc = rect;
rc.top = rc.top + 55;
ScrollWindowEx(hwnd, 0, -TemPos, &rc, &rc, NULL, NULL, SW_ERASE | SW_INVALIDATE);
scrollY = CurPos;
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hwnd, Message, wParam, lParam);
}
/*Standard WinMain omitted for brevity*/
Edit:
Я хочу, чтобы кнопка Button1 оставалась видимой при прокрутке. Частично прокрутите окно.