贝塞尔样条曲线

//
//panda
//2012-11-15
//

#include<Windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[]=TEXT("Bezier");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WndProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_VREDRAW|CS_HREDRAW;


	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("Program requires Windows NT!"),szAppName,MB_ICONERROR);
		return 0;
	}

	hwnd=CreateWindow(szAppName,TEXT("Bezier Splines"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

	ShowWindow(hwnd,iCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,hwnd,NULL,NULL))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;


}


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 message,WPARAM wParam,LPARAM lParam)
{
	static POINT apt[4];
	HDC hdc;
	int cxClient,cyClient;
	PAINTSTRUCT ps;

	switch(message)
	{
	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)
		{
			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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值