mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:52:56 +00:00
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:
parent
93436d4b0f
commit
414cbcdc62
1 changed files with 54 additions and 35 deletions
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue