diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 09f294f1d4..9bd97ef1da 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -72,6 +72,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(monthcal); typedef struct { + HWND hwndSelf; COLORREF bk; COLORREF txt; COLORREF titlebk; @@ -84,8 +85,6 @@ typedef struct int textWidth; int height_increment; int width_increment; - int left_offset; - int top_offset; int firstDayplace; /* place of the first day of the current month */ int delta; /* scroll rate; # of months that the */ /* control moves when user clicks a scroll button */ @@ -106,8 +105,6 @@ typedef struct SYSTEMTIME minDate; SYSTEMTIME maxDate; - RECT rcClient; /* rect for whole client area */ - RECT rcDraw; /* rect for drawable portion of client area */ RECT title; /* rect for the header above the calendar */ RECT titlebtnnext; /* the `next month' button in the header */ RECT titlebtnprev; /* the `prev month' button in the header */ @@ -208,12 +205,15 @@ static int MONTHCAL_CalcDayFromPos(MONTHCAL_INFO *infoPtr, int x, int y, int *daypos,int *weekpos) { int retval, firstDay; + RECT rcClient; + + GetClientRect(infoPtr->hwndSelf, &rcClient); /* if the point is outside the x bounds of the window put it at the boundry */ - if(x > infoPtr->rcClient.right) { - x = infoPtr->rcClient.right ; - } + if (x > rcClient.right) + x = rcClient.right; + *daypos = (x - infoPtr->days.left ) / infoPtr->width_increment; *weekpos = (y - infoPtr->days.top ) / infoPtr->height_increment; @@ -407,8 +407,6 @@ static void MONTHCAL_DrawDay(HDC hdc, MONTHCAL_INFO *infoPtr, int day, int month static void MONTHCAL_Refresh(HWND hwnd, HDC hdc, PAINTSTRUCT* ps) { MONTHCAL_INFO *infoPtr=MONTHCAL_GetInfoPtr(hwnd); - RECT *rcClient=&infoPtr->rcClient; - RECT *rcDraw=&infoPtr->rcDraw; RECT *title=&infoPtr->title; RECT *prev=&infoPtr->titlebtnprev; RECT *next=&infoPtr->titlebtnnext; @@ -435,10 +433,9 @@ static void MONTHCAL_Refresh(HWND hwnd, HDC hdc, PAINTSTRUCT* ps) oldTextColor = SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); - /* fill background */ hbr = CreateSolidBrush (infoPtr->bk); - FillRect(hdc, rcClient, hbr); + FillRect(hdc, &ps->rcPaint, hbr); DeleteObject(hbr); /* draw header */ @@ -519,8 +516,7 @@ static void MONTHCAL_Refresh(HWND hwnd, HDC hdc, PAINTSTRUCT* ps) /* draw line under day abbreviatons */ MoveToEx(hdc, infoPtr->days.left + 3, title->bottom + textHeight + 1, NULL); - - LineTo(hdc, rcDraw->right - 3, title->bottom + textHeight + 1); + LineTo(hdc, infoPtr->days.right - 3, title->bottom + textHeight + 1); prevMonth = infoPtr->currentMonth - 1; if(prevMonth == 0) /* if currentMonth is january(1) prevMonth is */ @@ -787,10 +783,14 @@ MONTHCAL_GetMinReqRect(HWND hwnd, WPARAM wParam, LPARAM lParam) if((infoPtr==NULL) ||(lpRect == NULL) ) return FALSE; - lpRect->left = infoPtr->rcClient.left; - lpRect->right = infoPtr->rcClient.right; - lpRect->top = infoPtr->rcClient.top; - lpRect->bottom = infoPtr->rcClient.bottom; + lpRect->left = infoPtr->title.left; + lpRect->top = infoPtr->title.top; + lpRect->right = infoPtr->title.right; + lpRect->bottom = infoPtr->todayrect.bottom; + AdjustWindowRect(lpRect, GetWindowLongW(hwnd, GWL_STYLE), FALSE); + + TRACE("%s\n", wine_dbgstr_rect(lpRect)); + return TRUE; } @@ -1697,14 +1697,17 @@ done: static LRESULT MONTHCAL_Paint(HWND hwnd, WPARAM wParam) { - MONTHCAL_INFO *infoPtr = MONTHCAL_GetInfoPtr(hwnd); HDC hdc; PAINTSTRUCT ps; - /* fill ps.rcPaint with a default rect */ - memcpy(&(ps.rcPaint), &(infoPtr->rcClient), sizeof(infoPtr->rcClient)); + if (wParam) + { + GetClientRect(hwnd, &ps.rcPaint); + hdc = (HDC)wParam; + } + else + hdc = BeginPaint(hwnd, &ps); - hdc = (wParam==0 ? BeginPaint(hwnd, &ps) : (HDC)wParam); MONTHCAL_Refresh(hwnd, hdc, &ps); if(!wParam) EndPaint(hwnd, &ps); return 0; @@ -1737,8 +1740,6 @@ static void MONTHCAL_UpdateSize(HWND hwnd) { HDC hdc = GetDC(hwnd); MONTHCAL_INFO *infoPtr = MONTHCAL_GetInfoPtr(hwnd); - RECT *rcClient=&infoPtr->rcClient; - RECT *rcDraw=&infoPtr->rcDraw; RECT *title=&infoPtr->title; RECT *prev=&infoPtr->titlebtnprev; RECT *next=&infoPtr->titlebtnnext; @@ -1752,72 +1753,41 @@ static void MONTHCAL_UpdateSize(HWND hwnd) TEXTMETRICA tm; DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE); HFONT currentFont; - double xdiv; + int xdiv, left_offset; + RECT rcClient; + + GetClientRect(hwnd, &rcClient); currentFont = SelectObject(hdc, infoPtr->hFont); - /* FIXME: need a way to determine current font, without setting it */ - /* - if(infoPtr->hFont!=currentFont) { - SelectObject(hdc, currentFont); - infoPtr->hFont=currentFont; - GetObjectA(currentFont, sizeof(LOGFONTA), &logFont); - logFont.lfWeight=FW_BOLD; - infoPtr->hBoldFont = CreateFontIndirectA(&logFont); - } - */ - /* get the height and width of each day's text */ GetTextMetricsA(hdc, &tm); - infoPtr->textHeight = tm.tmHeight + tm.tmExternalLeading; + infoPtr->textHeight = tm.tmHeight + tm.tmExternalLeading + tm.tmInternalLeading; GetTextExtentPoint32A(hdc, "Sun", 3, &size); infoPtr->textWidth = size.cx + 2; - /* retrieve the controls client rectangle info infoPtr->rcClient */ - GetClientRect(hwnd, rcClient); - - /* rcDraw is the rectangle the control is drawn in */ - rcDraw->left = rcClient->left; - rcDraw->right = rcClient->right; - rcDraw->top = rcClient->top; - rcDraw->bottom = rcClient->bottom; - /* recalculate the height and width increments and offsets */ - /* FIXME: We use up all available width. This will inhibit having multiple - calendars in a row, like win doesn - */ - if(dwStyle & MCS_WEEKNUMBERS) - xdiv=8.0; - else - xdiv=7.0; - infoPtr->width_increment = (infoPtr->rcDraw.right - infoPtr->rcDraw.left) / xdiv; - infoPtr->height_increment = (infoPtr->rcDraw.bottom - infoPtr->rcDraw.top) / 10.0; - infoPtr->left_offset = (infoPtr->rcDraw.right - infoPtr->rcDraw.left) - (infoPtr->width_increment * xdiv); - infoPtr->top_offset = (infoPtr->rcDraw.bottom - infoPtr->rcDraw.top) - (infoPtr->height_increment * 10.0); + GetTextExtentPoint32A(hdc, "00", 2, &size); - rcDraw->bottom = rcDraw->top + 10 * infoPtr->height_increment; - /* this is correct, the control does NOT expand vertically */ - /* like it does horizontally */ - /* make sure we don't move the controls bottom out of the client */ - /* area */ - /* title line has about 3 text heights, abrev days line, 6 weeksline and today circle line*/ - /*if((rcDraw->top + 9 * infoPtr->textHeight + 5) < rcDraw->bottom) { - rcDraw->bottom = rcDraw->top + 9 * infoPtr->textHeight + 5; - }*/ + xdiv = (dwStyle & MCS_WEEKNUMBERS) ? 8 : 7; + + infoPtr->width_increment = size.cx * 2; + infoPtr->height_increment = infoPtr->textHeight; + left_offset = (rcClient.right - rcClient.left) - (infoPtr->width_increment * xdiv); /* calculate title area */ - title->top = rcClient->top; - title->bottom = title->top + 2 * infoPtr->height_increment; - title->left = rcClient->left; - title->right = rcClient->right; + title->top = rcClient.top; + title->bottom = title->top + 3 * infoPtr->height_increment / 2; + title->left = left_offset; + title->right = rcClient.right; /* set the dimensions of the next and previous buttons and center */ /* the month text vertically */ - prev->top = next->top = title->top + 6; - prev->bottom = next->bottom = title->bottom - 6; - prev->left = title->left + 6; + prev->top = next->top = title->top + 4; + prev->bottom = next->bottom = title->bottom - 4; + prev->left = title->left + 4; prev->right = prev->left + (title->bottom - title->top) ; - next->right = title->right - 6; + next->right = title->right - 4; next->left = next->right - (title->bottom - title->top); /* titlemonth->left and right change based upon the current month */ @@ -1828,7 +1798,7 @@ static void MONTHCAL_UpdateSize(HWND hwnd) /* setup the dimensions of the rectangle we draw the names of the */ /* days of the week in */ - weeknumrect->left =infoPtr->left_offset; + weeknumrect->left = left_offset; if(dwStyle & MCS_WEEKNUMBERS) weeknumrect->right=prev->right; else @@ -1839,22 +1809,20 @@ static void MONTHCAL_UpdateSize(HWND hwnd) wdays->bottom = wdays->top + infoPtr->height_increment; days->top = weeknumrect->top = wdays->bottom ; - days->bottom = weeknumrect->bottom = days->top + 6 * infoPtr->height_increment; + days->bottom = weeknumrect->bottom = days->top + 6 * infoPtr->height_increment; - todayrect->left = rcClient->left; - todayrect->right = rcClient->right; + todayrect->left = rcClient.left; + todayrect->right = rcClient.right; todayrect->top = days->bottom; todayrect->bottom = days->bottom + infoPtr->height_increment; - /* uncomment for excessive debugging - TRACE("dx=%d dy=%d rcC[%d %d %d %d] t[%d %d %d %d] wd[%d %d %d %d] w[%d %d %d %d] t[%d %d %d %d]\n", + TRACE("dx=%d dy=%d client[%s] title[%s] wdays[%s] days[%s] today[%s]\n", infoPtr->width_increment,infoPtr->height_increment, - rcClient->left, rcClient->right, rcClient->top, rcClient->bottom, - title->left, title->right, title->top, title->bottom, - wdays->left, wdays->right, wdays->top, wdays->bottom, - days->left, days->right, days->top, days->bottom, - todayrect->left,todayrect->right,todayrect->top,todayrect->bottom); - */ + wine_dbgstr_rect(&rcClient), + wine_dbgstr_rect(title), + wine_dbgstr_rect(wdays), + wine_dbgstr_rect(days), + wine_dbgstr_rect(todayrect)); /* restore the originally selected font */ SelectObject(hdc, currentFont); @@ -1889,11 +1857,8 @@ MONTHCAL_Create(HWND hwnd, WPARAM wParam, LPARAM lParam) ERR( "could not allocate info memory!\n"); return 0; } - if((MONTHCAL_INFO*)GetWindowLongPtrW(hwnd, 0) != infoPtr) { - ERR( "pointer assignment error!\n"); - return 0; - } + infoPtr->hwndSelf = hwnd; infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);