Bezier样条

本来以为暑假好好学习Windows程序设计第五版的,结果因为一些事耽误了,回到学校后,转专业后右到补修什么的,尽量抽时间来专攻吧,废话不说,开始吧

这里写图片描述

这就是贝塞尔(Bezier)样条,加上两条直线有助于理解,windows中有画Bezier样条的函数,就是PolyBezier;
不知道函数怎么用,可以查阅微软的官方帮助文档msdn,下面是msdn的解释
BOOL PolyBezier( HDC hdc, // handle to device context
CONST POINT* lppt, // endpoints and control points
DWORD cPoints // count of endpoints and control points);
windwos编程特点就是消息机制,主要是窗口过程,想到当时没接触过windows编程时,看windows程序设计第五版这本书是一头雾水,头都炸了,在这里要声明一下,感谢孙鑫老师,看了他的视频,在结合书,简直是如虎添翼啊
好了,贴上代码了

# include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int iCmdShow
    )
{
    WNDCLASS wndclass;

    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//这里用NULL表示使
    //用微软提供的图标
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //同上
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WndProc;
    wndclass.lpszClassName = TEXT("Bezier");
    wndclass.lpszMenuName = NULL;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wndclass);//注册窗口类

    HWND hwnd;
    hwnd = CreateWindow(TEXT("Bezier"), TEXT("Bezier Splines"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL, hInstance, NULL);
        //在窗口风格用或语句就可以加上滚动条了
    //cw_usedefault表示采用系统默认的值
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

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);
}

LRESULT CALLBACK WndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    static POINT apt[4];
    int cxClient, cyClient;
    HDC hdc;
    PAINTSTRUCT ps;

    switch (uMsg)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);

        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)//为什么要用wParam
        {
            hdc = GetDC(hwnd);

//当背景为白色使,用白色画笔就将上一次的用黑色画笔画的线条
            DrawBezier(hdc, apt);
             //擦除了,看起来的效果就是只有一条Bezier线条

            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));
//鼠标移动或按下左键或右键后,用黑色画笔画Bezier样条,上一次的样条被
//白色画笔画的样条覆盖了
            ReleaseDC(hwnd, hdc);
        }

        return 0;

    case WM_PAINT:
        //InvalidateRect(hwnd, NULL, TRUE);如果去掉注释,那些白色线条
        //不会消失

        hdc = BeginPaint(hwnd, &ps);

        DrawBezier(hdc, apt);//创建窗口时,会产生一个WM_PAINT消息,
        //所以程序已运行,就会看到一条Bezier样条

        EndPaint(hwnd, &ps);
        return 0;

    case WM_CLOSE:
        PostQuitMessage(0);
        //DestroyWindow(hwnd);
        return 0;

    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

把背景色改为灰色就很清楚了,如图
这里写图片描述

这里写图片描述

这里写图片描述
是不是很有趣,哈哈

SU贝兹曲线插件(BezierSpline)是一款多种方式绘制完美的曲线。此款为用户打造提供可以绘制常规的曲线,同时也具有断线焊接的功能,相信一定可以对你的工作提供便利的帮助,让你的效率更高。 贝兹曲线怎么用 画曲线和把断开的线合并,先说画曲线,你可以一个一个点,你就会明白了,画完右键点击完成就行,也可以右键在菜单中选择编辑,那样就可以做细调整。还有就是点击工具栏以后可以直接更改段数与最大控制点,也可以在画完以后更改,跟自带圆弧改段数一样;另外一个就是合并,选中断开曲线,右键转为贝兹,要是更改段数选中更改固定段数,按提示操作,最重要的还是多练习。 贝兹曲线插件介绍 一、手绘工具: 1、绘直线: 单条直线:单击起点,再单击终点, 连续直线:单击起点,再双击终点,再双击另一个终点。。。。。 2、绘曲线:按住鼠标左键不放,随意移动即可。 3、属性:线型,箭头,平滑度。 二、贝塞尔工具: 1、绘直线和折线:逐次单击。 2、绘曲线:按住鼠标左键不放,拖出控制线 3、用造型工具调整。 三、造型工具: 增加节点:1、双击直线任意部分(不是节点);2、点中直线任意部分,再点 减少节点:1、双击节点;2、选中节点,再点 结合节点:选中一个物体的两个节点,再点 断开节点:选中物体的一个或多个节点,再点 。   曲线转换为直线: 更新日志 版本1.6d新增功能 完美汉化 完善SketchUp2014版本支持; 规范命令名称,补充“固定段数多段线”、“编辑曲线”功能; 解决右键菜单重复载入的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值