所有的绘图操作包括如下几种:利用API、用CDC对象、用CClientDC对象、用CWindowDC对象和CPaintDC;下面分别说明:
利用API来进行绘图操作,首先需要一个设备描述表(DC)句柄HDC,然后才能进行绘图操作,在绘图结束的时候要释放DC,基本操作如下:
HDC hdc=::GetDC(m_hWnd);//GetDC()需要一个指向窗体的句柄作为参数,也就是获得哪个窗体的DC
//下面进行绘图操作,画一条直线
MoveToEx(hdc,0,0,NULL);
LineTo(hdc,100,100);
//释放DC
::ReleaseDC(m_hWnd,hdc);//在这里需要使用全局函数标识符,不然编译会认为是调用了窗体对象的releaseDC()成员函数,从而产生错误
CDC:是其他设备描述表的基类。在这里可以进行所有的操作。CDC在一般情况下需要用当前窗口的CWnd::GetDC()函数进行初始化,即:
CDC *pDC=GetDC();//在任何一个窗口类中均可用该函数来初始化一个CDC类
在该类中,直接可以进行图形的绘制操作
pDC->MoveTo(CPoint(0,0));//如果没有这一句,仍可以画出直线,它将缺省以(0,0)点作为起始点
pDC->LineTo(CPoint(100,100));//如果要连续画直线,则缺省地将终止点作为第二条直线的起始点
pDC->LineTo(CPoint(200,300));//这样的操作也是可行的。
在该操作完成后,需要释放DC:
ReleaseDC(pDC);
CClientDC:作为CDC的一个子类,在构造函数中封装了GetDC()这个函数,因此,只需传递一个窗口对象指针即可,即:
CClientDC dc(this);//获得当前窗口的DC
在CClientDC的析构函数中,封装了ReleaseDC()这个函数,因此,不需要再对其进行释放,
其他的操作跟CDC相同,但它仅在窗口的客户区的范围内有效。
CWindowDC:指向整个窗口的DC,包括了客户区和非客户区(菜单栏等)。作为CDC的一个子类,在构造函数中封装了GetDC()这个函数,因此,只需传递一个窗口对象指针即可,即:
CWindowDC dc(this);//获得当前窗口的DC
如果要在桌面上进行操作,可以用指向指点的指针来获得桌面的上下文描述表,即:
CWindowDC dc(GetDeskTopWindow());
在CWindowDC的析构函数中,封装了ReleaseDC()这个函数,因此,不需要再对其进行释放,
其他的操作跟CDC相同,但它仅在窗口的客户区的范围内有效。
CPaintDC:主要是对打印输出进行操作,以后再补充
除了上述利用DC进行基本操作外,在大多数情况下,我们可能需要对绘制的图形添加不同的属性,如字体、颜色、线型、填充性等。这样就要利用到一些GDI对象进行操作了。下面简单说明:
1、CPen类,设置画笔的颜色,线型,线宽等
CPen pen(PS_SOLID,1,RGB(255,0,0));//利用CPen的构造函数,我们可以直接初始化一个对象,第一个参数表示线型,第二个参数为线宽,第三个参数为颜色,其中第三个参数为COLORREF类型,可以用宏RGB来构造。RGB(0,0,0)显示为黑色,RGB(255,0,0)显示为红色,RGB(0,255,0)显示为绿色,RGB(0,0,255)显示了蓝色,RGB(255,255,255)显示为白色。
在画线或者画其他几何形状时,需要将其选入到设备描述表中(下面所有GDI对象也需要进行相同的操作),即:
CClientDC dc(this);
CPen *oldPen=dc.SelectObject(&pen);//返回设备描述表中原来的笔类型,等进行操作完后将其选回设备描述表
……
dc.SelectObject(oldPen);//恢复原来的设置
2、CBrush类,设置画刷的填充类型、颜色或者位图
HDC设备环境句柄
CDC mfc包装的设备环境的基类
CClientDC客户区的设备环境类
CPaintDC是从CDC派生出来的。在构造时自动调用CWnd::BeginPaint,析构时调用CWnd::EndPaint。
通常CPaintDC用来响应WM_PAINT消息。一般应用在OnPaint函数.
CClientDC也是从CDC派生出来的.构造时自动调用GetDC函数,析构时自动调用
ReleaseDC函数.一般应用于客户区窗口的绘制.
阅读(3170) | 评论(1) | 转发(0) |