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

本文介绍了VC++中如何进行图形绘制,特别是位图的显示过程。首先通过一个UINT变量记录绘制类型,然后详细阐述了显示位图的四个步骤:创建位图、创建兼容DC、将位图选进兼容DC以及将位图贴到当前DC。解释了DC作为设备描述表在图形绘制中的作用,以及兼容DC的概念,以减少屏幕闪烁。同时提到了位图的获取,如通过截屏插入资源并保存。
摘要由CSDN通过智能技术生成
我们先看简单绘图:
对于一个单文档应用程序,我们先为其添加一个菜单:画图,然后为它添加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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值