From 41a113e0ce47055b7734413df81f99a6b3b5dc76 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 2 Apr 2011 13:15:42 +0400 Subject: [PATCH] comctl32/monthcal: Cache pens, fix line colour. --- dlls/comctl32/monthcal.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 2fa1425226e..bdc6a453ccc 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -76,6 +76,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(monthcal); /* convert from days to 100 nanoseconds unit - used as FILETIME unit */ #define DAYSTO100NSECS(days) (((ULONGLONG)(days))*24*60*60*10000000) +enum CachedPen +{ + PenRed = 0, + PenText, + PenLast +}; + /* single calendar data */ typedef struct _CALENDAR_INFO { @@ -96,6 +103,7 @@ typedef struct COLORREF colors[MCSC_TRAILINGTEXT+1]; HBRUSH brushes[MCSC_MONTHBK+1]; + HPEN pens[PenLast]; HFONT hFont; HFONT hBoldFont; @@ -639,15 +647,13 @@ static BOOL MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st) /* draw today boundary box for specified rectangle */ static void MONTHCAL_Circle(const MONTHCAL_INFO *infoPtr, HDC hdc, const RECT *r) { - HPEN red_pen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); - HPEN old_pen = SelectObject(hdc, red_pen); + HPEN old_pen = SelectObject(hdc, infoPtr->pens[PenRed]); HBRUSH old_brush; old_brush = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, r->left, r->top, r->right, r->bottom); SelectObject(hdc, old_brush); - DeleteObject(red_pen); SelectObject(hdc, old_pen); } @@ -788,6 +794,7 @@ static void MONTHCAL_PaintWeeknumbers(const MONTHCAL_INFO *infoPtr, HDC hdc, con INT i, prev_month; SYSTEMTIME st; WCHAR buf[80]; + HPEN old_pen; RECT r; if (!(infoPtr->dwStyle & MCS_WEEKNUMBERS)) return; @@ -883,8 +890,10 @@ static void MONTHCAL_PaintWeeknumbers(const MONTHCAL_INFO *infoPtr, HDC hdc, con } /* line separator for week numbers column */ + old_pen = SelectObject(hdc, infoPtr->pens[PenText]); MoveToEx(hdc, infoPtr->calendars[calIdx].weeknums.right, infoPtr->calendars[calIdx].weeknums.top + 3 , NULL); LineTo(hdc, infoPtr->calendars[calIdx].weeknums.right, infoPtr->calendars[calIdx].weeknums.bottom); + SelectObject(hdc, old_pen); } /* bottom today date */ @@ -991,6 +1000,7 @@ static void MONTHCAL_PaintCalendar(const MONTHCAL_INFO *infoPtr, HDC hdc, const RECT r, fill_bk_rect; SYSTEMTIME st; WCHAR buf[80]; + HPEN old_pen; int mask; /* fill whole days area - from week days area to today note rectangle */ @@ -1001,10 +1011,12 @@ static void MONTHCAL_PaintCalendar(const MONTHCAL_INFO *infoPtr, HDC hdc, const FillRect(hdc, &fill_bk_rect, infoPtr->brushes[MCSC_MONTHBK]); /* draw line under day abbreviations */ + old_pen = SelectObject(hdc, infoPtr->pens[PenText]); MoveToEx(hdc, infoPtr->calendars[calIdx].days.left + 3, infoPtr->calendars[calIdx].title.bottom + infoPtr->textHeight + 1, NULL); LineTo(hdc, infoPtr->calendars[calIdx].days.right - 3, infoPtr->calendars[calIdx].title.bottom + infoPtr->textHeight + 1); + SelectObject(hdc, old_pen); prev_month = date->wMonth - 1; if (prev_month == 0) prev_month = 12; @@ -1137,6 +1149,13 @@ MONTHCAL_SetColor(MONTHCAL_INFO *infoPtr, UINT index, COLORREF color) infoPtr->brushes[index] = CreateSolidBrush(color); } + /* update cached pen */ + if (index == MCSC_TEXT) + { + DeleteObject(infoPtr->pens[PenText]); + infoPtr->pens[PenText] = CreatePen(PS_SOLID, 1, infoPtr->colors[index]); + } + InvalidateRect(infoPtr->hwndSelf, NULL, index == MCSC_BACKGROUND ? TRUE : FALSE); return prev; } @@ -2540,6 +2559,9 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs) infoPtr->brushes[MCSC_TITLEBK] = CreateSolidBrush(infoPtr->colors[MCSC_TITLEBK]); infoPtr->brushes[MCSC_MONTHBK] = CreateSolidBrush(infoPtr->colors[MCSC_MONTHBK]); + infoPtr->pens[PenRed] = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); + infoPtr->pens[PenText] = CreatePen(PS_SOLID, 1, infoPtr->colors[MCSC_TEXT]); + infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; infoPtr->calendars[0].month = infoPtr->todaysDate; @@ -2566,6 +2588,8 @@ fail: static LRESULT MONTHCAL_Destroy(MONTHCAL_INFO *infoPtr) { + INT i; + /* free month calendar info data */ Free(infoPtr->monthdayState); Free(infoPtr->calendars); @@ -2577,6 +2601,9 @@ MONTHCAL_Destroy(MONTHCAL_INFO *infoPtr) DeleteObject(infoPtr->brushes[MCSC_TITLEBK]); DeleteObject(infoPtr->brushes[MCSC_MONTHBK]); + for (i = PenRed; i < PenLast; i++) + DeleteObject(infoPtr->pens[i]); + Free(infoPtr); return 0; }