MFC绘制点,线,矩形以及画刷,字体,位图的使用

点的绘制和获取

      绘制: COLORREF SetPixel(
  HDC hdc, //DC句柄
  int X, //x坐标
  int Y, //y坐标
  COLORREF crColor ); // 点的颜色


      获取: COLORREF GetPixel(
 HDC hdc,   //DC句柄
 int XPos,  //x坐标
 int nYPos ); //y坐标
返回指定坐标位置的点的颜色


直线的绘制

      MoveToEx 移动当前点到指定位置
      LineTo 从当前点绘制直线到指定位置
    

弧的绘制

       Arc和AngleArc提供不同的绘制弧的方式:
 BOOL Arc( HDC hdc, 
 int nLeftRect, // 外切矩形的坐标
 int nTopRect,//外切矩形的坐标
 int nRightRect,//外切矩形的坐标
 int nBottomRect,//外切矩形的坐标
 int nXStartArc,//起始切割半径的X坐标
 int nYStartArc,//起始切割半径的Y坐标
 int nXEndArc, //终止切割半径的X坐标
 int nYEndArc ); //终止切割半径的X坐标
可以使用SetArcDirection函数,设置Arc函数
切割方向:顺时针和逆时针.
BOOL AngleArc(
  HDC hdc, // handle to device context
  int X, //圆心的X坐标
  int Y, //圆心的Y坐标
  DWORD dwRadius,//圆的半径
  FLOAT eStartAngle,//开始角度
   FLOAT eSweepAngle );//夹角

折线

BOOL Polyline(
  HDC hdc, //DC句柄
  CONST POINT *lppt,//Polyline顶点的坐标数组
  int cPoints ); //顶点数组的长度
PolylineTo 与Polyline类似, 只是在
          绘制Polyline前,从当前点使用LineTo绘
          制直线到Polyline的第一个顶点.
绘制多组折线 PolyPolyline
          BOOL PolyPolyline( HDC hdc,
  CONST POINT *lppt,//所有点的数组
   CONST DWORD *lpdwPolyPoints,//每组点的数量
   DWORD cCount );//分组的数量
         例如:
          DWORD nGroup[] = { 4, 3 };
       PolyPolyline( hDC, ptPolyLine,nGroup, 2 );


Bizer曲线

      BOOL PolyBezier(HDC hdc, 
         CONST POINT *lppt,//点数组,最少4个点
  DWORD cPoints );//点的数量
  4个点: 1和4是端点,2.3点是控制点
         7个点: 1.4.7是端点,其余是控制点
     

多样式的线条

        BOOL PolyDraw( HDC hdc,
        CONST POINT *lppt,//各个点的数组
  CONST BYTE *lpbTypes, //从某点到下一点的绘制方式 pointer to line and curve identifiers
  int cCount); //点的数量
  lpbTypes - PT_MOVETO  移动到该点
            PT_LINETO  绘直线
                   PT_BIZERTO Biezer曲线
                   

矩形的绘制

普通矩形 Rectangle 
        带圆角的矩形 
        BOOL RoundRect( HDC hdc,
        int nLeftRect, //左上X坐标
   int nTopRect, //左上Y坐标
        int nRightRect,//右下X坐标
        int nBottomRect, //右下Y坐标
        int nWidth, //生成圆角的椭圆的宽度
        int nHeight );//生成圆角的椭圆的高度


 椭圆和圆

       BOOL Ellipse( HDC hdc,
       int nLeftRect, //外切矩形左上X坐标
    int nTopRect,//外切矩形左上Y坐标
       int nRightRect, //外切矩形右下X坐标
       int nBottomRect); //外切矩形右下Y坐标
       

饼Pie

       BOOL Pie( HDC hdc, 
       int nLeftRect, //外切矩形左上X坐标
  int nTopRect, //外切矩形左上Y坐标
       int nRightRect,  //外切矩形右下X坐标
       int nBottomRect, //外切矩形右下Y坐标
       int nXRadial1,//切割起始半径X坐标
       int nYRadial1,//切割起始半径Y坐标
       int nXRadial2,//切割终止半径X坐标
    int nYRadial2 );//切割终止半径Y坐标


       BOOL Chord( HDC hdc, 
       int nLeftRect, //外切矩形左上X坐标
  int nTopRect, //外切矩形左上Y坐标
       int nRightRect,  //外切矩形右下X坐标
       int nBottomRect, //外切矩形右下Y坐标
       int nXRadial1,//切割起始半径X坐标
       int nYRadial1,//切割起始半径Y坐标
       int nXRadial2,//切割终止半径X坐标
    int nYRadial2 );//切割终止半径Y坐标
       

多边形

       BOOL Polygon( HDC hdc,
        CONST POINT *lpPoints, //多边形的顶点
        int nCount ); //顶点的数量
       PolyPolygon 可以绘制多组多边形
       

GDI绘图对象 - 画笔

  2.1 画笔的作用
   可以控制线条的颜色、样式、宽度。
  2.2 画笔的使用
   2.2.1 创建画笔 CreatePen
      HPEN CreatePen(
  int fnPenStyle, //画笔的样式
   int nWidth, //画笔的宽度
  COLORREF crColor);//画笔的颜色
   2.2.2 置成当前DC可以使用的画笔
      HGDIOBJ SelectObject(
   HDC hdc, // 当前DC的句柄
          HGDIOBJ hgdiobj );//要使用的GDI对象句柄
        返回当前DC原来使用的同类型的GDI对象句柄。
   2.2.3 绘制图形
   2.2.4 从当前DC中取出画笔,即将旧画笔
      放入当前DC中
         SelectObject( hDC, hOldPen );
   2.2.5 销毁画笔
      DeleteObject( hPen );
      画笔使用时,由于绘图资源有限,一定要
      注意释放。
     

GDI绘图对象 - 画刷

    3.1 画刷的作用
      填充封闭图形,包括样式、颜色等。
      
    3.2 画刷的使用
      3.2.1 创建画刷
         CreateSolidBrush 创建实心画刷
         CreateHatchBrush 创建阴影线的画刷
      3.2.2 置成当前DC可以使用的画刷
         SelectObject 和画笔使用方式类似
      3.2.3 绘制图形
      3.2.4 取出画刷
         SelectObject 和画笔使用方式类似
      3.2.5 销毁画刷

         DeleteObject 和画笔使用方式类似

GDI绘图对象 - 位图

1 位图 - 通过保存图像上每个点的颜色,生成相应
  的位图文件。
    
    光栅图 - 可以理解为图像点阵的保存
    矢量图 - 可以理解为绘图命令的保存
    
2 位图资源的使用
 2.1 加载位图资源
  HBITMAP LoadBitmap(
  HINSTANCE hInstance,  //位图资源所在应用程序句柄
  LPCTSTR lpBitmapName ); //位图资源ID字符串
返回位图句柄HBITMAP
 2.2 创建放置位图的DC
    HDC CreateCompatibleDC( HDC hDC );
    创建一个和指定的hDC相匹配的DC(DC中
    包含信息一致)
 2.3 将位图放入创建的DC中
    SelectObject
 2.4 绘制位图到当前DC中
    BOOL BitBlt(
        HDC hdcDest, //绘制的目的DC句柄
  int nXDest,  //绘制的目的左上x坐标
        int nYDest,  //绘制的目的左上y坐标
        int nWidth,  //绘制的目的宽
        int nHeight, //绘制的目的高
        HDC hdcSrc,  //需要绘制的DC句柄
        int nXSrc,   //需要绘制的原图的起始X坐标
        int nYSrc,   //需要绘制的原图的起始y坐标 
        DWORD dwRop);  //绘图方式
        
      BOOL StretchBlt(
 HDC hdcDest,  //绘制的目的DC句柄
 int nXOriginDest,//绘制的目的左上x坐标
 int nYOriginDest, //绘制的目的左上y坐标
 int nWidthDest,//绘制的目的宽
 int nHeightDest,  //绘制的目的高
 HDC hdcSrc, //需要绘制的DC句柄
 int nXOriginSrc,//需要绘制的原图的起始X坐标
 int nYOriginSrc,//需要绘制的原图的起始y坐标
 int nWidthSrc,//需要绘制的原图的宽
 int nHeightSrc,//需要绘制的原图的高
 DWORD dwRop  ); //绘图方式


 2.5 取出位图
    SelectObject
 2.6 删除创建的DC
    DeleteDC
 2.7 删除位图
    DeleteObject
 2.8 获取位图信息
    int GetObject(
       HGDIOBJ hgdiobj,//GDI对象句柄,这里就是HBITMAP
       int cbBuffer,//位图信息的BUFF的大小
       LPVOID lpvObject ); //位图信息的BUFF指针
       位图的BUFF类型为 BITMAP 结构

文字和字体              

   1 文字的绘制
     1.1 TextOut
     1.2 DrawText
       int DrawText(
        HDC hDC,//DC句柄
        LPCTSTR lpString, //字符串
        int nCount,//字符串长度
        LPRECT lpRect,//绘制字符串的矩形区域
        UINT uFormat ); //绘制方式
        DT_CENTER - 水平居中 
        DT_VCENTER - 垂直居中
        DT_SINGLELINE - 单行显示不换行
        DT_NOCLIP - 超出矩形框不剪切
        DT_WORDBREAK - 换行
      1.3 ExtTextOut
        绘制字符时,可以设置字符间距.
        对于汉字字符,由于一个字符占2个字节,
        所以汉字字符之间的间距应该为0;
     CHAR szText2[12] = "E你xtTex好";
     INT  nText[10] = { 30, 0, 30, 30, 30, 
       30, 30, 30, 0, 10 };
     ExtTextOut( hDC, 100, 300, ETO_OPAQUE,
    NULL, szText2, strlen(szText2), nText );
 1.4 字符绘制的相关属性
   SetTextColor 设置字符的颜色
   SetBkColor 设置背景色
   SetBkMode 绘制的方式
     
   2 字体的使用
     2.1 创建字体
        HFONT CreateFont(
  int nHeight, //字体逻辑高
        int nWidth, //字体逻辑宽度
        int nEscapement, //切斜度
        int nOrientation,//旋转
        int fnWeight,//加粗
        DWORD fdwItalic,//斜体
        DWORD fdwUnderline,//下划线
        DWORD fdwStrikeOut,//删除线
        DWORD fdwCharSet,//字符集
        DWORD fdwOutputPrecision, //输出
        DWORD fdwClipPrecision,  //剪切
        DWORD fdwQuality, //输出质量
        DWORD fdwPitchAndFamily, // pitch and family
        LPCTSTR lpszFace ); //字体名称
     2.2 设置字体
        SelectObject
     2.3 绘图
     2.4 取出字体
        SelectObject
     2.5 删除字体
        DeleteObject
     2.6 创建字体常使用TrueType字体.




上述绘图方法有很多简单重复的地方,所以我只写了几个有代表性的代码示例:
//获取客户区DC
		CDC* pClientDC = GetDC();
		/点/
		//绘制点
		pClientDC->SetPixel(10, 20, RGB(255, 0, 0));
		//得到点的颜色
		COLORREF clPixel = pClientDC->GetPixel(10, 20);
		/线/
		//绘制线
		pClientDC->MoveTo(0, 0);
		pClientDC->LineTo(100, 100);
		/矩形/画刷的使用
		//创建画刷
		CBrush brs;
		brs.CreateHatchBrush(HS_CROSS,RGB(0,255,0));//++类型,绿色画刷
		//载入画刷
		CBrush* pOldBrs = pClientDC->SelectObject(&brs);
		//绘制矩形
		pClientDC->Rectangle(50, 50, 100, 100);
		//载出画刷
		pClientDC->SelectObject(pOldBrs);
		//删除画刷
		brs.DeleteObject();
		///位图的使用///
		//创建位图
		CBitmap bmpCar;
		bmpCar.LoadBitmapW(IDB_BMP_CAR);
		//创建内存DC
		CDC MemClientDC;
		MemClientDC.CreateCompatibleDC(pClientDC);
		//位图加载到内存DC上
		MemClientDC.SelectObject(bmpCar);
		//将内存DC绘制到客户区
		pClientDC->BitBlt(0, 0, 400, 200, &MemClientDC, 0, 0, SRCCOPY);
		//删除内存DC和位图
		MemClientDC.DeleteDC();
		bmpCar.DeleteObject();

//字体的绘制
		//创建字体
		CFont font;
		font.CreatePointFont(200, _T("宋体"));
		//载入字体
		CFont* pOldFont;
		pOldFont = pClientDC->SelectObject(&font);
		//绘制字
		pClientDC->TextOutW(450, 50, _T("你好"));
		//载出字体
		pClientDC->SelectObject(pOldFont);
		//删除字体
		font.DeleteObject();

		ReleaseDC(pClientDC);



  • 5
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值