zoukankan      html  css  js  c++  java
  • API之绘图(转)

    组成GDI的几百个函数呼叫可以分为几大类:

    1取得(或者建立)和释放(或者清除)设备内容的函数

    取得有关设备内容信息的函数

    绘图函数

    设定和取得设备内容参数的函数

    使用GDI对象的函数

    GDI基本图形

        您在屏幕或打印机上显示的图形型态本身可以被分为几类,通常被称为「基本图形」,它们是:

    1、直线和曲线

    2、填区域当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷对象进行填图。这个画刷可以是实心色彩、图案(可以是一系列的水平、垂直或者对角标记)或者是在区域内垂直或者水平重复的位图图像。

    3位图

    4、文字

     

    获取设备描述表的方(即获得DC)

    1、在处理WM_PAINT消息时,使用BeginPaint 和 EndPaint

       hdc = BeginPaint ( hwnd , & ps ) ;

       ...........................

       EndPaint ( hwnd , & ps ) ;

      变量ps是型态为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint传回的设备内

      容句柄。 PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定

      义一个包围窗口显示区域无效范围的矩形。使用从BeginPaint获得的设备内容句柄,只能

      在这个区域内绘图。BeginPaint呼叫使该区域有效

     

    2、在处理非WM_PAINT 消息时

       hdc=GetDC(hwnd) ;

       ...............................

       ReleaseDC( hwnd , hdc ) ;

       这个设备内容适用于窗口句柄为hwnd的显示区域。这些呼叫与BeginPaint和EndPaint   

       的组合之间的基本区别是,利用从GetDC传回的句柄可以在整个显示区域上绘图。当然, 

       GetDC和ReleaseDC不使显示区域中任何可能的无效区域变成有效

       Windows程序还可以取得适用于整个窗口(而不仅限于窗口的显示区域)的设备内容句

       柄:

     

       hdc = GetWindowDC (hwnd) ; 

       .....................

             

       ReleaseDC (hwnd, hdc) ; 

       这个设备内容除了显示区域之外,还包括窗口的标题列、菜单、滚动条和框架(frame)。

       GetWindowDC函数很少使用,如果想尝试用一用它,则必须拦截处理WM_NCPAINT消

       ,Windows使用该消息在窗口的非显示区域上绘图。

    3、CreateDC

       取得设备内容句柄的另一个更通用的函数是CreateDC

       例如,您可以通过下面的呼叫来取得整个屏幕的设备内容句柄:

       hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; 

     

     

     

    其它部分

    1、映像模式和变换

    2、MetafileMetafile是以二进制形式储存的GDI命令集合。

    3、区域绘图区域是形状任意的复杂区域,通常定义为较简单的绘图区域组合。在GDI内部,绘图区域除了储存为最初用来定义绘图区域的线条组合以外,还以一系列扫描线的形式储存。您可以将绘图区域用于绘制轮廓、填入图形和剪裁。

    4路径路径是GDI内部储存的直线和曲线的集合。路径可以用于绘图、填入图形和剪裁,还可以转换为绘图区域

    5、剪裁绘图可以限制在显示区域的某一部分中,这就是所谓的剪裁。剪裁区域是不是矩形都可以,剪裁通常是通过区域或者路径来定义的。

    6、调色盘自订调色盘通常限于显示256色的显示器。Windows仅保留这些色彩之中的20种以供系统使用,您可以改变其它236种色彩,以准确显示按位图形式储存的真实图像。第十六章会讨论调色盘。

      

    7、打印虽然本章限于讨论视讯显示,但是您在本章中所学到的全部知识都适用于打印。

    画线函数

    7、画线函数

    Windows可以画直线、椭圆线(椭圆圆周上的曲线)和贝塞尔曲线。Windows 98支援的7个画线函数是:

    LineTo 画直线。

      

    Polyline和PolylineTo 画一系列相连的直线。

      

    PolyPolyline 画多组相连的线。

      

    Arc 画椭圆线。

      

    PolyBezier和PolyBezierTo 画贝塞尔曲线。

      

    另外,Windows NT还支持3种画线函数:

    ArcTo和AngleArc 画椭圆线。

      

    PolyDraw 画一系列相连的线以及贝塞尔曲线。

      

    这三个函数Windows 98不支援。

    8、画带边缘的填入图形的函数

    Windows中七个用来画带边缘的填入图形的函数列于表5-3中。

    表5-3

     

    函数

    图形

    Rectangle

    直角矩形

    Ellipse

    椭圆

    RoundRect

    圆角矩形

    Chord

    椭圆周上的弧,两端以弦连接

    Pie

    椭圆上的饼图

    Polygon

    多边形

    PolyPolygon

    多个多边形

    9、使用画笔

         画笔决定线的色彩、宽度和线型

         画笔句柄  HPEN 

         使用现有画笔 Stock Pens

         Windows提供三种现有画笔:BLACK_PEN , WHITE_PEN ,NULL_PEN

       调用GetStockObject 可以获得现有的画笔

         hPen =GetStockObject(BLACK_PEN)  ;

         将画笔选进设备DC

         SelectObject(hdc ,hPen) ;

         创建画笔

         hPen = CreatePen(iPenStyle , iWidth , crColor) ;

    10、使用画刷

    画刷定义:画刷是一个8×8的位图它水平和垂直地重复使用来填充内部区域。它是GDI对  

              象之一。

    画刷句柄:HBRUSH

    创建画刷对象:???透明画刷????背景方式P158transparent???

        (1) 创建一个颜色逻辑画刷,填充满所有填充的对象

            hBrush=CreateSolidBrush(color);

        (2) 创建影线逻辑画刷 

            hBrush=CreateHatchBrush(iHatchStyle,crColor);

            Hatch marks=影线标记

        (3) 间接创建逻辑画刷

           hBrush=CreateBrushIndirect(&logbrush);

           Logbrush=逻辑画刷;

         typedef struct tag LOGBRUSH { /* lb */ 

                    UINT     lbStyle; 

                    COLORREF lbColor; 

                    LONG     lbHatch; 

                    } LOGBRUSH; 

     

         (4)选择windows内部的画刷

           GetStockObject(index));

           在这里stock是储存品的意思,即选择一个已经在windows中定义好的对象。

           7种常用的在windows中定义好的画刷

           BLACE_BRUSH,...WHITEBRUSH,NULL_BRUSH(透明刷子),HOLLOW_BRUSH(空心刷子)

     

           

     将创建的逻辑画刷选入设备描述表

           SelectObject(hdd,bBrush);

     删除创建的逻辑画刷

          DeleteObject(hBrush);

    注意:不要删除当前设备描述表中的画刷。

    获得画刷信息:

        GetObject(hBrush,sizeof(LOGBRUSH),(LPVOID&logbrush));

    1. 实例APIDRAW004各种画刷的创建包括透明画刷  
    2. #include <windows.h>   
    • LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
    • HBRUSH  hbruhT[24];  
    • RECT    rectALL[4][6];//四排六列   
    • LOGBRUSH logB;  
    • int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
    •                     PSTR szCmdLine, int iCmdShow)  
    • {  
    •      static TCHAR szAppName[] = TEXT ("HelloWin") ;  
    •      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 ("This program requires Windows NT!"),   
    •                       szAppName, MB_ICONERROR) ;  
    •           return 0 ;  
    •      }  
    •        
    •      hwnd = CreateWindow (szAppName,                  // window class name   
    •                           TEXT ("The Hello Program"), // window caption   
    •                           WS_OVERLAPPEDWINDOW,        // window style   
    •                           CW_USEDEFAULT,              // initial x position   
    •                           CW_USEDEFAULT,              // initial y position   
    •                           CW_USEDEFAULT,              // initial x size   
    •                           CW_USEDEFAULT,              // initial y size   
    •                           NULL,                       // parent window handle   
    •                           NULL,                       // window menu handle   
    •                           hInstance,                  // program instance handle   
    •                           NULL) ;                     // creation parameters   
    •        
    •      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)  
    • {  
    •      HDC         hdc ;  
    •      PAINTSTRUCT ps ;  
    •      RECT        rect ;  
    •      int         i,j,ix,iy;  
    •        
    •      switch (message)  
    •      {  
    •      case WM_CREATE:  
    •          /* 
    •           for(i=0;i<24;i++) 
    •           { 
    •               hbruhT[i]=CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256)); 
    •           } 
    •           //ABC:证明已正确创建矩形 
    •           */  
    •           //创建画刷   
    •           hbruhT[0]=GetStockObject(GRAY_BRUSH);//系统定义的灰画刷   
    •           //创建一个颜色逻辑画刷,填充满所有填充的对象   
    •           hbruhT[1]=CreateSolidBrush(RGB(72,228,208));//颜色为青色   
    •           //创建影线逻辑画刷   
    •           hbruhT[2]=CreateHatchBrush(HS_DIAGCROSS,RGB(161,246,157));//草绿色   
    •           //利用LOGBRUSH结构创建画刷   
    •           logB.lbStyle=BS_SOLID ;  
    •           logB.lbColor=RGB(176,141,247);//淡紫色   
    •           //logB.lbHatch=NULL;   
    •           hbruhT[3]=CreateBrushIndirect(&logB);  
    •           //创建透明画刷   
    •           hbruhT[4]=GetStockObject(NULL_BRUSH);  
    •           return 0 ;  
    •      case WM_SIZE:  
    •           ix= LOWORD (lParam) ;  
    •           iy= HIWORD (lParam) ;  
    •           //创建所有矩形   
    •           for(i=0;i<6;i++)  
    •               for(j=0;j<4;j++)  
    •           SetRect( & rectALL[j][i],i*ix/6,j*iy/4,(i+1)*ix/6,(j+1)*iy/4);  
    •           return 0;  
    •      case WM_PAINT:  
    •           hdc = BeginPaint (hwnd, &ps) ;  
    •           //灰画刷填充矩形   
    •           FillRect(hdc,&rectALL[0][0], hbruhT[0]);//i=raw,j=column   
    •           //青色画刷   
    •           FillRect(hdc,&rectALL[0][1], hbruhT[1]);  
    •           //草绿色影线   
    •           FillRect(hdc,&rectALL[0][2], hbruhT[2]);  
    •           //淡紫色   
    •           FillRect(hdc,&rectALL[0][3], hbruhT[3]);  
    •           //测试透明画刷   
    •           FillRect(hdc,&rectALL[1][0], hbruhT[2]);  
    •           FillRect(hdc,&rectALL[1][1], hbruhT[3]);  
    •           FillRect(hdc,&rectALL[1][2], hbruhT[0]);  
    •           FillRect(hdc,&rectALL[1][3], hbruhT[1]);  
    •           SelectObject(hdc,hbruhT[4]);  
    •           Rectangle(hdc,20,20,300,300);  
    •             
    •           /* 
    •           for(i=0;i<4;i++) 
    •               for(j=0;j<6;j++) 
    •           { 
    •           FillRect(hdc,&rectALL[i][j], hbruhT[i*6+j]); 
    •           } 
    •           //ABC:证明已正确创建矩形 
    •           */  
    •             
    •           EndPaint (hwnd, &ps) ;  
    •           return 0 ;  
    •             
    •      case WM_DESTROY:  
    •           PostQuitMessage (0) ;  
    •           return 0 ;  
    •      }  
    •      return DefWindowProc (hwnd, message, wParam, lParam) ;  
    • }  

    9、两种填充方法ALTERNATE 和WINDING

    说明:在默认情况下,多边形填入方式是ALTERNATE

       “ALTERNATE和WINDING方式之间的区别很容易察觉。对于ALTERNATE方式,您可以设想从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填入封闭区域。”封闭区域指多边形中,一个或多个子封闭区域的一个。假想线需达到所有封闭区域的外部。可以从图形学算法角度理解这种判断方法

        “在WINDING方式下要确定一个封闭区域是否被填入,您仍旧可以设想从那个无穷大的区域画线。如果假想的线穿过了奇数条边界线,区域就被填入,这和ALTERNATE方式一样。”绘制多边形时,是一点接一点绘制的,可以以点的先后顺序定义边的方法。

    实例APIDRAW001设置填充模式绘制五角星

    1. #include <windows.h>   
    2. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;  
    3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
    •                     PSTR szCmdLine, int iCmdShow)  
    • {  
    •      static TCHAR szAppName[] = TEXT ("AltWind") ;  
    •      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 ("Alternate and Winding Fill Modes"),  
    •                           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 POINT aptFigure [10] = { 10,70, 50,70, 50,10, 90,10, 90,50,  
    •                                      30,50, 30,90, 70,90, 70,30, 10,30 };  
    •      static POINT wuFigure[6]={10,40,85,100,55,10,25,100,100,40,10,40};  
    •      static POINT wuF[6]={10+130,40,85+130,100,55+130,10,25+130,100,100+130,40,10+130,40};  
    •        
    •      static int   cxClient, cyClient ;  
    •      HDC          hdc ;  
    •      int          i ;  
    •      PAINTSTRUCT  ps ;  
    •      POINT        apt[10] ;  
    •        
    •      switch (message)  
    •      {  
    •      case WM_SIZE:  
    •           cxClient = LOWORD (lParam) ;  
    •           cyClient = HIWORD (lParam) ;  
    •           return 0 ;  
    •      case WM_PAINT:  
    •           hdc = BeginPaint (hwnd, &ps) ;  
    •           SelectObject (hdc, GetStockObject (GRAY_BRUSH)) ;  
    •           SetPolyFillMode (hdc, ALTERNATE) ;  
    •           Polygon (hdc, wuFigure, 6) ;  
    •           SetPolyFillMode (hdc, WINDING) ;  
    •           Polygon (hdc, wuF, 6) ;  
    •           EndPaint (hwnd, &ps) ;  
    •           return 0 ;  
    •             
    •      case WM_DESTROY:  
    •           PostQuitMessage (0) ;  
    •           return 0 ;  
    •      }  
    •      return DefWindowProc (hwnd, message, wParam, lParam) ;  
    • }  
    • 实例APIDRAW003映射模式  
    • #include <windows.h>   
    • LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;  
    • void drawEllipse(HDC hdc,char * cpar);  
    • RECT        rect_ELLIPSE;//不需要变化   
    • int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
    •                     PSTR szCmdLine, int iCmdShow)  
    • {  
    •      static TCHAR szAppName[] = TEXT ("HelloWin") ;  
    •      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 ("This program requires Windows NT!"),   
    •                       szAppName, MB_ICONERROR) ;  
    •           return 0 ;  
    •      }  
    •        
    •      hwnd = CreateWindow (szAppName,                  // window class name   
    •                           TEXT ("The Hello Program"), // window caption   
    •                           WS_OVERLAPPEDWINDOW,        // window style   
    •                           CW_USEDEFAULT,              // initial x position   
    •                           CW_USEDEFAULT,              // initial y position   
    •                           CW_USEDEFAULT,              // initial x size   
    •                           CW_USEDEFAULT,              // initial y size   
    •                           NULL,                       // parent window handle   
    •                           NULL,                       // window menu handle   
    •                           hInstance,                  // program instance handle   
    •                           NULL) ;                     // creation parameters   
    •        
    •      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)  
    • {  
    •      HDC         hdc ;  
    •      PAINTSTRUCT ps ;  
    •      RECT        RTscreen;//保存客区大小   
    •      switch (message)  
    •      {  
    •      case WM_CREATE:  
    •           SetRect(&rect_ELLIPSE,0,0,300,200);//初始化椭圆大小   
    •           return 0 ;  
    •      case WM_SIZE:  
    •           GetClientRect(hwnd,&RTscreen);  
    •           return 0;  
    •      case WM_PAINT:  
    •           hdc = BeginPaint (hwnd, &ps) ;  
    •             
    •           GetClientRect (hwnd, &RTscreen) ;  
    •           drawEllipse(hdc,"MM_TEXT");  
    •           //画出屏幕中心   
    •           MoveToEx(hdc,0,RTscreen.bottom/2,NULL);  
    •           LineTo(hdc,RTscreen.right,RTscreen.bottom/2);  
    •           MoveToEx(hdc,RTscreen.right/2,0,NULL);  
    •           LineTo(hdc,RTscreen.right/2,RTscreen.bottom);  
    •           //在MM_TEXT 映射方式下,将屏幕原点移到客户区屏幕中心。   
    •           //决定了以后默认的屏幕原点位置   
    •           SetViewportOrgEx(hdc,RTscreen.right/2,RTscreen.bottom/2,NULL);  
    •           drawEllipse(hdc,"MM_TEXT but");  
    •           //MM_LOMETRIC映射方式   
    •           SetMapMode(hdc,MM_LOMETRIC);  
    •           drawEllipse(hdc,"MM_LOMETRIC");  
    •           //HIMETERIC   
    •           SetMapMode(hdc,MM_HIMETRIC);  
    •           drawEllipse(hdc,"MM_HIMETRIC");  
    •           SetWindowExtEx(hdc,RTscreen.right/2,RTscreen.bottom/2,NULL);  
    •           SetViewportExtEx(hdc,RTscreen.right,RTscreen.bottom,NULL);  
    •           SetMapMode(hdc,MM_ISOTROPIC);  
    •           drawEllipse(hdc,"MM_ISOTROPIC");  
    •           //MM_ISOTROPIC   
    •             
    •           EndPaint (hwnd, &ps) ;  
    •           return 0 ;  
    •             
    •      case WM_DESTROY:  
    •           PostQuitMessage (0) ;  
    •           return 0 ;  
    •      }  
    •      return DefWindowProc (hwnd, message, wParam, lParam) ;  
    • }  
    • void drawEllipse(HDC hdc,char * cpar)  
    • {  
    •     int ix=0;//椭圆中心坐标   
    •     int iy=0;  
    •     Ellipse(hdc,rect_ELLIPSE.left,rect_ELLIPSE.top,rect_ELLIPSE.right,rect_ELLIPSE.bottom);  
    •     ix=(rect_ELLIPSE.right-rect_ELLIPSE.left)/2;  
    •     iy=(rect_ELLIPSE.bottom-rect_ELLIPSE.top)/2;  
    •     SetBkMode(hdc,TRANSPARENT);//将文字背景色设为空。   
    •     TextOut(hdc,ix,iy,cpar,strlen(cpar));  
    • }  

    矩形函数

    矩形结构 RECT 它包括四个成员变量:它包含有4个字段:left、top、right和bottom。这个结构中的坐标被当作逻辑坐标。

    操作RECT结构

     1填写字段方法之一:

       rect.left = xLeft ; rect.top = xTop ; rect.right = xRight ; rect.bottom = xBottom 

      填写字段方法之二

       SetRect ( .......... ) 

      2OffsetRect (&rect, x, y) ; 将矩形沿x轴和y轴移动几个单元

      3InflateRect (&rect, x, y) ;增减矩形的尺寸

      4SetRectEmpty (&rect)   矩形各字段设定为0

      5CopyRect (&DestRect, &SrcRect) 将矩形复制给另一个矩形

      6IntersectRect (&DestRect, &SrcRect1, &SrcRect2)    取得两个矩形的交集

      7UnionRect (&DestRect, &SrcRect1, &SrcRect2) 取得两个矩形的联集

      8bEmpty = IsRectEmpty (&rect) ;确定矩形是否为空:

      9bInRect = PtInRect (&rect, point) ;确定点是否在矩形内

    您可以用下列叙述来替代CopyRect函数呼叫:DestRect = SrcRect ; 

    三个填充矩形函数

    FillRect (hdc, &rect, hBrush) ; 用指定画刷来填入矩形(直到但不包含right和bottom坐标),该函数不需要先将画刷选进设备内容。

    FrameRect (hdc, &rect, hBrush) ; 使用画刷画矩形框,但是不填入矩形。使用画刷画矩形看起来有点奇怪,因为对于我们所介绍过的函数(如Rectangle),其边线都是用目前画笔绘制的。FrameRect允许使用者画一个不一定为纯色的矩形框。该边界框为一个逻辑单位元宽。如果逻辑单位大于设备单位,则边界框将会为2个图素宽或者更宽。

    InvertRect (hdc, &rect) ; InvertRect将矩形中所有图素翻转,1转换成0,0转换为1,该函数将白色区域转变成黑色,黑色区域转变为白色,绿色区域转变成洋红色。

    /////////////////////////////////////////////////////////////

    区域

    1、区域概念:区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。

    2、区域的句柄,型态为HRGN。与画笔、画刷和位图一样,区域是GDI对象,您应该呼叫DeleteObject来删除您所建立的区域。

    3、区域剪裁原理:区域可以用于绘制和剪裁,通过将区域选进设备内容,就可以用区域来进行剪裁(就是说,将可以绘图的范围限制为显示区域的一部分)

    4、填充区域函数

       1、填充任意形状的区域的函数

          FillRgn(.......);

    4.1创建矩形区域

      最简单的区域是矩形,有两种创建方法

     (1)hRng(HRNG,区域对象的句柄) =CreateRectRgn(xLeft,yTop,xRight,yBottom);

     (2)hRng=CreateRectRgnIndirect(&rect);

    4.2 创建椭圆区域

       (1)hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ; 

       (2)hRgn = CreateEllipticRgnIndirect (&rect) ; 

    4.3CreateRoundRectRgn建立圆角的矩形剪裁区域

    4.4建立多边形区域的函数类似于Polygon函数:

      CreatePolygonRgn (&point, iCount, iPolyFillMode) ; 

    4.5利用CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) 建立复杂区域。显示区域的强大能力。

    这一函数将两个区域(hSrcRgn1和hSrcRgn2)组合起来并用句柄hDestRgn指向组合成的剪裁区域。这三个区域句柄都必须是有效的,但是hDestRgn原来所指向的区域被破坏掉了(当您使用这个函数时,您可能要让hDestRgn在初始时指向一个小的矩形剪裁区域)。

    iCombine参数说明hSrcRgn1和hSrcRgn2如何组合,见表5-9。

    表5-9

     

    iCombine

    新剪裁区域

    RGN_AND

    两个区域的公共部分

    RGN_OR

    两个区域的全部

    RGN_XOR

    两个区域的全部除去公共部分

    RGN_DIFF

    hSrcRgn1不在hSrcRgn2中的部分

    RGN_COPY

    hSrcRgn1的全部(忽略hSrcRgn2)

    从CombineRgn传回的iRgnType值是下列之一:NULLREGION,表示得到一个空区域;SIMPLEREGION,表示得到一个简单的矩形、椭圆或者多边形;COMPLEXREGION,表示多个矩形、椭圆或多边形的组合;ERROR,表示出错了。

    1. 实例APIDRAW005 区域的使用  
    2. #include <windows.h>   
    • LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
    • HRGN          hrectRGN[20];  
    • HBRUSH        hFBrush[20];//创建一画刷句柄数组   
    • POINT         polPoint[7]={300,0,300,100,350,80,400,100,400,0,350,20,300,0};  
    • int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
    •                     PSTR szCmdLine, int iCmdShow)  
    • {  
    •      static TCHAR szAppName[] = TEXT ("HelloWin") ;  
    •      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 ("This program requires Windows NT!"),   
    •                       szAppName, MB_ICONERROR) ;  
    •           return 0 ;  
    •      }  
    •        
    •      hwnd = CreateWindow (szAppName,                  // window class name   
    •                           TEXT ("The Hello Program"), // window caption   
    •                           WS_OVERLAPPEDWINDOW,        // window style   
    •                           CW_USEDEFAULT,              // initial x position   
    •                           CW_USEDEFAULT,              // initial y position   
    •                           CW_USEDEFAULT,              // initial x size   
    •                           CW_USEDEFAULT,              // initial y size   
    •                           NULL,                       // parent window handle   
    •                           NULL,                       // window menu handle   
    •                           hInstance,                  // program instance handle   
    •                           NULL) ;                     // creation parameters   
    •        
    •      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)  
    • {  
    •      HDC         hdc ;  
    •      PAINTSTRUCT ps ;  
    •      RECT        rect ;  
    •      int         i=0;  
    •        
    •      switch (message)  
    •      {  
    •      case WM_CREATE:  
    •           hFBrush[0]=CreateSolidBrush(RGB(154,241,137));//浅绿   
    •           hFBrush[1]=CreateSolidBrush(RGB(137,241,218));//浅青   
    •           hFBrush[2]=CreateSolidBrush(RGB(186,137,241));//浅紫色   
    •           hFBrush[3]=CreateSolidBrush(RGB(245,150,192));//粉   
    •           hFBrush[4]=CreateSolidBrush(RGB(247,232,63));//黄色   
    •           hrectRGN[0]=CreateRectRgn(0,0,100,100);//创建矩形区域   
    •           hrectRGN[1]=CreateEllipticRgn(100,0,200,100);//创建椭圆区域   
    •           hrectRGN[2]=CreateRoundRectRgn(200,0,300,100,30,30);//创建圆角矩形区域   
    •           hrectRGN[3]=CreatePolygonRgn(polPoint,7,ALTERNATE);//创建多边形   
    •           //利用CombineRgn得到月牙区域   
    •           hrectRGN[4]=CreateEllipticRgn(0,100,100,200);  
    •           hrectRGN[5]=CreateEllipticRgn(30,100,120,200);  
    •           hrectRGN[6]=CreateRectRgn(0,0,2,2);//初始化   
    •           CombineRgn(hrectRGN[6],hrectRGN[4],hrectRGN[5],RGN_DIFF);  
    •           return 0 ;  
    •      case WM_PAINT:  
    •           hdc = BeginPaint (hwnd, &ps) ;  
    •           GetClientRect (hwnd, &rect) ;  
    •           //填充任意形状的区域,   
    •           FillRgn(hdc,hrectRGN[0],hFBrush[0]);  
    •           //填充矩形区域,可以用fillrect   
    •           //填充椭圆   
    •           FillRgn(hdc,hrectRGN[1],hFBrush[1]);  
    •           //填充圆角矩形区域   
    •           FillRgn(hdc,hrectRGN[2],hFBrush[2]);  
    •           //填充多边形   
    •           FillRgn(hdc,hrectRGN[3],hFBrush[3]);  
    •           //填充月牙   
    •           FillRgn(hdc,hrectRGN[6],hFBrush[4]);  
    •           EndPaint (hwnd, &ps) ;  
    •           return 0 ;  
    •             
    •      case WM_DESTROY:  
    •           PostQuitMessage (0) ;  
    •           return 0 ;  
    •      }  
    •      return DefWindowProc (hwnd, message, wParam, lParam) ;  
    • }  

     

    //运行结果,见下图

    结果图

    转自(http://blog.csdn.net/dreamcs/article/details/3886525)

     
  • 相关阅读:
    JS能跑起来的贪吃蛇!(Bug多多 求指点。。)
    js随机生成闪烁div效果
    对js面向对象(原型对象 函数 和对象的关系)的理解
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节41(mvc配置,WebMvcConfigurer)
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节42(Http/2)——待补充
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节43()——待补充
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第二章节1(RestTemplate)——待补充
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第二章节2(WebClient)——待补充
    后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第三章节(测试框架)——待补充
    后端——框架——容器框架——spring_boot——《官网》阅读笔记——初篇——待补充
  • 原文地址:https://www.cnblogs.com/Fightingbirds/p/2843406.html
Copyright © 2011-2022 走看看