- Make all WM_NOTIFY messages go to the parent.
- Allow WM_WINDOWPOSCHANGING when the control is size 0 to set initial size. - Combine multiple SetWindowPos calls in same processing line and make the flags like native. - Redo WM_NCCALCSIZE to match native. - Since Pager is a "transparent" control (except for its own buttons), the WM_ERASEBKGND needs to be passed to the parent. Also do the window offset like the native control does.
This commit is contained in:
parent
3e3e230d3b
commit
3554e75cc8
|
@ -281,7 +281,7 @@ PAGER_CalcSize (HWND hwnd, INT* size, BOOL getWidth)
|
||||||
nmpgcs.dwFlag = getWidth ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
|
nmpgcs.dwFlag = getWidth ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
|
||||||
nmpgcs.iWidth = getWidth ? *size : 0;
|
nmpgcs.iWidth = getWidth ? *size : 0;
|
||||||
nmpgcs.iHeight = getWidth ? 0 : *size;
|
nmpgcs.iHeight = getWidth ? 0 : *size;
|
||||||
SendMessageA (hwnd, WM_NOTIFY,
|
SendMessageA (GetParent (hwnd), WM_NOTIFY,
|
||||||
(WPARAM)nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs);
|
(WPARAM)nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs);
|
||||||
|
|
||||||
*size = getWidth ? nmpgcs.iWidth : nmpgcs.iHeight;
|
*size = getWidth ? nmpgcs.iWidth : nmpgcs.iHeight;
|
||||||
|
@ -454,10 +454,11 @@ PAGER_UpdateBtns(HWND hwnd, PAGER_INFO *infoPtr,
|
||||||
if (hideGrayBtns)
|
if (hideGrayBtns)
|
||||||
PAGER_HideGrayBtns(infoPtr, &resizeClient);
|
PAGER_HideGrayBtns(infoPtr, &resizeClient);
|
||||||
|
|
||||||
if (resizeClient) /* initiate NCCalcSize to resize client wnd */
|
if (resizeClient) /* initiate NCCalcSize to resize client wnd */ {
|
||||||
SetWindowPos(hwnd, 0,0,0,0,0,
|
SetWindowPos(hwnd, 0,0,0,0,0,
|
||||||
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
|
SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
|
||||||
SWP_NOZORDER | SWP_NOACTIVATE);
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
if (repaintBtns)
|
if (repaintBtns)
|
||||||
SendMessageA(hwnd, WM_NCPAINT, 0, 0);
|
SendMessageA(hwnd, WM_NCPAINT, 0, 0);
|
||||||
|
@ -490,7 +491,7 @@ PAGER_SetPos(HWND hwnd, INT newPos, BOOL fromBtnPress)
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
PAGER_HandleWindowPosChanging(HWND hwnd, WINDOWPOS *winpos)
|
PAGER_HandleWindowPosChanging(HWND hwnd, WPARAM wParam, WINDOWPOS *winpos)
|
||||||
{
|
{
|
||||||
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
||||||
|
|
||||||
|
@ -500,16 +501,28 @@ PAGER_HandleWindowPosChanging(HWND hwnd, WINDOWPOS *winpos)
|
||||||
* that was created with CCS_NORESIZE style
|
* that was created with CCS_NORESIZE style
|
||||||
* (i.e. height for a horizontal pager, or width for a vertical one) */
|
* (i.e. height for a horizontal pager, or width for a vertical one) */
|
||||||
|
|
||||||
|
/* except if the current dimension is 0 and app is setting for
|
||||||
|
* first time, then save amount as dimension. - GA 8/01 */
|
||||||
|
|
||||||
if (PAGER_IsHorizontal(hwnd))
|
if (PAGER_IsHorizontal(hwnd))
|
||||||
winpos->cy = infoPtr->nHeight;
|
if (!infoPtr->nHeight && winpos->cy)
|
||||||
|
infoPtr->nHeight = winpos->cy;
|
||||||
|
else
|
||||||
|
winpos->cy = infoPtr->nHeight;
|
||||||
else
|
else
|
||||||
winpos->cx = infoPtr->nWidth;
|
if (!infoPtr->nWidth && winpos->cx)
|
||||||
|
infoPtr->nWidth = winpos->cx;
|
||||||
|
else
|
||||||
|
winpos->cx = infoPtr->nWidth;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
DefWindowProcA (hwnd, WM_WINDOWPOSCHANGING, wParam, (LPARAM)winpos);
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static INT
|
||||||
PAGER_SetFixedWidth(HWND hwnd, PAGER_INFO* infoPtr)
|
PAGER_SetFixedWidth(HWND hwnd, PAGER_INFO* infoPtr)
|
||||||
{
|
{
|
||||||
/* Must set the non-scrollable dimension to be less than the full height/width
|
/* Must set the non-scrollable dimension to be less than the full height/width
|
||||||
|
@ -534,16 +547,13 @@ PAGER_SetFixedWidth(HWND hwnd, PAGER_INFO* infoPtr)
|
||||||
|
|
||||||
h = wndRect.bottom - wndRect.top + infoPtr->nButtonSize;
|
h = wndRect.bottom - wndRect.top + infoPtr->nButtonSize;
|
||||||
|
|
||||||
/* adjust non-scrollable dimension to fit the child */
|
|
||||||
SetWindowPos(hwnd, 0, 0,0, infoPtr->nWidth, h,
|
|
||||||
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER);
|
|
||||||
|
|
||||||
|
|
||||||
TRACE("[%04x] infoPtr->nWidth set to %d\n",
|
TRACE("[%04x] infoPtr->nWidth set to %d\n",
|
||||||
hwnd, infoPtr->nWidth);
|
hwnd, infoPtr->nWidth);
|
||||||
|
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static INT
|
||||||
PAGER_SetFixedHeight(HWND hwnd, PAGER_INFO* infoPtr)
|
PAGER_SetFixedHeight(HWND hwnd, PAGER_INFO* infoPtr)
|
||||||
{
|
{
|
||||||
/* Must set the non-scrollable dimension to be less than the full height/width
|
/* Must set the non-scrollable dimension to be less than the full height/width
|
||||||
|
@ -568,12 +578,10 @@ PAGER_SetFixedHeight(HWND hwnd, PAGER_INFO* infoPtr)
|
||||||
|
|
||||||
w = wndRect.right - wndRect.left + infoPtr->nButtonSize;
|
w = wndRect.right - wndRect.left + infoPtr->nButtonSize;
|
||||||
|
|
||||||
/* adjust non-scrollable dimension to fit the child */
|
|
||||||
SetWindowPos(hwnd, 0, 0,0, w, infoPtr->nHeight,
|
|
||||||
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER);
|
|
||||||
|
|
||||||
TRACE("[%04x] infoPtr->nHeight set to %d\n",
|
TRACE("[%04x] infoPtr->nHeight set to %d\n",
|
||||||
hwnd, infoPtr->nHeight);
|
hwnd, infoPtr->nHeight);
|
||||||
|
|
||||||
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
|
@ -653,6 +661,7 @@ static LRESULT
|
||||||
PAGER_SetChild (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
PAGER_SetChild (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
||||||
|
INT hw;
|
||||||
|
|
||||||
infoPtr->hwndChild = IsWindow ((HWND)lParam) ? (HWND)lParam : 0;
|
infoPtr->hwndChild = IsWindow ((HWND)lParam) ? (HWND)lParam : 0;
|
||||||
|
|
||||||
|
@ -660,15 +669,25 @@ PAGER_SetChild (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
TRACE("[%04x] hwndChild=%04x\n", hwnd, infoPtr->hwndChild);
|
TRACE("[%04x] hwndChild=%04x\n", hwnd, infoPtr->hwndChild);
|
||||||
|
|
||||||
if (PAGER_IsHorizontal(hwnd))
|
if (PAGER_IsHorizontal(hwnd)) {
|
||||||
PAGER_SetFixedHeight(hwnd, infoPtr);
|
hw = PAGER_SetFixedHeight(hwnd, infoPtr);
|
||||||
else
|
/* adjust non-scrollable dimension to fit the child */
|
||||||
PAGER_SetFixedWidth(hwnd, infoPtr);
|
SetWindowPos(hwnd, 0, 0,0, hw, infoPtr->nHeight,
|
||||||
|
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |
|
||||||
|
SWP_NOSIZE | SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hw = PAGER_SetFixedWidth(hwnd, infoPtr);
|
||||||
|
/* adjust non-scrollable dimension to fit the child */
|
||||||
|
SetWindowPos(hwnd, 0, 0,0, infoPtr->nWidth, hw,
|
||||||
|
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER |
|
||||||
|
SWP_NOSIZE | SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
/* position child within the page scroller */
|
/* position child within the page scroller */
|
||||||
SetWindowPos(infoPtr->hwndChild, HWND_TOP,
|
SetWindowPos(infoPtr->hwndChild, HWND_TOP,
|
||||||
0,0,0,0,
|
0,0,0,0,
|
||||||
SWP_SHOWWINDOW | SWP_NOSIZE);
|
SWP_SHOWWINDOW | SWP_NOSIZE); /* native is 0 */
|
||||||
|
|
||||||
infoPtr->nPos = -1;
|
infoPtr->nPos = -1;
|
||||||
PAGER_SetPos(hwnd, 0, FALSE);
|
PAGER_SetPos(hwnd, 0, FALSE);
|
||||||
|
@ -785,6 +804,9 @@ PAGER_NCCalcSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
||||||
LPRECT lpRect = (LPRECT)lParam;
|
LPRECT lpRect = (LPRECT)lParam;
|
||||||
|
RECT rcChildw, rcmyw, wnrc, lbrc, rbrc;
|
||||||
|
POINT cursor;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* lParam points to a RECT struct. On entry, the struct
|
* lParam points to a RECT struct. On entry, the struct
|
||||||
* contains the proposed wnd rectangle for the window.
|
* contains the proposed wnd rectangle for the window.
|
||||||
|
@ -792,19 +814,85 @@ PAGER_NCCalcSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
* coordinates of the corresponding window's client area.
|
* coordinates of the corresponding window's client area.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
DefWindowProcA (hwnd, WM_NCCALCSIZE, wParam, lParam);
|
||||||
|
|
||||||
if (PAGER_IsHorizontal(hwnd))
|
if (PAGER_IsHorizontal(hwnd))
|
||||||
{
|
{
|
||||||
if (infoPtr->TLbtnState) /* != PGF_INVISIBLE */
|
infoPtr->nWidth = lpRect->right - lpRect->left;
|
||||||
lpRect->left += infoPtr->nButtonSize;
|
PAGER_CalcSize (hwnd, &infoPtr->nWidth, TRUE);
|
||||||
if (infoPtr->BRbtnState)
|
GetWindowRect (infoPtr->hwndChild, &rcChildw);
|
||||||
lpRect->right -= infoPtr->nButtonSize;
|
MapWindowPoints (0, hwnd, (LPPOINT)&rcChildw, 2);
|
||||||
|
GetCursorPos (&cursor);
|
||||||
|
GetWindowRect (hwnd, &rcmyw);
|
||||||
|
if (PtInRect (&rcmyw, cursor)) {
|
||||||
|
GetWindowRect (hwnd, &wnrc);
|
||||||
|
lbrc = wnrc;
|
||||||
|
lbrc.right = lbrc.left + infoPtr->nButtonSize;
|
||||||
|
rbrc = wnrc;
|
||||||
|
rbrc.left = rbrc.right - infoPtr->nButtonSize;
|
||||||
|
TRACE("horz lb rect=(%d,%d)-(%d,%d), rb rect=(%d,%d)-(%d,%d)\n",
|
||||||
|
lbrc.left, lbrc.top, lbrc.right, lbrc.bottom,
|
||||||
|
rbrc.left, rbrc.top, rbrc.right, rbrc.bottom);
|
||||||
|
if (PtInRect (&lbrc, cursor) && infoPtr->TLbtnState)
|
||||||
|
RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
|
||||||
|
if (PtInRect (&rbrc, cursor) && infoPtr->BRbtnState)
|
||||||
|
RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
|
||||||
|
}
|
||||||
|
if (infoPtr->TLbtnState) /* != PGF_INVISIBLE */
|
||||||
|
lpRect->left += infoPtr->nButtonSize;
|
||||||
|
if (infoPtr->BRbtnState)
|
||||||
|
lpRect->right -= infoPtr->nButtonSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (infoPtr->TLbtnState)
|
/* native does: (from trace of IE4 opening "Favorites" frame)
|
||||||
lpRect->top += infoPtr->nButtonSize;
|
* DefWindowProc
|
||||||
if (infoPtr->BRbtnState)
|
* WM_NOITFY PGN_CALCSIZE w/ dwFlag=2
|
||||||
lpRect->bottom -= infoPtr->nButtonSize;
|
* GetWindowRect (child, &rc)
|
||||||
|
* MapWindowPoints (0, syspager, &rc, 2)
|
||||||
|
* GetCursorPos( &cur )
|
||||||
|
* GetWindowRect (syspager, &rc2)
|
||||||
|
* PtInRect (&rc2, cur.x, cur.y) rtns 0
|
||||||
|
* returns with rect empty
|
||||||
|
*/
|
||||||
|
infoPtr->nHeight = lpRect->bottom - lpRect->top;
|
||||||
|
PAGER_CalcSize (hwnd, &infoPtr->nHeight, FALSE);
|
||||||
|
GetWindowRect (infoPtr->hwndChild, &rcChildw);
|
||||||
|
MapWindowPoints (0, hwnd, (LPPOINT)&rcChildw, 2);
|
||||||
|
GetCursorPos (&cursor);
|
||||||
|
GetWindowRect (hwnd, &rcmyw);
|
||||||
|
if (PtInRect (&rcmyw, cursor)) {
|
||||||
|
|
||||||
|
/* native does:
|
||||||
|
* GetWindowRect(pager, &rc)
|
||||||
|
* PtInRect(btn-left????, cur.x, cur.y)
|
||||||
|
* if true -> ???
|
||||||
|
* PtInRect(btn-right????, cur.x, cur.y)
|
||||||
|
* if true
|
||||||
|
* RedrawWindow(pager, 0, 0, 5)
|
||||||
|
* return TRUE
|
||||||
|
*/
|
||||||
|
|
||||||
|
GetWindowRect (hwnd, &wnrc);
|
||||||
|
lbrc = wnrc;
|
||||||
|
lbrc.right = lbrc.left + infoPtr->nButtonSize;
|
||||||
|
rbrc = wnrc;
|
||||||
|
rbrc.left = rbrc.right - infoPtr->nButtonSize;
|
||||||
|
TRACE("vert lb rect=(%d,%d)-(%d,%d), rb rect=(%d,%d)-(%d,%d)\n",
|
||||||
|
lbrc.left, lbrc.top, lbrc.right, lbrc.bottom,
|
||||||
|
rbrc.left, rbrc.top, rbrc.right, rbrc.bottom);
|
||||||
|
if (PtInRect (&lbrc, cursor) && infoPtr->TLbtnState)
|
||||||
|
RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
|
||||||
|
if (PtInRect (&rbrc, cursor) && infoPtr->BRbtnState)
|
||||||
|
RedrawWindow (hwnd, 0, 0, RDW_INVALIDATE | RDW_ERASE);
|
||||||
|
}
|
||||||
|
if (infoPtr->TLbtnState)
|
||||||
|
lpRect->top += infoPtr->nButtonSize;
|
||||||
|
if (infoPtr->BRbtnState)
|
||||||
|
lpRect->bottom -= infoPtr->nButtonSize;
|
||||||
|
/* ???? */
|
||||||
|
if ((lpRect->bottom < 0) || (lpRect->bottom > infoPtr->nHeight))
|
||||||
|
lpRect->bottom = infoPtr->nHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("[%04x] client rect set to %dx%d at (%d,%d)\n", hwnd,
|
TRACE("[%04x] client rect set to %dx%d at (%d,%d)\n", hwnd,
|
||||||
|
@ -1075,6 +1163,29 @@ PAGER_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
static LRESULT
|
static LRESULT
|
||||||
PAGER_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
PAGER_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
POINT pt, ptorig;
|
||||||
|
HDC hdc = (HDC)wParam;
|
||||||
|
HWND parent;
|
||||||
|
|
||||||
|
/* native does:
|
||||||
|
* parent = GetParent(pager)
|
||||||
|
* pt.x=0; pt.y=0; ?????
|
||||||
|
* MapWindowPoints(pager, parent, &pt, 1)
|
||||||
|
* OffsetWindowOrgEx(hdc, pt.x, pt.y, &ptorg)
|
||||||
|
* SendMessageA(parent, WM_ERASEBKGND, hdc, 0)
|
||||||
|
* SetWindowOrgEx(hdc, 0, 0, 0)
|
||||||
|
*/
|
||||||
|
|
||||||
|
pt.x = 0;
|
||||||
|
pt.y = 0;
|
||||||
|
parent = GetParent(hwnd);
|
||||||
|
MapWindowPoints(hwnd, parent, &pt, 1);
|
||||||
|
OffsetWindowOrgEx (hdc, pt.x, pt.y, &ptorig);
|
||||||
|
SendMessageA (parent, WM_ERASEBKGND, wParam, lParam);
|
||||||
|
SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
|
||||||
HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
|
HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
@ -1090,6 +1201,8 @@ PAGER_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteObject (hBrush);
|
DeleteObject (hBrush);
|
||||||
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1172,7 +1285,7 @@ PAGER_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
return PAGER_NCPaint (hwnd, wParam, lParam);
|
return PAGER_NCPaint (hwnd, wParam, lParam);
|
||||||
|
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
return PAGER_HandleWindowPosChanging (hwnd, (WINDOWPOS*)lParam);
|
return PAGER_HandleWindowPosChanging (hwnd, wParam, (WINDOWPOS*)lParam);
|
||||||
|
|
||||||
case WM_NCCALCSIZE:
|
case WM_NCCALCSIZE:
|
||||||
return PAGER_NCCalcSize (hwnd, wParam, lParam);
|
return PAGER_NCCalcSize (hwnd, wParam, lParam);
|
||||||
|
|
Loading…
Reference in New Issue