#include<windows.h> #define IDM_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Magnifier") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT("This program requires Windows7 !"), szAppName, MB_OK) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT("Magnifier"), WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient, cxSource, cySource ; static int times ; POINT ptMouse, ptBegin; int cx, cy ; RECT rect ; HDC hdc, hdcDis ; PAINTSTRUCT ps ; switch (message) { case WM_CREATE: SetTimer (hwnd, IDM_TIMER, 100, NULL) ; GetWindowRect (hwnd, &rect) ; cx = rect.right - rect.left ; cy = rect.bottom - rect.top ; ptBegin.x = (GetSystemMetrics (SM_CXSCREEN) - cx) / 2 ; ptBegin.y = (GetSystemMetrics (SM_CYSCREEN) - cy) / 2 ; MoveWindow (hwnd, ptBegin.x, ptBegin.y, cx / 4, cy / 2, TRUE) ; times = 2 ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; if (times > 0) { cxSource = cxClient / times ; cySource = cyClient / times ; } return 0 ; case WM_LBUTTONDOWN: times++ ; if (times > 10) { times-- ; MessageBeep (-1) ; return 0 ; } cxSource = cxClient / times ; cySource = cyClient / times ; return 0 ; case WM_RBUTTONDOWN: times-- ; if (times < 1) { MessageBeep (-1) ; times++ ; return 0 ; } cxSource = cxClient / times ; cySource = cyClient / times ; return 0 ; case WM_TIMER: hdc = GetDC (hwnd) ; hdcDis = GetDC (NULL) ; GetCursorPos (&ptMouse) ; StretchBlt (hdc, 0, 0, cxClient, cyClient, hdcDis, ptMouse.x - cxSource / 2, ptMouse.y - cySource / 2, cxSource, cySource, SRCCOPY) ; ReleaseDC (hwnd, hdcDis) ; ReleaseDC (hwnd, hdc) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; hdcDis = GetDC (NULL) ; GetCursorPos (&ptMouse) ; StretchBlt (hdc, 0, 0, cxClient, cyClient, hdcDis, ptMouse.x - cxSource / 2, ptMouse.y - cySource / 2, cxSource, cySource, SRCCOPY) ; ReleaseDC (hwnd, hdcDis) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: KillTimer (hwnd, IDM_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
通过单击鼠标左右建来增加或减小放大倍数,放大范围为1倍到10倍。