Win 32 绘制贝塞尔曲线

概述

一条二维的贝塞尔曲线由四个点定义——两个端点和两个控制点。在这个程序中,两个顶点设定在显示区域的上下居中、左右位于 1 / 4 和 3 / 4 处的位置,两个控制点可以改变,按住滑鼠左键或右键并拖动滑鼠可以分别改动两个控制点之一。

代码

// ----------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	// 起点、第一个控制点、第二个控制点和终点
	static POINT apt[4];
	int	cxClient, cyClient;
	HDC				hdc;
	PAINTSTRUCT		ps;

	switch (message)
	{
		case WM_SIZE:					// 当主窗口的客户区部分大小改变时,应用程序接收到 WM_SIZE 消息
			cxClient = LOWORD(lParam);  // 得到一个 32 bit 数的低 16 bit 
			cyClient = HIWORD(lParam);  // 得到一个 32 bit 数的高 16 bit 
			apt[0].x = cxClient / 4;
			apt[0].y = cyClient / 2;

			apt[1].x = cxClient / 2;
			apt[1].y = cyClient / 4;

			apt[2].x = cxClient / 2;
			apt[2].y = 3 * cyClient / 4;

			apt[3].x = 3 * cxClient / 4;
			apt[3].y = cyClient / 2;
			return 0;
	
		case WM_LBUTTONDOWN: // 点击鼠标左键的消息
		case WM_RBUTTONDOWN:
		case WM_MOUSEMOVE: // 鼠标移动
			if (wParam & MK_LBUTTON || wParam & MK_RBUTTON)
			{
				hdc = GetDC(hWnd);
				SelectObject(hdc, GetStockObject(WHITE_PEN));
				DrawBezier(hdc, apt);

				if (wParam & MK_LBUTTON)
				{
					apt[1].x = LOWORD(lParam);
					apt[1].y = HIWORD(lParam);
				}
				if (wParam & MK_RBUTTON) 
				{
					apt[2].x = LOWORD(lParam); 
					apt[2].y = HIWORD(lParam);
				}
				SelectObject(hdc, GetStockObject(BLACK_PEN)); 
				DrawBezier(hdc, apt); 
				ReleaseDC(hWnd, hdc);
			}
			return 0;
		
		case WM_PAINT:
			InvalidateRect(hWnd, NULL, TRUE);
			hdc = BeginPaint(hWnd, &ps);
			DrawBezier(hdc, apt);
			EndPaint(hWnd, &ps);
			return 0;

		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		}
	return DefWindowProc(hWnd, message, wParam, lParam);
}

// ----------------------------------
void DrawBezier(HDC hdc, POINT apt[])
{
	PolyBezier(hdc, apt, 4);
	
	MoveToEx(hdc, apt[0].x, apt[0].y, NULL);
	LineTo(hdc, apt[1].x, apt[1].y);
	MoveToEx(hdc, apt[2].x, apt[2].y, NULL);
	LineTo(hdc, apt[3].x, apt[3].y);
}

贝塞尔曲线示意图

Win 32 绘制贝塞尔曲线_第1张图片

参考资料

  • Windows 程序设计:第5版 - 豆瓣读书

你可能感兴趣的:(Win 32 绘制贝塞尔曲线)