在MFC中画笔是CPen类的对象,它用来在DC上完成绘制线条的任务。所谓自定义画笔就越是大家按照自己来创建CPen类对象。在创建了对象之后如果要使用它,则需要调用CDC的成员函数SelectObject()用自定义的画笔替换原有的画笔,该函数的原型为:CPen* SelectObject(CPen *pPen);其参数为想要载入的画笔,返回值为原来画笔的指针。下面是一个绘制多个线条的短代码。
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int red=0,green=0,blue=0;
int width=2;
int row=20;
for(int s=0;s<8;s++)
{
int color=RGB(red,green,blue);
CPen newPen(PS_SOLID,width,color); //创建一个新画笔。
CPen *oldPen=pDC->SelectObject(&newPen);//将自己新定义的画笔载入设备环境中,并返回旧画笔。
pDC->MoveTo(20,row);
pDC->LineTo(800,row); //绘制线条。
pDC->SelectObject(oldPen); //将旧画笔载入设备中。
red+=32;
blue+=8;
green+=16;
width+=2;
row+=30;
}
}
下面是设置线条类型的一些代码
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int style[]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT};//定义了一个线条类型数组
int row=20;
for(int s=0;s<5;s++)
{
CPen newPen(style[s],1,RGB(0,0,0));//定义了一个新画笔
CPen *oldPen=pDC->SelectObject(&newPen);//将新画笔载入设备中,并返回旧画笔
pDC->MoveTo(20,row);
pDC->LineTo(300,row);
pDC->SelectObject(oldPen);//将旧画笔载入设备环境中
row+=30;
}
}
这里简单说一些常用线条的类型
PS_SOLID 实线画笔
PS_DASH 虚线画笔
PS_DOT 点线画笔
PS_DASHDOT 点划线画笔
PS_DASHDOTDOT 双点划线画笔
下面是对画刷的介绍。
画刷是CBrush类的对象,是对封闭图形内部用颜色或图案进行填充的工具,在使用画刷前要创建CBrush类对象,其原型为CBrush(COLORREF color)和
CBrush(int style,COLORREF color);其中第二个函数中的style决定画刷的样式,color决定画刷的颜色。
其中一些常见的style这里说一下
HS_BDIAGONAL 以自左下角至右上角的四十五度斜线填充
HS_CROSS 以十字交叉线填充
HS_DIAGCROSS 以互相交叉的四十五度线填充
HS_FDIAGONAL 以自左上角至右下角的四十五度斜线填充
与使用画笔一样,在创建了画刷之后,如果要是用该画刷,则应该使用CDC的成员函数:CBrush* SelectObject(CBrush *pBrush);
下面是代码
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int red=0,green=0,blue=0;
int row=20;
for(int s=0;s<6;s++)
{
int clr=RGB(red,green,blue);
CBrush newBrush(clr);//创建新画刷
CBrush *oldBrush=pDC->SelectObject(&newBrush);//将新画刷填入设备中,并且返回旧画刷
pDC->Rectangle(20,row,200,row+20);//画矩形
pDC->SelectObject(oldBrush);//将旧画刷填入设备中
red+=34;
green+=16;
blue+=4;
row+=30;
}
int style[]={HS_BDIAGONAL,HS_CROSS,
HS_DIAGCROSS,HS_FDIAGONAL,
HS_HORIZONTAL,HS_VERTICAL}; //定义了一个填充效果数组
row=20;
for(s=0;s<6;s++)
{
CBrush newBrush(style[s],RGB(0,0,0));//创建了新的画刷
CBrush *oldBrush=pDC->SelectObject(&newBrush);//将新画刷填入设备中,并且返回旧画刷
pDC->Rectangle(220,row,400,row+20);//画矩形
pDC->SelectObject(oldBrush);//将旧画刷填入设备中
row+=30;
}
}
在windows中,绘图的最终效果可以通过设定不同的绘图模式 来修饰。设置绘图模式的CDC成员函数为SetROP2(int nDrawMode);其中,参数为绘图模式,返回值为原来的绘图模式。常用的绘图模式如下所说:
R2_BLACK 无论画笔的颜色如何,只用黑色绘图
R2_WHITE 无论画笔的颜色如何,只用白色绘图
R2_NOP 无论画笔的颜色如何,只用无色绘图
R2_NOT 用与背景色相反的颜色绘图
R2_NOTCOPYPEN 用与画笔颜色相反的颜色绘图
R2_COPYPEN 用画笔颜色绘图
R2_XORPEN 把画笔色与背景色进行异或(XOR)运算后的颜色绘图
下面说一些关于字体的一些函数,显示文本要用到TextOut(),其原型为BOOL TextOut(int x,int y,const CString &str);
其中,参数x为文本显示在应用程序窗口用户区的水平位置;y为文本的垂直位置;str为要显示的字符串,它是一个CString类的对象。
设置文本的颜色可以使用成员函数SetTextColor()来进行文本颜色的设置,其原型为irtual COLORREF SetTextColor(COLORREF crColor),其中,参数为文本颜色的RGB值,函数返回原来的颜色。COLORREF GetTextColor() const 为获取当前文本颜色的函数。
virtual COLORREF SetBkColor(COLORREF crColor)为设置当前文本的背景色。同样的也有获取当前文本的背景色的函数COLORREF GetBkColor() const;
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(30,30,"文本的颜色");
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(130,30,"文本的颜色");
pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkColor(RGB(0,0,255));
pDC->TextOut(230,30,"文本的颜色");
}
如果需要改变文本字符之间的间隔时可以使用CDC类的成员函数:int SetTextCharacterExtra(int nCharExtra);该参数是以像素为单位的。另外还有一个获取当前字符间距的函数int GetTextCharacterExtra() const;
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
for(int s=0;s<5;s++)
{
pDC->SetTextCharacterExtra(s*4);
pDC->TextOut(20,20+s*20,"文本字符的间距");
}
}
另外还有一些函数可以用来设置文本的对齐方式,如 UINT SetTextAlign(UINT nFlags);
一些常用的参数值如TA_LEFT为左对齐
TA_CENTER为中间对齐
TA_RIGHT为右对齐
TA_TOP为顶部对齐
TA_BOTTOM为底部对齐
TA_BASELINE为以基线对齐
void CMy9222View::OnDraw(CDC* pDC)
{
CMy9222Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->SetTextAlign(TA_LEFT); //左对齐
pDC->TextOut(220,20,"AAAAAAAAA");
pDC->TextOut(220,40,"HHHHH");
pDC->TextOut(220,60,"SSSSSSSSSSSSSSSSSSS");
pDC->SetTextAlign(TA_CENTER); //中间对齐
pDC->TextOut(220,80,"AAAAAAAAA");
pDC->TextOut(220,100,"HHHHH");
pDC->TextOut(220,120,"SSSSSSSSSSSSSSSSSSSSSS");
pDC->SetTextAlign(TA_RIGHT); //右对齐
pDC->TextOut(220,140,"AAAAAAAAAAAAA");
pDC->TextOut(220,160,"HHHHH");
pDC->TextOut(220,180,"SSSSSSSSSSSSSSSSS");
}