From 10411d5fe5aeb1d50f1a124fb302a17ee5116bca Mon Sep 17 00:00:00 2001 From: Robert Shearman Date: Mon, 20 Dec 2004 17:00:46 +0000 Subject: [PATCH] - Make the month calendar child window auto-size instead of using a hard coded 200px. - Use SetFocus when the control is clicked on to get the correct behaviour when another control clicked on. - Force the WS_EX_CLIENTEDGE style, instead of emulating it. --- dlls/comctl32/datetime.c | 58 ++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c index 2fcc19b023..2b2d0ab75f 100644 --- a/dlls/comctl32/datetime.c +++ b/dlls/comctl32/datetime.c @@ -487,7 +487,6 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc) int i,prevright; RECT *field; RECT *rcDraw = &infoPtr->rcDraw; - RECT *rcClient = &infoPtr->rcClient; RECT *calbutton = &infoPtr->calbutton; RECT *checkbox = &infoPtr->checkbox; SIZE size; @@ -495,7 +494,6 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc) /* draw control edge */ TRACE("\n"); - DrawEdge(hdc, rcClient, EDGE_SUNKEN, BF_RECT); if (infoPtr->dateValid) { HFONT oldFont = SelectObject (hdc, infoPtr->hFont); @@ -578,25 +576,29 @@ DATETIME_LButtonDown (DATETIME_INFO *infoPtr, WORD wKey, INT x, INT y) /* FIXME: might be conditions where we don't want to update infoPtr->select */ infoPtr->select = new; - if (infoPtr->select != old) - infoPtr->haveFocus = DTHT_GOTFOCUS; + SetFocus(infoPtr->hwndSelf); if (infoPtr->select == DTHT_MCPOPUP) { + RECT rcMonthCal; + SendMessageW(infoPtr->hMonthCal, MCM_GETMINREQRECT, 0, (LPARAM)&rcMonthCal); + /* FIXME: button actually is only depressed during dropdown of the */ /* calendar control and when the mouse is over the button window */ infoPtr->bCalDepressed = TRUE; /* recalculate the position of the monthcal popup */ if(infoPtr->dwStyle & DTS_RIGHTALIGN) - infoPtr->monthcal_pos.x = infoPtr->rcClient.right - - ((infoPtr->calbutton.right - infoPtr->calbutton.left) + 200); + infoPtr->monthcal_pos.x = infoPtr->calbutton.left - + (rcMonthCal.right - rcMonthCal.left); else - infoPtr->monthcal_pos.x = 8; + /* FIXME: this should be after the area reserved for the checkbox */ + infoPtr->monthcal_pos.x = infoPtr->rcDraw.left; infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom; ClientToScreen (infoPtr->hwndSelf, &(infoPtr->monthcal_pos)); - /* FIXME My Windoze has cx=about 200, but it probably depends on font size etc */ - SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x, infoPtr->monthcal_pos.y, 200, 150, 0); + SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x, + infoPtr->monthcal_pos.y, rcMonthCal.right - rcMonthCal.left, + rcMonthCal.bottom - rcMonthCal.top, 0); if(IsWindowVisible(infoPtr->hMonthCal)) { ShowWindow(infoPtr->hMonthCal, SW_HIDE); @@ -790,6 +792,8 @@ DATETIME_KeyDown (DATETIME_INFO *infoPtr, DWORD vkCode, LPARAM flags) static LRESULT DATETIME_KillFocus (DATETIME_INFO *infoPtr, HWND lostFocus) { + TRACE("lost focus to %p\n", lostFocus); + if (infoPtr->haveFocus) { DATETIME_SendSimpleNotify (infoPtr, NM_KILLFOCUS); infoPtr->haveFocus = 0; @@ -801,9 +805,23 @@ DATETIME_KillFocus (DATETIME_INFO *infoPtr, HWND lostFocus) } +static LRESULT +DATETIME_NCCreate (HWND hwnd, LPCREATESTRUCTW lpcs) +{ + DWORD dwExStyle = GetWindowLongW(hwnd, GWL_EXSTYLE); + /* force control to have client edge */ + dwExStyle |= WS_EX_CLIENTEDGE; + SetWindowLongW(hwnd, GWL_EXSTYLE, dwExStyle); + + return DefWindowProcW(hwnd, WM_NCCREATE, 0, (LPARAM)lpcs); +} + + static LRESULT DATETIME_SetFocus (DATETIME_INFO *infoPtr, HWND lostFocus) { + TRACE("got focus from %p\n", lostFocus); + if (infoPtr->haveFocus == 0) { DATETIME_SendSimpleNotify (infoPtr, NM_SETFOCUS); infoPtr->haveFocus = DTHT_GOTFOCUS; @@ -855,11 +873,7 @@ DATETIME_Size (DATETIME_INFO *infoPtr, WORD flags, INT width, INT height) TRACE("Height=%ld, Width=%ld\n", infoPtr->rcClient.bottom, infoPtr->rcClient.right); - memcpy((&infoPtr->rcDraw), (&infoPtr->rcClient), sizeof(infoPtr->rcDraw)); - - /* subract the size of the edge drawn by DrawEdge */ - InflateRect(&infoPtr->rcDraw, -GetSystemMetrics(SM_CXEDGE), - -GetSystemMetrics(SM_CYEDGE)); + infoPtr->rcDraw = infoPtr->rcClient; /* set the size of the button that drops the calendar down */ /* FIXME: account for style that allows button on left side */ @@ -875,17 +889,6 @@ DATETIME_Size (DATETIME_INFO *infoPtr, WORD flags, INT width, INT height) infoPtr->checkbox.left = infoPtr->rcDraw.left; infoPtr->checkbox.right = infoPtr->rcDraw.left + 10; - /* update the position of the monthcal control */ - if(infoPtr->dwStyle & DTS_RIGHTALIGN) - infoPtr->monthcal_pos.x = infoPtr->rcClient.right - ((infoPtr->calbutton.right - - infoPtr->calbutton.left) + 145); - else - infoPtr->monthcal_pos.x = 8; - - infoPtr->monthcal_pos.y = infoPtr->rcClient.bottom; - ClientToScreen (infoPtr->hwndSelf, &(infoPtr->monthcal_pos)); - SetWindowPos(infoPtr->hMonthCal, 0, infoPtr->monthcal_pos.x, infoPtr->monthcal_pos.y, 145, 150, 0); - InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); return 0; @@ -989,7 +992,7 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) TRACE ("%x, %x, %lx\n", uMsg, wParam, lParam); - if (!infoPtr && (uMsg != WM_CREATE)) + if (!infoPtr && (uMsg != WM_CREATE) && (uMsg != WM_NCCREATE)) return DefWindowProcW( hwnd, uMsg, wParam, lParam ); switch (uMsg) { @@ -1049,6 +1052,9 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_KILLFOCUS: return DATETIME_KillFocus (infoPtr, (HWND)wParam); + case WM_NCCREATE: + return DATETIME_NCCreate (hwnd, (LPCREATESTRUCTW)lParam); + case WM_SETFOCUS: return DATETIME_SetFocus (infoPtr, (HWND)wParam); -- 2.33.8