VC学习之二,简单绘图

来源:互联网 发布:淘宝主营类目如何更改 编辑:程序博客网 时间:2024/04/29 20:29
涉及到的类:

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);
}
原创粉丝点击