windows程式設計(7):繪製貝茲路徑

來源:互聯網
上載者:User
#include <windows.h>#include <math.h>#define NUM 1000#define TWOPI (2*3.14159)LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,//當前執行個體控制代碼   HINSTANCE hPrevInstance, //先前執行個體控制代碼   LPSTR lpCmdLine,//命令列   int iCmdShow)//顯示狀態{static TCHAR szAppName[] = TEXT("Bezier");//視窗控制代碼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)){return -1;}//建立視窗hwnd = CreateWindow(szAppName,//視窗類別的名稱,必須是已經註冊的TEXT("貝塞爾函數"),//視窗標題WS_OVERLAPPEDWINDOW,//視窗風格CW_USEDEFAULT,//X座標CW_USEDEFAULT,//Y座標CW_USEDEFAULT,//寬度CW_USEDEFAULT,//高度NULL,//父視窗控制代碼NULL,//菜單視窗控制代碼hInstance,//進階版本的windos忽略NULL);//顯示視窗//ShowWindow(hwnd,SW_SHOWNA);ShowWindow (hwnd, iCmdShow);//更新視窗UpdateWindow(hwnd);//訊息迴圈while(GetMessage(&msg,NULL,0,0)){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){HDC hdc;PAINTSTRUCT ps;int i,j;static int cxClient,cyClient;static POINT apt[4] ;switch(message){case WM_SIZE:cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);//4個點分別是起點,第一控制點,第二控制點。終點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_RBUTTONUP: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, CreatePen (PS_DASH, 0, RGB (255, 0, 0))) ;//畫曲線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);}

在windows中,使用PolyBezier函數繪製貝茲路徑。

程式中要注意的是:WM_MOUSEMOVE下的訊息處理方式:先用白色的畫筆畫曲線,再用黑色的畫筆畫曲線,這樣就做出了皮筋一樣的效果:第一條曲線實際上是隨著滑鼠運動而產生的軌跡,不是我們想要的結果,我們想要的是最後移動到位置時的曲線,所以最後才用我們自訂的筆(這裡定義為紅色,虛線)畫圖。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.