Bezier 样条曲线

Bezier 样条曲线使用四个点来定义:两个端点(起点和终点)和两个控点(用于使其不同程度地弯曲)。

绘制 Bezier 样条曲线

使用 PolyBezier 函数和 PolyBezierTo 函数可以绘制 Bezier 样条曲线:

BOOL PolyBezier(
HDC hdc, // 设备环境句柄
CONST POINT* lppt, // 端点和控制点(顺序是开始点、第一控点、第二控点、终点)
DWORD cPoints // 端点和控点的总数量
);
BOOL PolyBezierTo(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // 端点和控制点(顺序是第一控点、第二控点、终点)
DWORD cCount // 端点和控点的总数量
);

注:PolyBezierTo 函数把当前位置当做开始点,所以只需要给定其他三个点,函数返回时,当前位置将被设置为终点。

BEZIER 示例程序

#include <windows.h>

void DrawBezier(HDC hdc, POINT apt[]) {
PolyBezier(hdc, apt, ); MoveToEx(hdc, apt[].x, apt[].y, NULL);
LineTo(hdc, apt[].x, apt[].y); MoveToEx(hdc, apt[].x, apt[].y, NULL);
LineTo(hdc, apt[].x, apt[].y);
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc;
PAINTSTRUCT ps;
static int cxClient, cyClient;
static POINT apt[]; switch (message) {
case WM_SIZE: cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam); apt[].x = cxClient / ;
apt[].y = cyClient / ; apt[].x = cxClient * / ;
apt[].y = cyClient / ; apt[].x = cxClient * / ;
apt[].y = cyClient * / ; apt[].x = cxClient * / ;
apt[].y = cyClient / ; return ; case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON || wParam & MK_RBUTTON) {
hdc = GetDC(hwnd); SelectObject(hdc, GetStockObject(BLACK_PEN));
DrawBezier(hdc, apt); if (wParam & MK_LBUTTON) {
apt[].x = LOWORD(lParam);
apt[].y = HIWORD(lParam);
} if (wParam & MK_RBUTTON) {
apt[].x = LOWORD(lParam);
apt[].y = HIWORD(lParam);
} SelectObject(hdc, GetStockObject(WHITE_PEN));
DrawBezier(hdc, apt); ReleaseDC(hwnd, hdc);
} return ; case WM_PAINT:
InvalidateRect(hwnd, NULL, TRUE);
hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, GetStockObject(WHITE_PEN));
DrawBezier(hdc, apt); EndPaint(hwnd, &ps);
return ; case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPCTSTR lpszClassName = TEXT("BezierDemo");
LPCTSTR lpszWindowName = TEXT("Bezier Demo");
WNDCLASS wndclass;
HWND hwnd;
MSG msg; wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = lpszWindowName;
wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), lpszWindowName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(
lpszClassName,
lpszWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
); ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}

最新文章

  1. 从网上找的 visual studio 的各个版本下载地址,vs2010/vs2012/vs2013带注册码
  2. Java垃圾回收机制 入门
  3. .Net实现拉勾网爬虫
  4. Unity2D 背景图铺满与Camera.Size的计算公式
  5. 写XML配置文件时的一个乱码问题
  6. Spring配置项&lt;context:annotation-config/&gt;说明
  7. Eclipse将android项目打包jar文件
  8. ASP.NET Web API 文件產生器 - 使用 Swagger
  9. redis知识
  10. IO库 8.4
  11. 旋转关节(Revolute Joint)
  12. Servlet之过滤器(Filter)和监听器(Listener)
  13. JS原生Ajax&amp;Jquery的Ajax技术&amp;Json
  14. css 超出规定行数自动隐藏
  15. 比MR至少快5倍的神器,竟然是它
  16. [转]Spark学习之路 (三)Spark之RDD
  17. 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)
  18. eclipse回退到上个版本
  19. Oracle-检查原因并重新编译无效的存储过程
  20. 【小程序】component使用

热门文章

  1. Spring Boot-定义拦截器(七)
  2. mongodb--find高级用法
  3. Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点(一)
  4. Android Studio Mac 快捷键整理分享
  5. oc09--NSString
  6. open Command window here
  7. [POJ 3345] Bribing FIPA
  8. Juniper交换机维护
  9. Netty简单介绍(非原创)
  10. window 10 多版本激活工具