+ switch (message) {
+ case WM_CREATE:
+ SetTimer(hWnd, 0, 200, NULL); // refresh display all 200 ms
+ break;
+
+ case WM_COMMAND:
+ if (!_CmdWndProc(hWnd, message, wParam, lParam)) {
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ break;
+
+ case WM_PAINT: {
+ PAINTSTRUCT ps;
+ HDC hdcMem;
+ RECT rect;
+ SIZE size;
+
+ BeginPaint(hWnd, &ps);
+ hdcMem = GetDC(GetDesktopWindow());
+
+ GetClientRect(hWnd, &rect);
+ size.cx = rect.right / s_factor;
+ size.cy = rect.bottom / s_factor;
+
+ StretchBlt(ps.hdc, 0, 0, size.cx*s_factor, size.cy*s_factor, hdcMem, s_srcPos.x, s_srcPos.y, size.cx, size.cy, SRCCOPY);
+
+ ReleaseDC(GetDesktopWindow(), hdcMem);
+ EndPaint(hWnd, &ps);
+ break;}
+
+ case WM_TIMER:
+ if (GetCapture() == hWnd) {
+ RECT rect;
+
+ int width = GetSystemMetrics(SM_CXSCREEN);
+ int height = GetSystemMetrics(SM_CYSCREEN);
+
+ GetClientRect(hWnd, &rect);
+
+ GetCursorPos(&s_srcPos);
+
+ s_srcPos.x -= rect.right / s_factor / 2;
+ s_srcPos.y -= rect.bottom / s_factor / 2;
+
+ if (s_srcPos.x < 0)
+ s_srcPos.x = 0;
+ else if (s_srcPos.x+rect.right/s_factor > width)
+ s_srcPos.x = width - rect.right/s_factor;
+
+ if (s_srcPos.y < 0)
+ s_srcPos.y = 0;
+ else if (s_srcPos.y+rect.bottom/s_factor > height)
+ s_srcPos.y = height - rect.bottom/s_factor;
+ }
+
+ InvalidateRect(hWnd, NULL, FALSE);