vc 绘图

本文介绍了如何在VC环境中使用CPen和CBrush进行图形绘制,包括设置线条颜色、类型和宽度,以及设置形状的填充颜色和花纹。通过调用pDC->LineTo和pDC->Ellipse等函数,可以实现各种线条和图形的绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.dialog中绘图
都是在绘图设备上绘图
如果是在onpaint中可以直接使用CPaintDC dc(this)中的dc去绘图
如果不是在onpaint中则需要先创建绘图设备或者取得绘图设备,
a.取得绘图设备

	CDC *pDC=GetDC();
	pDC->DrawText("hello",CRect(0,0,100,100),DT_LEFT);
b.创建内存绘图设备并贴在实际的设备之上:
是针对图像而言的
CreateCompatibleDC:创建内存DC。这个函数可以创建一个内存DC,使用这个函数绘图时可避免发生图像闪烁的现象,也就是大家常说的“二次缓冲”技术.
在这个内存画布画完图之后,需要将这个画布贴到实际的绘图设备上面,
不过是针对图像而言的,如下直接在内存DC中画文字无法显示
	CDC *pDC=GetDC();
	CDC *pMemDC=new CDC;
	pMemDC->CreateCompatibleDC(pDC);
	pMemDC->DrawText("hello",CRect(0,0,100,100),DT_LEFT);
	StretchBlt(pDC->m_hDC,0,0,100,100,pMemDC->m_hDC,0,0,100,100,SRCCOPY);
        pMemDC->DeleteDC();//释放
所以,如果想在内存DC中画文字然后贴到目标DC中,需要内存DC->SelectObject(&cbmp)
	CDC *pDC=GetDC();

	CDC memdc;
	memdc.CreateCompatibleDC(pDC);

	CRect rect;
	GetClientRect(&rect);

	CBitmap cbmp;
	cbmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); 
	memdc.SelectObject(&cbmp);//选择这个空图像

	memdc.FillSolidRect(rect,RGB(255,255,255));//白色背景
	memdc.DrawText("Hello",CRect(0,0,200,200),DT_LEFT);//在内存DC中输出Hello

	pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);//贴上

	cbmp.DeleteObject();
	memdc.DeleteDC();
	ReleaseDC(pDC);
	


2.画文字
使用CFont设置字体
使用pDC->SetTextColor(RGB(255,0,0));设置文字颜色
使用pDC->FillSolidRect(0,0,100,100,RGB(255,255,0));设置背景颜色
pDC->SetBkMode(TRANSPARENT)设置透明背景
	CDC *pDC=GetDC();

	CFont font;
	font.CreatePointFont(500,"宋体");//创建字体
	pDC->SelectObject(&font);

	pDC->DrawText("Hello",CRect(0,0,500,500),DT_LEFT);//

	font.DeleteObject();//需要释放

3.画线和形状

使用CPen设置线条颜色,类型,宽度
使用CBrush设置形状的填充颜色,花纹等
使用pDC->LineTo,pDC->Ellipse等画线,图形

	CDC *pDC=GetDC();

	CPen pen;
	pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
	pDC->SelectObject(&pen);

	CBrush brush;
	brush.CreateSolidBrush(RGB(255,0,0));
	pDC->SelectObject(&brush);

	pDC->LineTo(100,100);
	pDC->Ellipse(CRect(0,0,100,100));

	pen.DeleteObject();//需要释放
	brush.DeleteObject();//需要释放


4.画图像
使用CBitmap载入位图图像
在内存DC中画位图
将内存DC贴到目标DC
可以使用BITMAP获取bitmp的一些属性,如长宽
	CDC *pDC=GetDC();

	/*
	CRect r;
	GetClientRect(&r);
	pDC->FillRect(&r,NULL);//填充背景
	*/

	CDC memdc;
	memdc.CreateCompatibleDC(pDC);

	CBitmap cbmp;
	cbmp.LoadBitmap(IDB_BITMAP1);
	memdc.SelectObject(&cbmp);

	BITMAP bmp;
	long width,height;
	cbmp.GetBitmap(&bmp);
	width = bmp.bmWidth;
	height = bmp.bmHeight;

	pDC->StretchBlt(0,0,(int)(width*1.5),(int)(height*1.5),&memdc,0,0,
		bmp.bmWidth,bmp.bmHeight,SRCCOPY);


5.取得绘图设备中的某像素点的RGB
	COLORREF color;
	for (int i=0;i<iWidth;i++)
	{
		for (int j=0;j<iHeight;j++)
		{
			color=pDC->GetPixel(i,j);
			BYTE r=GetRValue(color);
			BYTE g=GetGValue(color);
			BYTE b=GetBValue(color);

		}
	}
	pDC->SetPixel(100,90,color);

6.
SetMapMode 设定映射模式
SetWindowExt 设定窗口逻辑尺寸
SetViewportExt 设定视口物理尺寸
SetViewportOrg 设定视口物理坐标原点
a.
画图时比如Rectangle指定的坐标都是逻辑坐标,而在默认情况下逻辑坐标(逻辑单位)=物理坐标(像素单位),即相当于设定了如下4行
CRect rc;
GetClientRect(&rc);
dc.SetWindowExt(rc.right,rc.bottom);//设置窗口逻辑尺寸
dc.SetViewportExt(rc.right,rc.bottom);//设置视口大小,物理坐标
//dc.SetViewportOrg(rc.right/2,rc.bottom/2);//窗口中心为原点
//dc.Rectangle(CRect(0,0,100,100));//以逻辑尺寸画图

此时将dc.SetWindowExt(rc.right,rc.bottom);中的参数改变大小,画出的矩形大小会变化。


b.
dc.SetViewportOrg(100, 100);//设定原点为100,100
CRect rect(0, 0, 200, 200);
dc.Rectangle(rect);


c.
dc.SetWindowOrg(100, 100);//设定100,100为原点
CRect rect(0, 0, 200, 200);
dc.Rectangle(rect);


7.
http://www.cnblogs.com/sxlfybb/archive/2006/06/13/424770.html
CRect rect;
GetClientRect(&rect);//.得到除标题栏和边框之外的客户区,以窗口坐标表示
ClientToScreen(rect);//以屏幕坐标表示

CRect rect;
GetWindowRect(&rect);//得到包括标题栏和边框在内的客户区,以屏幕坐标表示
ScreenToClient(rect);//以窗口坐标表示
可以作为课程设计的程序,实现简单的绘图,移动形的功能。 使用vc框架实现。 GHpaint程序的几个重点 程序的基本功能: 程序提供绘图、删除已绘图形、移动已绘图形。 可以选择绘图颜色、形状、线粗。 重点问题: 1、 程序设计基于面向对象。 程序中所有形都从基类CShapebase派生,大部分工作(例如:删除、移动等)都在这个基类中完成。此类中的两个纯需函数: //纯需函数DrawShape,每个基类都必须实现的函数。 //指定不同形的绘制方法。 virtual void DrawShape(CDC* pdc) = 0; //橡皮筋效果的算法函数 virtual void ZoomShape(CDC *pdc) = 0; 这两个函数需要在派生类中重载。这两个函数中主要实现不同形的绘制方法。 也就是说,不同形的不同点只有绘制方法不同,其他所有属性和行为都可以统一处理。 这里的继承体现了面向对象的设计,论文中可以体现这一点。 2、 动态模板库对象CPtList的使用,动态模板库基础知识。 CPtList是动态模板库的一个实例化类。功能是以链表形式保存指针,至于指针类型不要求,需要程序员自己设计。 本程序CPtList对象中保存所有形对象指针,由于所有形都从CShapebase派生,所以所有形指针都可以转化为基类CShapebase指针后保存在CPtList中。以后再遍历列表,调用形对象函数时出现了多态调用。这里体现面向对象程序的多态,论文中可以说明。 至于CPtList的使用,可以在网上查查,可以看看程序代码,比较简单。 多态:是一种函数调用形式。出现在类继承情况下。详细的多态定义到网上查查。 程序中的多态体现在CShapebase类的虚函数,在使用CShapebase指针调用这两个虚函数,实际调用的使子类的重载函数体。这里实际上是不知道函数怎样工作,但是知道函数功能。 例如:使用CShapebase指针调用DrawShape函数,因为不知道子类是什么形,所以不知道DrawShape怎样画这个,但是直到DrawShape函数会把这个画好,这就达到了要求。 3、 Windows窗口绘图基本知识。 3.1 Windows GUI绘图基本知识。使用MFC类库之后,每个窗口都有一个CDC指针量。这个变量提供形绘制。CDC类说明查查网络,内容比较多。CDC及提供形绘制算法,也提供各种绘制模式(单色、异或色等),提供画笔和画刷的功能。 3.2 窗口绘图基本思想: 形绘制在窗口中,windows不会帮助程序员让形“长在”窗口上,当窗口被遮挡,最小化后,形绘消失。程序需要在合适的时机把形重新画在窗口上。所以窗口上画的内容需要程序员自己思考怎样保存。在本程序中所有形保存在CPtList对象中。 3.2 Windows为窗口提供了一个重绘消息:OnPaint,在winxp系统中,这个消息会在窗口被遮挡部分从新出现、窗口从最小化恢复时调用。在win7种只有窗口从屏幕外移动进屏幕时调用。具体情况可以查查网络,这里是我的发现,并不是主要内容。 在OnPaint消息中重新绘制所有形是一个保证形不消失的好办法。 4、 Windows颜色控制基本知识。 4.1 windows使用RGB三原色(红绿蓝)提供颜色控制,本程序使用24位颜色,在内存中占用4字节,所以用int型表示,但是int型的最高位字节不使用,这样每一种颜色就有一个字节表示,每种颜色级别从0-255。系统提供RGB宏帮助定义颜色,例如:RGB(255,0,0)是红色,RGB(0,0,0)黑色,RGB(255,255,255)白色。 4.2 windows绘图提供多种颜色混合模式,本程序中使用异或模式实现形的“橡皮筋”效果和移动效果,使用纯色模式定位形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值