static void PAGER_Scroll(PAGER_INFO* infoPtr, INT dir) { NMPGSCROLL nmpgScroll; RECT rcWnd; if (infoPtr->hwndChild) { ZeroMemory (&nmpgScroll, sizeof (NMPGSCROLL)); nmpgScroll.hdr.hwndFrom = infoPtr->hwndSelf; nmpgScroll.hdr.idFrom = GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_ID); nmpgScroll.hdr.code = PGN_SCROLL; GetWindowRect(infoPtr->hwndSelf, &rcWnd); GetClientRect(infoPtr->hwndSelf, &nmpgScroll.rcParent); nmpgScroll.iXpos = nmpgScroll.iYpos = 0; nmpgScroll.iDir = dir; if (infoPtr->dwStyle & PGS_HORZ) { nmpgScroll.iScroll = rcWnd.right - rcWnd.left; nmpgScroll.iXpos = infoPtr->nPos; } else { nmpgScroll.iScroll = rcWnd.bottom - rcWnd.top; nmpgScroll.iYpos = infoPtr->nPos; } nmpgScroll.iScroll -= 2*infoPtr->nButtonSize; SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, (WPARAM)nmpgScroll.hdr.idFrom, (LPARAM)&nmpgScroll); TRACE("[%p] PGN_SCROLL returns iScroll=%d\n", infoPtr->hwndSelf, nmpgScroll.iScroll); if (nmpgScroll.iScroll > 0) { infoPtr->direction = dir; if (dir == PGF_SCROLLLEFT || dir == PGF_SCROLLUP) PAGER_SetPos(infoPtr, infoPtr->nPos - nmpgScroll.iScroll, TRUE); else PAGER_SetPos(infoPtr, infoPtr->nPos + nmpgScroll.iScroll, TRUE); } else infoPtr->direction = -1; } }
static LRESULT PAGER_RecalcSize(PAGER_INFO *infoPtr) { TRACE("[%p]\n", infoPtr->hwndSelf); if (infoPtr->hwndChild) { INT scrollRange = PAGER_GetScrollRange(infoPtr); if (scrollRange <= 0) { infoPtr->nPos = -1; PAGER_SetPos(infoPtr, 0, FALSE); } else PAGER_PositionChildWnd(infoPtr); } return 1; }
static LRESULT PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild) { infoPtr->hwndChild = IsWindow (hwndChild) ? hwndChild : 0; if (infoPtr->hwndChild) { TRACE("[%p] hwndChild=%p\n", infoPtr->hwndSelf, infoPtr->hwndChild); SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); /* position child within the page scroller */ SetWindowPos(infoPtr->hwndChild, HWND_TOP, 0,0,0,0, SWP_SHOWWINDOW | SWP_NOSIZE); /* native is 0 */ infoPtr->nPos = -1; PAGER_SetPos(infoPtr, 0, FALSE); } return 0; }
static LRESULT PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild) { INT hw; infoPtr->hwndChild = IsWindow (hwndChild) ? hwndChild : 0; if (infoPtr->hwndChild) { TRACE("[%p] hwndChild=%p\n", infoPtr->hwndSelf, infoPtr->hwndChild); if (infoPtr->dwStyle & PGS_HORZ) { hw = PAGER_SetFixedHeight(infoPtr); /* adjust non-scrollable dimension to fit the child */ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, hw, infoPtr->nHeight, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } else { hw = PAGER_SetFixedWidth(infoPtr); /* adjust non-scrollable dimension to fit the child */ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, infoPtr->nWidth, hw, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } /* position child within the page scroller */ SetWindowPos(infoPtr->hwndChild, HWND_TOP, 0,0,0,0, SWP_SHOWWINDOW | SWP_NOSIZE); /* native is 0 */ infoPtr->nPos = -1; PAGER_SetPos(infoPtr, 0, FALSE); } return 0; }
static LRESULT WINAPI PAGER_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PAGER_INFO *infoPtr = (PAGER_INFO *)GetWindowLongPtrW(hwnd, 0); if (!infoPtr && (uMsg != WM_CREATE)) return DefWindowProcW (hwnd, uMsg, wParam, lParam); switch (uMsg) { case EM_FMTLINES: return PAGER_FmtLines(infoPtr); case PGM_FORWARDMOUSE: return PAGER_ForwardMouse (infoPtr, (BOOL)wParam); case PGM_GETBKCOLOR: return PAGER_GetBkColor(infoPtr); case PGM_GETBORDER: return PAGER_GetBorder(infoPtr); case PGM_GETBUTTONSIZE: return PAGER_GetButtonSize(infoPtr); case PGM_GETPOS: return PAGER_GetPos(infoPtr); case PGM_GETBUTTONSTATE: return PAGER_GetButtonState (infoPtr, (INT)lParam); /* case PGM_GETDROPTARGET: */ case PGM_RECALCSIZE: return PAGER_RecalcSize(infoPtr); case PGM_SETBKCOLOR: return PAGER_SetBkColor (infoPtr, (COLORREF)lParam); case PGM_SETBORDER: return PAGER_SetBorder (infoPtr, (INT)lParam); case PGM_SETBUTTONSIZE: return PAGER_SetButtonSize (infoPtr, (INT)lParam); case PGM_SETCHILD: return PAGER_SetChild (infoPtr, (HWND)lParam); case PGM_SETPOS: return PAGER_SetPos(infoPtr, (INT)lParam, FALSE); case WM_CREATE: return PAGER_Create (hwnd, (LPCREATESTRUCTW)lParam); case WM_DESTROY: return PAGER_Destroy (infoPtr); case WM_SIZE: return PAGER_Size (infoPtr, (INT)wParam, (short)LOWORD(lParam), (short)HIWORD(lParam)); case WM_NCPAINT: return PAGER_NCPaint (infoPtr, (HRGN)wParam); case WM_WINDOWPOSCHANGING: return PAGER_WindowPosChanging (infoPtr, (WINDOWPOS*)lParam); case WM_STYLECHANGED: return PAGER_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam); case WM_NCCALCSIZE: return PAGER_NCCalcSize (infoPtr, wParam, (LPRECT)lParam); case WM_NCHITTEST: return PAGER_NCHitTest (infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam)); case WM_MOUSEMOVE: if (infoPtr->bForward && infoPtr->hwndChild) PostMessageW(infoPtr->hwndChild, WM_MOUSEMOVE, wParam, lParam); return PAGER_MouseMove (infoPtr, (INT)wParam, (short)LOWORD(lParam), (short)HIWORD(lParam)); case WM_LBUTTONDOWN: return PAGER_LButtonDown (infoPtr, (INT)wParam, (short)LOWORD(lParam), (short)HIWORD(lParam)); case WM_LBUTTONUP: return PAGER_LButtonUp (infoPtr, (INT)wParam, (short)LOWORD(lParam), (short)HIWORD(lParam)); case WM_ERASEBKGND: return PAGER_EraseBackground (infoPtr, (HDC)wParam); case WM_TIMER: return PAGER_Timer (infoPtr, (INT)wParam); case WM_NOTIFY: case WM_COMMAND: return SendMessageW (infoPtr->hwndNotify, uMsg, wParam, lParam); default: return DefWindowProcW (hwnd, uMsg, wParam, lParam); } }