MFC学习笔记之绘图控制

本文介绍了在MFC中进行图形绘制的方法,包括设置线型、线宽、颜色以及字体。通过添加成员变量控制绘制类型,并响应菜单项来实现不同图形的绘制。文章详细讲解了如何创建对话框来设置线宽、线型、颜色和字体,以及如何处理用户的选择。此外,还讨论了如何避免在改变字体后出现非法操作的问题,以及如何显示位图和自定义按钮的绘图操作。

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

MFC中进行与绘图相关的控制,首先先为VIEW类添加一个成员变量 m_nDrawType,用来指定要画的图形 ,增加相应的菜单项用来绘制 点 直线 矩形 和 椭圆 在菜单项的响应函数中写下面的代码:

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

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

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

void CGraphicView::OnEllipse() 
{
	// TODO: Add your command handler code here
	m_nDrawType = 4;
}

知道每种图形相应的序号,然后就要绘图,先是相应LBUTTONDOWM消息,记录下当前点,然后再响应 LBUTTONUP消息 进行绘图操作,代码如下:

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_ptOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
	
	CPen pen(m_nLineStyle,m_nLineWidth,m_clr);
	dc.SelectObject(&pen);
	
	CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	dc.SelectObject(pBrush);
	
	switch(m_nDrawType)
	{
	case 1:
		dc.SetPixel(point,m_clr);
		break;
	case 2:
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point);
		break;
	case 3:
		dc.Rectangle(CRect(m_ptOrigin,point));
		break;
	case 4:
		dc.Ellipse(CRect(m_ptOrigin,point));
		break;
	}	
	CView::OnLButtonUp(nFlags, point);
}

其中m_pOrigin 是CPoint类的对象,变量 m_nLineStyle m_nLineWidth 在后面会用到,分别是线的样式和线的宽度。

为了在绘图过程中用透明画刷填充图形内部,所以用GetSocokObect()函数

HGDIOBJ GetStockObject(  int fnObject   // stock object type);

关于它的参数可以在MSDN中查到,他的返回值是HGDIOBJ类型的,我们需要将他转换为HRUSH类型的 因为我们要调用 CBrush类的一个静态成员函数FromHandle将画刷句柄转换为相应的画刷指针。

接下来要创建一个设置绘画相关属性的对话框 该对话框最终的样子是下面这样的:



相应的需要创建一个新的编辑框的类,这里类名是 CSettingDlg

现在先从创建线宽这个编辑框开始,编辑框ID设为 IDC_LINE_WIDTH ,然后在菜单项中增加一个设置的菜单项,在响应该菜单项的函数中显示该对话框,为了将用户输入的线宽保存下来,当然要为该编辑框关联一个变量 UINT类型的 m_nLineWidth 然后在用户输入完线宽按OK后将该值保存到VIEW类的m_nLineWidth中,为了用户再次打开的时候可以看到自己上次设的线宽是多少,我们将VIEW类中m_nLineWidth的值赋给对话框的m_nLineWidth ,下面是VIEW类的设置菜单项的响应函数:

void CGraphicView::OnSetting() 
{
	CSettingDlg dlg;
	dlg.m_nLineWidth = m_nLineWidth;
	dlg.m_nLineStyle=m_nLineStyle;
	dlg.m_clr = m_clr;
	if(IDOK==dlg.DoModal())
	{
		m_nLineWidth = dlg.m_nLineWidth;
		m_nLineStyle = dlg.m_nLineStyle;
	}
}

里面还有其他变量的赋值操作,在下面会说到。

当我们得到用户给定的线宽后,在LBUTTONUP响应函数中,就要将画笔对象的线宽参数改为m_nLineWidth了,这样就可以了。

现在再添加一个设置线形的组框,在其中添加三个单选按钮,标题如上图所示。我们在MFC APPWizard中要为单选框关联变量时,并没有看到他们的ID,这是因为在一个组框中的单选框,要将第一个单选按钮的属性中的Groud勾上,这样就可以找到第一个单选按钮的ID了,为它关联一个变量 m_nLineStyle,可以看到在对话框的构造函数中,它被初始化为-1了,当我们选中第一个单选按钮的时候,它的值是0,以此类推。和上面的线宽的一样,也是要让VIEW类保存用户选择的线型。

这里要再说一个知识点,就是画笔的属性比如 PS_SOLID PS_DASH PS_DOT 这些都是在MFC底层代码中定义好的一些常量,我们可以通过在CPEN类的对象构造函数的相应属性,点击右键 然后GO to Definition of... 去看到那些画笔样式的定义。

/* Pen Styles */
#define PS_SOLID            0
#define PS_DASH             1       /* -------  */
#define PS_DOT      
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值