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;
hBmp = CreateCompatibleBitmap(hdc,
pClockData->cxClient,
pClockData->cyClient);
if (hBmp)
{
HBRUSH hWinBrush, hWinBrushOld;
INT oldMap;
POINT oldOrg;
dcMem = CreateCompatibleDC(hdc); hBmpOld = SelectObject(hdcMem, hBmp);
bmMem = CreateCompatibleBitmap(hdc, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top);
bmOld = SelectObject(dcMem, bmMem); hWinBrush = GetSysColorBrush(COLOR_BTNFACE);
SetViewportOrgEx(dcMem, -ps.rcPaint.left, -ps.rcPaint.top, NULL); hWinBrushOld = SelectObject(hdcMem, hWinBrush);
FillRect(dcMem, &ps.rcPaint, GetSysColorBrush(COLOR_BTNFACE)); PatBlt(hdcMem,
0,
0,
pClockData->cxClient,
pClockData->cyClient,
PATCOPY);
SetIsotropic(dcMem, pClockData); oldMap = SetMapMode(hdcMem, MM_ISOTROPIC);
DrawClock(dcMem, pClockData); SetViewportOrgEx(hdcMem,
DrawHands(dcMem, &pClockData->stPrevious, TRUE); pClockData->cxClient / 2,
pClockData->cyClient / 2,
/* Blit the changes to the screen */ &oldOrg);
BitBlt(hdc,
ps.rcPaint.left, ps.rcPaint.top, DrawClock(hdcMem, pClockData);
ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, DrawHands(hdcMem, &pClockData->stPrevious, TRUE);
dcMem,
ps.rcPaint.left, ps.rcPaint.top, SetMapMode(hdcMem, oldMap);
SRCCOPY); SetViewportOrgEx(hdcMem, oldOrg.x, oldOrg.y, NULL);
BitBlt(hdc,
0,
0,
pClockData->cxClient,
pClockData->cyClient,
hdcMem,
0,
0,
SRCCOPY);
SelectObject(hdcMem, hWinBrushOld);
SelectObject(hdcMem, hBmpOld);
DeleteObject(hBmp);
}
DeleteDC(hdcMem);
}
SelectObject(dcMem, bmOld);
DeleteObject(bmMem);
DeleteObject(dcMem);
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: