VC学习之二,简单绘图

涉及到的类:

HDC :Handle to a device context

HDC hdc ;
hdc = ::GetDC(m_hWnd);
//移动
MoveToEx(hdc,m_ptOrigin.x,m_ptOragin.y,NULL);
//画线
LineTo(hdc,point.x,point.y);
//释放设备描述表
::ReleaseDC(m_hWnd,hdc);
注:需要调用::ReleaseDC(m_hWnd,hdc);释放
::GetDC,::ReleaseDC 加2个冒号,表示是全局的SDK函数,否则则VC则会认为是类的成员函数
 

CDC:MFC提供的一个设备描述表的封装类

CDC* pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
 

CClientDC:MFC的CClientDC,实现画线

CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
注:CClientDC生命周期结束后,会自动释放所占用的设备资源,不用手动调Release
 

CWindowDC:MFC提供的CWindowDC,可实现在整个窗口区域画图,包括框架窗口和客户区

CWindowDC dc(this);
//可实现在框架上画图
//CWindowDC dc(GetParent());
//在桌面上画线
//CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
注:CWindowDC不用手动调用Release同上。
 

CPen:画笔对象

CPen pen(PS_SOLID,1,RGB(255,0,0));
CClientDC dc(this);
//选入设备描述表
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
//恢复之前的设备描述
dc.SelectObject(pOldPen);
注:构建GDI对象后,需要选入设备描述表才可生效
 

CBrush:画刷

//创建红色画刷
CBrush brush(RGB(255,0,0));
//创建并获得设备描述表
CClientDC dc(this);
//利用红色画刷填充矩形区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);
 
位图画刷
//创建位图
CBitmap bitmap;
//加载资源
bitmap.LoadBitmap(IDB_BITMAP1);
//创建位图画刷
CBrush brush(&bitmap);
CClient dc(this);
//用位图刷新填充区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);
 
透明画刷,直接通过dc.Rectangle
CClientDC dc(this);
//绘制一个矩形,dc设备描述表默认有一个白色的画刷
dc.Rectangle(CRect(m_ptOrigin,point));
 
利用GetStockObject 获取一个画刷句柄,通过CBursh.FromHandle 将画刷句柄转换成画刷对象
//创建并获得设备描述表
CClientDC dc(this);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//将空画刷选入设备描述表
CBrush *pOldBrush = dc.SelectObject(pBrush);
//绘制一个矩形
dc.Rectangle(CRect(m_ptOrigin,point));
//恢复之间的画刷
dc.SelectObject(pOldBrush);
 
之前使用的dc.FillRect函数和这里的dc.Rectangle函数,二者都是用画刷画矩形,前者在参数中提供了绘制使用的画刷,因此可以直接利用此画刷画图,不需要调用SelectObject选入设备描述表,后者并没有提供画刷参数,因些要调用SelectObject
 

dc.DrawText 输出字符

        CClientDC dc(this);
TEXTMETRIC tm;
//获得当前设备描述表中的字体高度信息
dc.GetTextMetrics(&tm);
CRect rect;
rect.left=0;
rect.top=200;
rect.right=m_nWidth;
rect.bottom=rect.top+tm.tmHeight;
 
//设置文本颜色
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadString(IDS_WEIXIN);
dc.DrawText(str,rect,DT_LEFT);
 
rect.top=150;
rect.bottom=rect.top+tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
 
CSize sz=dc.GetTextExtent(str);
if(m_nWidth>sz.cx)
{
m_nWidth=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(0,200,str);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值