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

在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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值