Added more support for buddy windows in the updown control.
This commit is contained in:
parent
06e8886ee8
commit
9b7fa1922a
|
@ -48,6 +48,7 @@ DEFAULT_DEBUG_CHANNEL(updown)
|
|||
#define DEFAULT_XSEP 0 /* default separation between buddy and crtl */
|
||||
#define DEFAULT_ADDTOP 0 /* amount to extend above the buddy window */
|
||||
#define DEFAULT_ADDBOT 0 /* amount to extend below the buddy window */
|
||||
#define DEFAULT_BUDDYBORDER 2 /* Width/height of the buddy border */
|
||||
|
||||
|
||||
/* Work constants */
|
||||
|
@ -113,6 +114,22 @@ static BOOL UPDOWN_OffsetVal(HWND hwnd, int delta)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* UPDOWN_HasBuddyBorder [Internal]
|
||||
*
|
||||
* When we have a buddy set and that we are aligned on our buddy, we
|
||||
* want to draw a sunken edge to make like we are part of that control.
|
||||
*/
|
||||
static BOOL UPDOWN_HasBuddyBorder(HWND hwnd)
|
||||
{
|
||||
UPDOWN_INFO* infoPtr = UPDOWN_GetInfoPtr (hwnd);
|
||||
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
|
||||
|
||||
return ( ((dwStyle & (UDS_ALIGNLEFT | UDS_ALIGNRIGHT)) != 0) &&
|
||||
(SendMessageA(hwnd, UDM_GETBUDDY, 0, 0) != 0) &&
|
||||
(lstrcmpiA(infoPtr->szBuddyClass, "EDIT") == 0 ) );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* UPDOWN_GetArrowRect
|
||||
* wndPtr - pointer to the up-down wnd
|
||||
|
@ -123,23 +140,43 @@ static BOOL UPDOWN_OffsetVal(HWND hwnd, int delta)
|
|||
*/
|
||||
static void UPDOWN_GetArrowRect (HWND hwnd, RECT *rect, BOOL incr)
|
||||
{
|
||||
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
|
||||
int len; /* will hold the width or height */
|
||||
|
||||
GetClientRect (hwnd, rect);
|
||||
|
||||
if (GetWindowLongA (hwnd, GWL_STYLE) & UDS_HORZ) {
|
||||
len = rect->right - rect->left; /* compute the width */
|
||||
if (incr)
|
||||
rect->left = len/2+1;
|
||||
/*
|
||||
* Make sure we calculate the rectangle to fit even if we draw the
|
||||
* border.
|
||||
*/
|
||||
if (UPDOWN_HasBuddyBorder(hwnd))
|
||||
{
|
||||
if (dwStyle & UDS_ALIGNLEFT)
|
||||
rect->left+=DEFAULT_BUDDYBORDER;
|
||||
else
|
||||
rect->right = len/2;
|
||||
rect->right-=DEFAULT_BUDDYBORDER;
|
||||
|
||||
InflateRect(rect, 0, -DEFAULT_BUDDYBORDER);
|
||||
}
|
||||
|
||||
/*
|
||||
* We're calculating the midpoint to figure-out where the
|
||||
* separation between the buttons will lay. We make sure that we
|
||||
* round the uneven numbers by adding 1.
|
||||
*/
|
||||
if (dwStyle & UDS_HORZ) {
|
||||
len = rect->right - rect->left + 1; /* compute the width */
|
||||
if (incr)
|
||||
rect->left = rect->left + len/2;
|
||||
else
|
||||
rect->right = rect->left + len/2;
|
||||
}
|
||||
else {
|
||||
len = rect->bottom - rect->top; /* compute the height */
|
||||
len = rect->bottom - rect->top + 1; /* compute the height */
|
||||
if (incr)
|
||||
rect->bottom = len/2;
|
||||
rect->bottom = rect->top + len/2;
|
||||
else
|
||||
rect->top = len/2+1;
|
||||
rect->top = rect->top + len/2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,6 +313,25 @@ static BOOL UPDOWN_SetBuddyInt (HWND hwnd)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* UPDOWN_DrawBuddyBorder [Internal]
|
||||
*
|
||||
* When we have a buddy set and that we are aligned on our buddy, we
|
||||
* want to draw a sunken edge to make like we are part of that control.
|
||||
*/
|
||||
static void UPDOWN_DrawBuddyBorder (HWND hwnd, HDC hdc)
|
||||
{
|
||||
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
|
||||
RECT clientRect;
|
||||
|
||||
GetClientRect(hwnd, &clientRect);
|
||||
|
||||
if (dwStyle & UDS_ALIGNLEFT)
|
||||
DrawEdge(hdc, &clientRect, EDGE_SUNKEN, BF_BOTTOM | BF_LEFT | BF_TOP);
|
||||
else
|
||||
DrawEdge(hdc, &clientRect, EDGE_SUNKEN, BF_BOTTOM | BF_RIGHT | BF_TOP);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* UPDOWN_Draw [Internal]
|
||||
*
|
||||
|
@ -288,6 +344,12 @@ static void UPDOWN_Draw (HWND hwnd, HDC hdc)
|
|||
BOOL prssed;
|
||||
RECT rect;
|
||||
|
||||
/*
|
||||
* Draw the common border between ourselves and our buddy.
|
||||
*/
|
||||
if (UPDOWN_HasBuddyBorder(hwnd))
|
||||
UPDOWN_DrawBuddyBorder(hwnd, hdc);
|
||||
|
||||
/* Draw the incr button */
|
||||
UPDOWN_GetArrowRect (hwnd, &rect, TRUE);
|
||||
prssed = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN);
|
||||
|
@ -331,13 +393,17 @@ static void UPDOWN_Refresh (HWND hwnd)
|
|||
* Asynchronous drawing (must ONLY be used in WM_PAINT).
|
||||
* Calls UPDOWN_Draw.
|
||||
*/
|
||||
static void UPDOWN_Paint (HWND hwnd)
|
||||
static void UPDOWN_Paint (HWND hwnd, HDC passedDC)
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdc;
|
||||
HDC hdc = passedDC;
|
||||
|
||||
if (passedDC == 0)
|
||||
hdc = BeginPaint (hwnd, &ps);
|
||||
|
||||
UPDOWN_Draw (hwnd, hdc);
|
||||
|
||||
if (passedDC == 0)
|
||||
EndPaint (hwnd, &ps);
|
||||
}
|
||||
|
||||
|
@ -356,7 +422,7 @@ static BOOL UPDOWN_SetBuddy (HWND hwnd, HWND hwndBud)
|
|||
UPDOWN_INFO* infoPtr = UPDOWN_GetInfoPtr (hwnd);
|
||||
DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
|
||||
RECT budRect; /* new coord for the buddy */
|
||||
int x; /* new x position and width for the up-down */
|
||||
int x,width; /* new x position and width for the up-down */
|
||||
|
||||
/* Is it a valid bud? */
|
||||
if(!IsWindow(hwndBud))
|
||||
|
@ -423,10 +489,25 @@ static BOOL UPDOWN_SetBuddy (HWND hwnd, HWND hwndBud)
|
|||
/* now position the up/down */
|
||||
/* Since the UDS_ALIGN* flags were used, */
|
||||
/* we will pick the position and size of the window. */
|
||||
width = DEFAULT_WIDTH;
|
||||
|
||||
SetWindowPos (hwnd, 0, x, budRect.top-DEFAULT_ADDTOP,DEFAULT_WIDTH,
|
||||
(budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT,
|
||||
SWP_NOACTIVATE|SWP_NOZORDER);
|
||||
/*
|
||||
* If the updown has a buddy border, it has to overlap with the buddy
|
||||
* to look as if it is integrated with the buddy control.
|
||||
* We nudge the control or change it size to overlap.
|
||||
*/
|
||||
if (UPDOWN_HasBuddyBorder(hwnd))
|
||||
{
|
||||
if(dwStyle & UDS_ALIGNRIGHT)
|
||||
x-=DEFAULT_BUDDYBORDER;
|
||||
else
|
||||
width+=DEFAULT_BUDDYBORDER;
|
||||
}
|
||||
|
||||
SetWindowPos (hwnd, infoPtr->Buddy,
|
||||
x, budRect.top-DEFAULT_ADDTOP,
|
||||
width, (budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT,
|
||||
SWP_NOACTIVATE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -672,7 +753,8 @@ LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam,
|
|||
case WM_ENABLE:
|
||||
if (dwStyle & WS_DISABLED)
|
||||
UPDOWN_CancelMode (hwnd);
|
||||
UPDOWN_Paint (hwnd);
|
||||
|
||||
UPDOWN_Refresh (hwnd);
|
||||
break;
|
||||
|
||||
case WM_TIMER:
|
||||
|
@ -741,7 +823,7 @@ LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam,
|
|||
break;
|
||||
|
||||
case WM_PAINT:
|
||||
UPDOWN_Paint (hwnd);
|
||||
UPDOWN_Paint (hwnd, (HDC)wParam);
|
||||
break;
|
||||
|
||||
case UDM_GETACCEL:
|
||||
|
|
Loading…
Reference in New Issue