MFC绘图总结
来源:互联网 发布:药品网络销售方法 编辑:程序博客网 时间:2024/05/19 17:49
hWnd(Handle ofWindow,也可以这么说:h是类型描述,表示句柄;wnd是变量对象描述,表示窗口)是窗口句柄,其中包含窗口的属性。例如,窗口的大小、显示位置、父窗口。
hDC(Handle to Device Context)是图像的设备描述表,窗口显示上下文句柄,其中可以进行图形显示。
利用hDC=GetDC(hWnd),可以获得一个窗口的图形设备描述表。可以通过ReleaseDC()函数释放。
hWnd句柄是描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结构;
hDC句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。
hWnd是窗体句柄;hDC是设备场景句柄。
hWnd与窗口管理有关;hDC与绘图API(GDI函数)有关。
hWnd是windows给窗口发送消息(事件)用的;hDC是把窗口绘制在屏幕上用的。
有了hWnd,可以使用API的GetDC()函数得到与其相关的hDC:hDC=GetDC(hWnd)。
Cpoint 记录坐标
1、直线的画法和曲线及扇形(需要三个点)的画法,MFC每次窗口重绘都会加载视图类的onDraw成员函数。
HDC画直线实例:
HDC hdc;
hdc=::GetDC(m_hWnd);
::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);
::LineTo(hdc,m_ePoint.x,m_ePoint.y);
::ReleaseDC(m_hWnd,hdc);
CDC画直线实例:
CDC *cdc=GetDC();
cdc->MoveTo(m_sPoint);
cdc->LineTo(m_ePoint);
ReleaseDC(cdc);
2.采用GDI绘图:
HDC hdc;
hdc=::GetDC(m_hWnd);
HPENhpen=::CreatePen(PS_SOLID,1,RGB(255,0,55));//创建画笔
HPEN oHpen;
oHpen=(HPEN)::SelectObject(hdc,hpen);//把新的画笔填充到DC
::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);
::LineTo(hdc,m_ePoint.x,m_ePoint.y);
::SelectObject(hdc,oHpen);
::DeleteObject(hpen);
::ReleaseDC(m_hWnd,hdc);
3.使用CWindowDC类
CWindowDC dc(this); //this为获得的窗口句柄,可以用GetDesktopWindow()获取桌面的句柄,使其可以在桌面可以画图
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
3.1使用CClientDC类
CClientDC dc(this);
dc.MoveTo(m_ptOrigin); //CClientDC会自动释放
dc.LineTo(point);
4.CPen pen(PS_SOLID, 1, RGB(255, 0, 55)); //创建画笔
CWindowDC dc(GetDesktopWindow()); //获取句柄,指定窗口
CPen *pOldPen = dc.SelectObject(&pen); //为该窗口类对象选入该画笔
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
5.使用画刷
CBrush::CBrush
CBrush( );
CBrush( COLORREF crColor);
throw(CResouceException );
CBrush( int nIndex,COLORREF crColor );
throw(CResouceException );
CBrush( CBitmap* pBitmap);
throw(CResouceExecption );
参数:
crColor
指定画刷的前景色(RGB方式)。如果画刷是阴影线型的,则指定阴影线的颜色。
nIndex
指定画刷阴影线采用的风格,取值如下:
·
HS_BDIAGONAL
45度的向下影线(从左到右)
·
HS_CROSS
水平和垂直方向以网格线作出阴影
·
HS_DIAGCROSS
45度的网格线阴影
·
HS_FDIAGONAL
45度的向上阴影线(从左到右)
·
HS_HORIZONTAL
水平的阴影线
·
HS_VERTICAL
垂直的阴影线
pBitmap
指向CBitmap对象的指针,该对象指定了画刷要绘制的位图。
CBrush brush(RGB(255, 0, 55));
CWindowDC dc(GetDesktopWindow());
dc.FillRect(CRect(m_ptOrigin, point), &brush);
6.使用位图作为画刷
CBitmapbitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrushbrush(&bitmap);
CClientDCdc(this);
dc.Rectangle(CRect(m_ptOrigin,point));
7.绘画空的矩形框
CClientDCdc(this);
CBrush*pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush*pOldBrush = dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:
CClientDCdc(this);//this一般指向本窗口或当前活动视图
dc.TextOut(10,10,str,str.GetLength());
//利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。
CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
注:内容总结来自《VC++ 深入详解》 孙鑫 和 CSDN文档上