边框绘制函数

Posted m-anonymous

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了边框绘制函数相关的知识,希望对你有一定的参考价值。

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

 




以上是关于边框绘制函数的主要内容,如果未能解决你的问题,请参考以下文章

边框绘制函数

使用片段着色器在特定位置绘制完美的水平线

怎样使用canvas绘制一个矩形

绘制没有底部边框的圆角矩形边框

如何绘制UILabel边框[重复]

尝试为 UITableViewCell 绘制虚线边框