简易版放大镜

#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倍。


你可能感兴趣的:(简易版放大镜)