VC学习笔记:文本图形

 SkySeraph OCT.30th 2010  HQU

Email-zgzhaobo@gmail.com  QQ-452728574

Latest Modified Date:NOV.2th 2010 HQU

文本输出

  • 输出指定字体格式文本[1]

void CSpecificFontView::OnDraw(CDC* pDC)

{

CSpecificFontDoc* pDoc = GetDocument();//获取视图关联的文档对象

ASSERT_VALID(pDoc);//验证文档对象

CFont Font;

Font.CreateFont(24,24,0,0,FW_NORMAL,0,TRUE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,"宋体");

CFont *pOldFont = NULL;

pOldFont = pDC->SelectObject(&Font);

pDC->TextOut(10,10,"同一个世界,同一个梦想!");

pDC->SelectObject(pOldFont);

Font.DeleteObject();

}

  • 在矩形区域居中位置输出信息[1]

void CDrawTextView::OnDraw(CDC* pDC)

{

CDrawTextDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rc(100,20,300,200);

CString str = "我爱北京,我爱奥运!";

CBrush brush(RGB(0,0,0,0));

pDC->FrameRect(rc,&brush); // 用黑色画刷绘制一个矩形

pDC->DrawText(str,rc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);//在矩形区域绘制文本

brush.DeleteObject();//释放画刷对象

}

函数说明:

FrameRect

用指定的画刷为指定的矩形画边框。边框的宽和高总是一个逻辑单元。

DrawText

用于在某一个区域内输出文本    &&  TextOut用于在指定的坐标输出文本

  • 利用制表位空值文本输出[1]

void CTaboutView::OnDraw(CDC* pDC)

{

CTaboutDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

int pts[4] = {100,150,300,400};

pDC->TabbedTextOut(0,20,"\t2008\t北京奥运\t同一个世界\t同一个梦想",4,pts,0);

}

  • 设置字体和颜色[1]

void CSelFontView::OnDraw(CDC* pDC)

{

CSelFontDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CFont Font;                                                                //定义一个字体对象

//创建字体

Font.CreateFont(12,12,2700,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,"黑体");

CFont *pOldFont = NULL;                                                //定义一个字体指针

pOldFont = pDC->SelectObject(&Font);                        //选中创建的字体

pDC->SetTextColor(RGB(255,0,0)); //设置输出文本颜色

pDC->TextOut(100,50,"北京奥运");                        //输出文本信息

pDC->SelectObject(pOldFont);                                        //恢复之前选中的字体

Font.DeleteObject();        //释放字体对象

Font.CreatePointFont(120,"黑体",pDC);//创建字体

pOldFont = pDC->SelectObject(&Font);//选中创建的字体

pDC->TextOut(120,70, "同一个世界");

pDC->TextOut(120,90, "同一个梦想");

pDC->SelectObject(pOldFont);        //恢复之前选中的字体

Font.DeleteObject();

}

  • 在路径上输出文字[1]

void CPathFontView::OnDraw(CDC* pDC)

{

CPathFontDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CFont mFont;

//创建字体

VERIFY(mFont.CreateFont(

150, 50, 0, 0, FW_HEAVY, TRUE, FALSE,

0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

DEFAULT_PITCH | FF_SWISS, "宋体"));

CPen pen(PS_SOLID,2,RGB(255,0,0));

pDC->SelectObject(&pen);

pDC->BeginPath();//开始一个路径

CFont *pOldFont = pDC->SelectObject(&mFont);//

pDC->SetBkMode(TRANSPARENT);//设置画布的背景模式为透明

pDC->TextOut(30,30,"嫦娥一号探月卫星");

pDC->EndPath();//关闭路径

pDC->StrokePath();//用当前的画笔绘制路径

mFont.DeleteObject();

pDC->SelectObject(pOldFont);

}

  • 在图像背景上输出透明文本[1]

void CTransTextView::OnDraw(CDC* pDC)

{

CTransTextDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CBitmap bmp;//定义位图

bmp.LoadBitmap(IDB_BKBITMAP);//加载位图

BITMAP bInfo;//定义位图结构

bmp.GetBitmap(&bInfo);//获取位图信息

int width = bInfo.bmWidth;

int height = bInfo.bmHeight;

CDC memDC;//定义一个设备上下文

memDC.CreateCompatibleDC(pDC);//创建一个兼容的设备上下文

memDC.SelectObject(&bmp);//选中位图对象

pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY); //在设备上下文中绘制位图

memDC.DeleteDC();//释放设备上下文

bmp.DeleteObject();//释放位图对象

CFont mFont;                                                                        //定义一个字体对象

//创建字体

VERIFY(mFont.CreateFont(

24, 20, 0, 0, FW_HEAVY, FALSE, FALSE,

0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

DEFAULT_PITCH | FF_SWISS, "宋体"));

CFont* pOldFont = pDC->SelectObject(&mFont);

pDC->SetBkMode(TRANSPARENT);//设置透明的背景模式

pDC->SetTextColor(RGB(0,255,0));//设置文本颜色

pDC->TextOut(60,60,"田园生活");

pDC->SelectObject(pOldFont);

mFont.DeleteObject();

}

绘制图形

  • 一些函数

画点

CDC::SetPixel()/CDC::SetPixelV()

后者不需要返回实际像素点的RGB,较快

当前位置获取

CDC::GetCurrentPosition

原型CPoint GetCurrentPosition( ) const;

折线

Polyline/PolyPolyline/PolylineTo

Polyline和PolyPolyline既不使用当前位置,也不更新当前位置;而PolylineTo总是把当前位

置作为起始点,并且在折线画完之后,还把折线终点所在位置设为新的当前位置

矩形和圆角矩形

Rectangle和RoundRect

  • 利用线条绘制多边形[1]

void CDrawLineView::OnDraw(CDC* pDC)

{

CDrawLineDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//绘制矩形

CPen pen(PS_SOLID,2,RGB(255,0,0));

CPen *pOldPen = pDC->SelectObject(&pen);

pDC->MoveTo(50,30);

pDC->LineTo(240,30);//绘制上边框

pDC->LineTo(240,120);//绘制右边框

pDC->LineTo(50,120);  //绘制下边框

pDC->LineTo(50,30);//绘制左边框

//绘制多变形

pDC->MoveTo(300,50);//设置当前坐标

pDC->LineTo(400,50);//绘制上边框

pDC->LineTo(450,100);//绘制右斜边框

pDC->LineTo(400,150);//绘制右斜边框

pDC->LineTo(300,150); //绘制底边框

pDC->LineTo(250,100);//绘制左上边框

pDC->LineTo(300,50);//绘制左上边框

//绘制弧线

CRect rc(500,50,600,100);

pDC->Arc(500,50,600,100,520,70,560,30);

CBrush brush(RGB(255,0,0));

pDC->FrameRect(rc,&brush);

pDC->SelectObject(pOldPen);

}

  • 直接绘制多边形[1]

void CPolyView::OnDraw(CDC* pDC)

{

CPolyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rc(20,20,80,80);

pDC->Rectangle(rc);//绘制矩形区域

CRect RndRC(20,100,80,160);

pDC->RoundRect(RndRC,CPoint(10,10));//绘制圆角矩形

CPoint pts[6] = {CPoint(300,50),CPoint(400,50),CPoint(450,100),

CPoint(400,150),CPoint(300,150),CPoint(250,100)};//定义多边形端点

pDC->Polygon(pts,6);//绘制多边形

}

  • 绘制控件外观[1]

void CDrawCtrlView::OnDraw(CDC* pDC)

{

CDrawCtrlDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//绘制按钮

CRect rc(50,50,120,80);

pDC->DrawFrameControl(rc,DFC_BUTTON,DFCS_BUTTONPUSH);

//绘制标题栏关闭按钮

CRect CapRC(130,50,160,80);

pDC->DrawFrameControl(CapRC,DFC_CAPTION,DFCS_CAPTIONHELP);

//绘制滚动条按钮

CRect ScrollRC(170,50,200,80);

pDC->DrawFrameControl(ScrollRC,DFC_SCROLL,DFCS_SCROLLCOMBOBOX);

}

函数说明:

BOOL DrawFrameControl(LPRECT lpRect,UINT nType,UINT nState);

lpRect:控件所在的矩形区域; nState:绘制控件的风格或状态

nType:控件类型,DFC_BUTTON、DFC_CAPTION/标题栏、DFC_MENU、DFC_SCROLL/滚动条;

  • 填充矩形区域[1]

void CFillRCView::OnDraw(CDC* pDC)

{

CFillRCDoc* pDoc = GetDocument();//获取文档对象

ASSERT_VALID(pDoc);//验证文档

CRect rc(30,40,100,120);

CBrush brush(RGB(128,128,128));

//使用颜色填充区域

pDC->FillRect(rc,&brush);

brush.DeleteObject();

CBitmap bmp;

bmp.LoadBitmap(IDB_BKBITMAP);

brush.CreatePatternBrush(&bmp);//创建位图画刷

CRect bmpRC(110,40,200,120);

//使用位图填充区域

pDC->FillRect(bmpRC,&brush);

bmp.DeleteObject();//释放位图

brush.DeleteObject();//释放画刷

//填充选区

CRect rectrc(210,40,300,120);

CRect hrc(280,60,350,140);

pDC->Rectangle(rectrc);

pDC->Rectangle(hrc);

HRGN hRect = CreateRectRgn(210,40,300,120);

HRGN hrgn = CreateRectRgn(280,60,350,140);

HRGN hret = CreateRectRgn(0,0,0,0);

CombineRgn(hret,hRect,hrgn,RGN_AND);//组合选取,获取两个选取的公共部分

brush.CreateSolidBrush(RGB(255,0,0));//创建一个颜色画刷

CRgn rgn;//定义一个选区对象

rgn.Attach(hret);//将选区对象附加一个选区句柄

pDC->FillRgn(&rgn,&brush);//

brush.DeleteObject();

rgn.Detach();//分离选区

DeleteObject(hRect);

DeleteObject(hrc);

DeleteObject(hret);

}

绘图实例:课程成绩直方图

①用MFC AppWizard创建一个默认的单文档应用程序Ex_Draw

②为CEx_DrawView类添加一个成员函数DrawScore,用来根据成绩来绘制直方图,该函数的代码如下:

void CEx_DrawView::DrawScore(CDC *pDC, float *fScore, int nNum)

// fScore是成绩数组指针,nNum是学生人数

{

int nScoreNum[] = { 0, 0, 0, 0, 0};    // 各成绩段的人数的初始值

// 下面是用来统计各分数段的人数

for (int i=0; i<nNum; i++)

{

int nSeg = (int)(fScore[i]) / 10;    // 取数的"十"位上的值

if (nSeg < 6)    nSeg = 5;    // <60分

if (nSeg == 10 ) nSeg = 9;        // 当为100分,算为>90分数段

nScoreNum[nSeg - 5] ++;        // 各分数段计数

}

int nSegNum = sizeof(nScoreNum)/sizeof(int);    // 计算有多少个分数段

// 求分数段上最大的人数

int nNumMax = nScoreNum[0];

for (i=1; i<nSegNum; i++)

{

if (nNumMax < nScoreNum[i]) nNumMax = nScoreNum[i];

}

CRect rc;

GetClientRect(rc);

rc.DeflateRect( 40, 40 );                // 缩小矩形大小

int nSegWidth = rc.Width()/nSegNum;        // 计算每段的宽度

int nSegHeight = rc.Height()/nNumMax;        // 计算每段的单位高度

COLORREF crSeg = RGB(0,0,192);            // 定义一个颜色变量

CBrush brush1( HS_FDIAGONAL, crSeg );

CBrush brush2( HS_BDIAGONAL, crSeg );

CPen   pen( PS_INSIDEFRAME, 2, crSeg );

CBrush* oldBrush = pDC->SelectObject( &brush1 );    // 将brush1选入设备环境

CPen* oldPen = pDC->SelectObject( &pen );        // 将pen选入设备环境

CRect rcSeg(rc);

rcSeg.right = rcSeg.left + nSegWidth;        // 使每段的矩形宽度等于nSegWidth

CString strSeg[]={"<60","60-70","70-80","80-90",">=90"};

CRect rcStr;

for (i=0; i<nSegNum; i++)

{

// 保证相邻的矩形填充样式不相同

if (i%2)

pDC->SelectObject( &brush2 );

else

pDC->SelectObject( &brush1 );

rcSeg.top = rcSeg.bottom - nScoreNum[i]*nSegHeight - 2;    // 计算每段矩形的高度

pDC->Rectangle(rcSeg);

if (nScoreNum[i] > 0)

{

CString str;

str.Format("%d人", nScoreNum[i]);

pDC->DrawText( str, rcSeg, DT_CENTER | DT_VCENTER | DT_SINGLELINE );

}

rcStr = rcSeg;

rcStr.top = rcStr.bottom + 2;        rcStr.bottom += 20;

pDC->DrawText( strSeg[i], rcStr, DT_CENTER | DT_VCENTER | DT_SINGLELINE );

// 后面还会讲到

rcSeg.OffsetRect( nSegWidth, 0 );        // 右移矩形

}

pDC->SelectObject( oldBrush );            // 恢复原来的画刷属性

pDC->SelectObject( oldPen );            // 恢复原来的画笔属性

}

③在CEx_DrawView::OnDraw函数中添加下列代码:

void CEx_DrawView::OnDraw(CDC* pDC)

{

CEx_DrawDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

float fScore[] = {66,82,79,74,86,82,67,60,45,44,77,98,65,90,66,76,66,

62,83,84,97,43,67,57,60,60,71,74,60,72,81,69,79,91,69,71,81};

DrawScore(pDC, fScore, sizeof(fScore)/sizeof(float));

}

Author:         SKySeraph

Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

From:         http://www.cnblogs.com/skyseraph/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

VC学习笔记:文本图形相关推荐

  1. VC学习笔记 -单选按钮控件(Ridio Button)的使用

    在VC++编程过程中,查资料是一个苦差事,案边放了一摞书左翻右翻好是烦人.一赌气就把一些常用的小技巧自己总结了一下,虽费了些功夫,但对以后编程很有好处.现拿出来与大家共享,以后积累多了,作一个CHM电 ...

  2. Python学习笔记·交互式图形编程

    Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...

  3. VC学习笔记:简单绘图

    VC学习笔记:简单绘图 SkySeraph Oct.29th 2009  HQU Email-zgzhaobo@gmail.com  QQ-452728574 Latest Modified Date ...

  4. Task02:学习笔记文本预处理;语言模型;循环神经网络基础

    Task02:学习笔记文本预处理:语言模型:循环神经网络基础 文本预处理 文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤: 读入文本 ...

  5. 9月1日目标检测学习笔记——文本检测

    文章目录 前言 一.类型 1.Top-Down 2.Bottom-up 二.基于深度学习的文本检测模型 1.CTPN 2.RRPN 3.FTSN 4.DMPNet 5.EAST 6.SegLink 7 ...

  6. UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合

    UE5 Shader基础学习笔记--01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合 Lec01 ...

  7. python图形设置_python学习笔记——基本图形绘制

    1.python蟒蛇python蟒蛇代码 #PythonDraw.py import turtle turtle.setup(650,350,200,200)# 设置画布的长.宽.起点 turtle. ...

  8. 孙鑫VC学习笔记:第七讲

    七.对话框 2006年8月5日 14:25 因为笔记是用OneNote做的,上传以后为看不到图片,于是我截图放到相册上面, 相册地址为:http://photo.163.com/photos/good ...

  9. python打开界面是什么样的-python学习笔记(图形用户界面)

    GUI python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的 ...

最新文章

  1. Python 中 zip() 函数的用法
  2. 【Android View基础】View中几个容易混淆的距离及坐标量
  3. 服务器系统健康值计算算法,身体健康指数计算方法
  4. django_4数据库3——admin
  5. 3.软件开发的本质和基本手段
  6. swiper.js pagination指示点不变_电缆故障点的四种实用测定方法
  7. PHP、mysql面试题 (附答案+实现代码)
  8. python multiprocessing.Lock 应用
  9. S7-200 PC ACCESS下载安装及常见问题解决思路指南
  10. mtk2503 新增物联网卡apn
  11. rabbitmq(二):死信队列,springboot 实现3种情况
  12. 区块链是什么?简单理解区块链
  13. android 全屏倒计时,全屏计时器app
  14. python元组读取到列表_Python 学习笔记(1)Python容器:列表、元组、字典与集合...
  15. (?=a)与(?!a)代表什么意思
  16. acer 4750 Fn+亮度键(左右方向键亮度调节)无效问题的解决办法
  17. 从性格色彩认知了解自己
  18. java 设计模式实战,适配器模式之万物拟人化
  19. GeoLite2 City库的基本使用与下载, 通过ip查询地址
  20. 用爬虫收集网站公开数据丨Python爬虫实战系列(5)

热门文章

  1. 超级抖音腾讯视频V3.6.0小程序源码 前端+后端 支持视频采集和上传
  2. SignalR介绍与Asp.net
  3. 用C#实现软件自动更新
  4. 利用jquery load 局部刷新数据
  5. 关于c/s vs web 程序的并发问题
  6. html5游戏制作入门系列教程(七)
  7. Web 开发中 20 个很有用的 CSS 库
  8. TOP命令及参数解析
  9. 人工智障学习笔记——梯度下降(2)优化算法
  10. ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平