MFC学习心得【画笔字体类】

来源:互联网 发布:矢量量化算法 编辑:程序博客网 时间:2024/05/12 23:42

在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 hereint 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 hereint 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 hereint 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 herepDC->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 herefor(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 herepDC->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");}



0 0
原创粉丝点击