使用MFC绘制一些简单图形

目录

一、画直线

更改画笔样式

二、使用画刷画一个矩形

透明矩形

自定义颜色填充矩形

自定义图形填充矩形

四、实现一个画笔

五、画扇形

六、画椭圆

七、画圆

八、输出文本


一、画直线

    画一条直线需要一个起点和一个终点,当鼠标按下时记录为起点坐标,鼠标弹起时记录为终点坐标。

   首先在类向导增加鼠标左键按下事件,和鼠标左键弹起事件

  通过类向导添加一个CPoint类型的成员变量用来记录鼠标左键按下时的位置

    补充事件代码

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{	
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
    //获得设备上下文
    CDC* pDC = GetDC();
    //移动到起点位置
	pDC->MoveTo(m_pOrigin);
    //从地点到终点画一条直线
	pDC->LineTo(point);
	释放设备上下文
	ReleaseDC(pDC);
	CView::OnLButtonUp(nFlags, point);
}

更改画笔样式

    在MFC中可以通过CPen重新定义一个画笔样式

CPen pen(笔形,线宽,颜色)

  • 笔形:PS_SOLID 实线, PS_DASH 虚线, PS_DOT 点线, PS_DOTDASH 点划线
  • 线宽:像素为单位
  • 颜色:RGB(RED,GREE,BLUR)

    例如想将上面画出的直线改为5像素宽,绿色

    这时候就需要自定义一个画笔,将设备上下文默认的画笔替换下来。但是要注意:当停止使用自定义画笔时需要将设备上下文的默认画笔替换回来

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	//获得设备上下文
	CDC* pDC = GetDC();
	定义画笔
	CPen pen(PS_SOLID, 5, RGB(0,255, 0));
	//替换设备上下文默认画笔,并保留原来画笔
	CPen* pOldPen = pDC->SelectObject(&pen);
	pDC->MoveTo(m_pOrigin);
	pDC->LineTo(point);
	//设备上下文回复原来的画笔
	pDC->SelectObject(pOldPen);
	释放设备上下文
	ReleaseDC(pDC);
	CView::OnLButtonUp(nFlags, point);
}

二、使用画刷画一个矩形

使用画刷绘制矩形时,需要矩形的左上角坐标和右下角坐标,当鼠标按下时记录为左上角坐标,鼠标弹起时记录为右下角坐标。

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	//画刷
	//获得设备上下文,与上面方式相比这种获得设备上下文dc是个局部变量,等程序结束后自动释放,就无序手动释放设备上下文
	CClientDC dc(this);
	//不透明画刷
	dc.Rectangle(CRect(m_pOrigin,point));

	CView::OnLButtonUp(nFlags, point);
}

透明矩形

    如果想画出透明矩形,获得系统定义好的透明画刷,将设备上下文的默认画刷替换下来即可,当透明画刷不使用时需要将原来画刷替换回来

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	//画刷
	//获得设备上下文
	CClientDC dc(this);
	//透明画刷
	//获得系统透明画刷
	CBrush* brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	//更换设备上下文画刷
	CBrush* oldBrush = dc.SelectObject(brush);
	dc.Rectangle(CRect(m_pOrigin, point));
	//设备上下文换回原来的画刷
	dc.SelectObject(oldBrush);

	CView::OnLButtonUp(nFlags, point);
}

自定义颜色填充矩形

想要自定义矩形的填充,只需要绘制填充矩形时将自定义的画刷颜色填充作为参数传入即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	//画刷
	//获得设备上下文
	CClientDC dc(this);
	//画有填充色的矩形
	CBrush brush(RGB(255, 0, 0));
	dc.FillRect(CRect(m_pOrigin, point), &brush);

	CView::OnLButtonUp(nFlags, point);
}

自定义图形填充矩形

    绘制自定义图形填充首先需要在资源视图里添加一个想要填充的图形,这里使用内置资源Bitmap绘制一个想要填充的图片。

第一步:添加Bitmap资源

右击“项目”,选择“添加”,添加“资源”

选择Bitmap,选择新建

第二步:绘制自定义图形

之后在“资源视图”里就可以查看到添加的资源

第三步:加载绘制的图片

声明一个Bitmap,从资源视图里加载刚才绘制的图片,以声明的Bitmap对象为参数,声明一格画刷对象即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;

}

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	//画刷
	//获得设备上下文
	CClientDC dc(this);

	CBitmap bitmap;
	//从资源里加载图片放入bitmap中
	bitmap.LoadBitmap(IDB_BITMAP1);
	//以bitmap为参数,生成画刷对象
	CBrush brush(&bitmap);
	//填充矩形区域
	dc.FillRect(CRect(m_pOrigin, point), &brush);

	CView::OnLButtonUp(nFlags, point);
}

四、实现一个画笔

鼠标左键按下会随着鼠标移动开始绘制,当左键弹起时停止绘制

    添加一个鼠标移动事件“OnMouseMove”,和一各成员参数“m_bDraw(bool)”记录鼠标左键是否被按下。当鼠标移动时首先判断m_bDraw,如果m_bDraw为true则左键按下,开始绘制,否则停止绘制

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
    m_bDraw = TRUE;
	CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{

	//按键抬起置为false
	m_bDraw = false;
	CView::OnLButtonUp(nFlags, point);
}


void CMFCApplication6View::OnMouseMove(UINT nFlags, CPoint point)
{
	CClientDC dc(this);
    //鼠标点击后才画线
	if (m_bDraw) {
		dc.MoveTo(m_pOrigin);
		dc.LineTo(point);
		m_pOrigin = point;
	}
	CView::OnMouseMove(nFlags, point);
}

五、画扇形

扇形只需要在鼠标左键弹起前每次的起点都为鼠标左键按下时的即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
    m_bDraw = TRUE;
	CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{

	//按键抬起置为false
	m_bDraw = false;
	CView::OnLButtonUp(nFlags, point);
}


void CMFCApplication6View::OnMouseMove(UINT nFlags, CPoint point)
{
	CClientDC dc(this);
	CPen pen(PS_DOT, 1, RGB(0, 255, 255));
	//画扇形
	CPen* oldPen = dc.SelectObject(&pen);
	if (m_bDraw) {	
		dc.MoveTo(m_pOrigin);
		dc.LineTo(point);
	}
	dc.SelectObject(oldPen);
	CView::OnMouseMove(nFlags, point);
}

六、画椭圆

    椭圆形绘制机制是在矩形的基础上,只需调用绘制椭圆形函数即可。

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{

	CClientDC dc(this);
	CPen pen(PS_SOLID, 5, RGB(0, 0, 255));
	CPen* oldpen = dc.SelectObject(&pen);
	//画椭圆
	dc.Ellipse(CRect(m_pOrigin, point));

	CView::OnLButtonUp(nFlags, point);
}

七、画圆

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}


void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	m_bDraw = false;
	CClientDC dc(this);
	CPen pen(PS_SOLID, 5, RGB(0, 0, 255));
	CPen* oldpen = dc.SelectObject(&pen);
	//画圆
	long len = point.x - m_pOrigin.x;
	dc.Ellipse(m_pOrigin.x, m_pOrigin.y, m_pOrigin.x + len, m_pOrigin.y + len);


	CView::OnLButtonUp(nFlags, point);
}

八、输出文本

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{
	m_bDraw = false;
	CClientDC dc(this);
	CString str("小明来喽");
	//设置文字颜色
	dc.SetTextColor(RGB(0, 255, 0));
	//设置文字字体
	CFont font;

	//创建点阵字体
	//传递多少点字体,传入200,字体是20
	font.CreatePointFont(200, "华文行楷");
	//输出字符串
	dc.TextOut(point.x, point.y, str, str.GetLength());
	CView::OnLButtonUp(nFlags, point);
}
  • 20
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值