函数 Rectangle ,Ellipse, RoundRect 介绍:
Rectangle() 功能:该函数画一个矩形,可以用当前的画笔画矩形轮廓,用当前画刷进行填充 (默认画刷为白色)。
Ellipse() 功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心。
使用当前画笔画椭圆,用当前的画刷填充椭圆 (默认画刷为白色)
RoundRect() 功能:该函数画一个带圆角的矩形,此矩形由当前画笔画轮廓,由当前画刷填充 (默认画刷为白色)。
Rectangle() 原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) ;
Ellipse() 原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) ;
RoundRect() 原型:BOOL RoundRect(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,
int nWidth, int nHeight);
参数:
hdc:设备环境句柄。
(nLeftRect, nTopRect):指定矩形左上角逻辑坐标。
(nRightRect, nBottomRect):指定矩形右下角的逻辑坐标。
nWidth:指定用来画圆角的椭圆的宽。
nHeight:指定用来画圆角的椭圆的高。
返回值:如果函数调用成功,返回值非零;如果函数调用失败,返回值是0。
函数 Arc, Chord, Pie 介绍:
Arc() 原型:BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,
int xStart, int yStart, int xEnd, int yEnd);
Chord() 原型:BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,
int xStart, int yStart, int xEnd, int yEnd);
Pie() 原型:BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect,
int xStart, int yStart, int xEnd, int yEnd);
Arc() 功能:画一条椭圆弧线,从 (xStart, yStart) 连接到 (xEnd, yEnd) (实线)。
点 (xStart, yStart), (xEnd, yEnd) 分别连接到椭圆中心 (虚线)。
Chord() 功能:画一条椭圆弧线,从 (xStart, yStart) 连接到 (xEnd, yEnd) (实线)。
点 (xStart, yStart), (xEnd, yEnd) 相连接(实线)。
点 (xStart, yStart), (xEnd, yEnd) 分别连接到椭圆中心 (虚线)。
Pie() 功能:画一条椭圆弧线,从 (xStart, yStart) 连接到 (xEnd, yEnd) (实线)。
点 (xStart, yStart), (xEnd, yEnd) 分别连接到椭圆中心 (实线)。
参数:
(xStart,yStart): 起点的逻辑坐标。
(xEnd,yEnd):终点的逻辑坐标。
LineDemo代码:
#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 ("LineDemo") ; 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)) { MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Line Demonstration"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient ; HDC hdc ; PAINTSTRUCT ps ; switch (message) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; Rectangle (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; MoveToEx (hdc, 0, 0, NULL) ; LineTo (hdc, cxClient, cyClient) ; MoveToEx (hdc, 0, cyClient, NULL) ; LineTo (hdc, cxClient, 0) ; Ellipse (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; RoundRect (hdc, cxClient / 4, cyClient / 4, 3 * cxClient / 4, 3 * cyClient / 4, cxClient / 4, cyClient / 4) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
函数 PolyBezier, PolyBezierTo 介绍:
功能:函数 PolyBezier 和 PolyBezier 用于绘制贝塞尔曲线 。
PolyBezier() 原型:BOOL PolyBezier(HDC hdc, CONST POINT *lppt, DWORD cPoints);
PolyBezierTo() 原型:BOOL PolyBezier(HDC hdc, CONST POINT *lppt, DWORD cPoints);
参数:
hdc:指定的设备环境句柄。
lppt:POINT结构数组的指针,包括了样条端点和控制点的坐标。
其顺序是起点的坐标、起点的控制点的坐标、终点的控制点的坐标和终点的坐标。
cPoints:指明数组中的点的个数。
Bezier 代码:
#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.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)) { 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, 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) { 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) ; }
原文地址:https://www.cnblogs.com/M-Anonymous/p/9302980.html