Please test your code before you ruin mine.

It's annoying fixing other peoples mess in your own code.

See issue #3701 for more details.

svn path=/trunk/; revision=35937
This commit is contained in:
Ged Murphy 2008-09-04 15:13:07 +00:00
parent 93436d4b0f
commit 414cbcdc62

View file

@ -28,16 +28,6 @@ typedef struct _CLOCKDATA
static const WCHAR szClockWndClass[] = L"ClockWndClass"; static const WCHAR szClockWndClass[] = L"ClockWndClass";
static VOID
SetIsotropic(HDC hdc, PCLOCKDATA pClockData)
{
/* set isotropic mode */
SetMapMode(hdc, MM_ISOTROPIC);
/* position axis in centre of window */
SetViewportOrgEx(hdc, pClockData->cxClient / 2, pClockData->cyClient / 2, NULL);
}
static VOID static VOID
RotatePoint(POINT pt[], INT iNum, INT iAngle) RotatePoint(POINT pt[], INT iNum, INT iAngle)
{ {
@ -141,8 +131,7 @@ ClockWndProc(HWND hwnd,
LPARAM lParam) LPARAM lParam)
{ {
PCLOCKDATA pClockData; PCLOCKDATA pClockData;
HDC hdc, dcMem; HDC hdc, hdcMem;
HBITMAP bmMem, bmOld;
PAINTSTRUCT ps; PAINTSTRUCT ps;
pClockData = (PCLOCKDATA)GetWindowLongPtrW(hwnd, GWLP_USERDATA); pClockData = (PCLOCKDATA)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
@ -169,38 +158,68 @@ ClockWndProc(HWND hwnd,
case WM_TIMER: case WM_TIMER:
GetLocalTime(&pClockData->stCurrent); GetLocalTime(&pClockData->stCurrent);
//InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
InvalidateRect(hwnd, NULL, FALSE);
pClockData->stPrevious = pClockData->stCurrent; pClockData->stPrevious = pClockData->stCurrent;
break; break;
case WM_PAINT: case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); hdc = BeginPaint(hwnd, &ps);
/* Use an offscreen dc to avoid flicker */ hdcMem = CreateCompatibleDC(hdc);
if (hdcMem)
{
HBITMAP hBmp, hBmpOld;
dcMem = CreateCompatibleDC(hdc); hBmp = CreateCompatibleBitmap(hdc,
bmMem = CreateCompatibleBitmap(hdc, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top); pClockData->cxClient,
pClockData->cyClient);
if (hBmp)
{
HBRUSH hWinBrush, hWinBrushOld;
INT oldMap;
POINT oldOrg;
bmOld = SelectObject(dcMem, bmMem); hBmpOld = SelectObject(hdcMem, hBmp);
SetViewportOrgEx(dcMem, -ps.rcPaint.left, -ps.rcPaint.top, NULL);
FillRect(dcMem, &ps.rcPaint, GetSysColorBrush(COLOR_BTNFACE));
SetIsotropic(dcMem, pClockData); hWinBrush = GetSysColorBrush(COLOR_BTNFACE);
DrawClock(dcMem, pClockData); hWinBrushOld = SelectObject(hdcMem, hWinBrush);
DrawHands(dcMem, &pClockData->stPrevious, TRUE); PatBlt(hdcMem,
0,
0,
pClockData->cxClient,
pClockData->cyClient,
PATCOPY);
oldMap = SetMapMode(hdcMem, MM_ISOTROPIC);
SetViewportOrgEx(hdcMem,
pClockData->cxClient / 2,
pClockData->cyClient / 2,
&oldOrg);
DrawClock(hdcMem, pClockData);
DrawHands(hdcMem, &pClockData->stPrevious, TRUE);
SetMapMode(hdcMem, oldMap);
SetViewportOrgEx(hdcMem, oldOrg.x, oldOrg.y, NULL);
/* Blit the changes to the screen */
BitBlt(hdc, BitBlt(hdc,
ps.rcPaint.left, ps.rcPaint.top, 0,
ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, 0,
dcMem, pClockData->cxClient,
ps.rcPaint.left, ps.rcPaint.top, pClockData->cyClient,
hdcMem,
0,
0,
SRCCOPY); SRCCOPY);
SelectObject(dcMem, bmOld); SelectObject(hdcMem, hWinBrushOld);
DeleteObject(bmMem); SelectObject(hdcMem, hBmpOld);
DeleteObject(dcMem); DeleteObject(hBmp);
}
DeleteDC(hdcMem);
}
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
break; break;
@ -226,7 +245,7 @@ ClockWndProc(HWND hwnd,
CopyMemory(&pClockData->stPrevious, (LPSYSTEMTIME)lParam, sizeof(SYSTEMTIME)); CopyMemory(&pClockData->stPrevious, (LPSYSTEMTIME)lParam, sizeof(SYSTEMTIME));
/* Redraw the clock */ /* Redraw the clock */
InvalidateRect(hwnd, NULL, FALSE); InvalidateRect(hwnd, NULL, TRUE);
break; break;
default: default: