VC++深入详解(8):图形绘制

我们先看简单绘图:
对于一个单文档应用程序,我们先为其添加一个菜单:画图,然后为它添加4个菜单项:ID_DOT、IDM_LINE、IDM_RECTANGLE、IDM_ELLIPSE。
我们的目标,是当选中其中的一项时,能够在客户区中绘制相应的图形。

首先,我们需要一个UINT类型的变量m_nDrawType来记录我们选择的是哪个类型。并在这4个菜单的响应函数中为其赋值:

void CCH_10_GranphicView::OnDot() 
{
	// TODO: Add your command handler code here
	m_nDrawType = 1;
}

void CCH_10_GranphicView::OnLine() 
{
	// TODO: Add your command handler code here
	m_nDrawType = 2;
}

void CCH_10_GranphicView::OnRectangle() 
{
	// TODO: Add your command handler code here
	m_nDrawType = 3;
}

void CCH_10_GranphicView::OnEllipse() 
{
	// TODO: Add your command handler code here
	m_nDrawType = 4;
}
其次,我们需要捕获鼠标按下和鼠标抬起的消息。这两个消息会告诉我们两个点,通过这两个点,我们可以构造直线、矩形、椭圆。
我们需要一个CPoint成员变量m_ptOrigin来记录鼠标按下去时的点,然后在鼠标抬起中响应:

void CCH_10_GranphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
	CPen pen(PS_SOLID,1,RGB(255,0,0));//设置画笔颜色
	dc.SelectObject(&pen);
	CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//设置画刷为透明
	dc.SelectObject(pBrush);
	switch(m_nDrawType)
	{
	case 1:
		dc.SetPixel(m_ptOrigin,RGB(255,0,0));
		break;
	case 2:
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point.x,point.y);
		break;
	case 3:
		dc.Rectangle(CRect(m_ptOrigin,point));
		break;
	case 4:
		dc.Ellipse(CRect(m_ptOrigin,point));
		break;
	}
	CView::OnLButtonUp(nFlags, point);
}
下面我们实现一个功能:增加一个菜单,通过这个菜单,我们可以修改线的线的宽度、线型、颜色、字体等内容。
先看线宽吧,这个说明白了其他是差不多的。
首先,建立一个对话框,在对话框上放一个静态文本光,命名为“线宽”,然后再放一个编辑框,将其ID改为IDC_LINE_WIDTH。然后我们为这个对话框建立一个从CDialog类派生出来的类CSettingDlg,并将编辑框与这个类的一个UINT型成员变量m_iLinewidth相关联。这样就能用它来记录我们设置的线宽了。然后在我们的view类里面也加上成员变量m_iLineWidth。最后增加一个“设置”菜单项,对其在它的消息响应函数中:

void CCH_10_GranphicView::OnSetting() 
{
	// TODO: Add your command handler code here
	CSettingDlg dlg;
	dlg.m_iLinewidth = m_iLineWidth;//
	if(IDOK == dlg.DoModal())
		m_iLineWidth = dlg.m_iLinewidth;

}
而在OnLButtonUp中:

	CPen pen(PS_SOLID,m_iLineWidth,RGB(255,0,0));//设置画笔颜色
可能有人会觉得奇怪if语句的作用是当点击OK以后࿰
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以作为课程设计的程序,实现简单的绘图,移动图形的功能。 使用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、付费专栏及课程。

余额充值