MFC---作画
  5Z6Aj0LQwRjK 2023年12月10日 22 0


变量命名约定

MFC---作画_消息处理

单文档、多文档、对话框

单文档就是一个窗口只能处理一个文档,多文档就是同时可以处理多个,共享工具栏,菜单栏什么的,对话框就是一个提示用户进行选择或者确认的窗体。 对话框模板适合于做交互界面,单文档模板适合于做文件处理,多文档模板适合于做多文件处理。

MFC---作画_消息处理_02

预编译头文件stdafx.h和pch.h头文件说明

stdafx.h和pch.h都是在Windows平台上使用的预编译头文件。都是Microsoft Visual Studio 中自动生成。注意,其他编译器不支持,Microsoft Visual Studio 专用(需要)。
在Visual Studio中,stdafx.h是用于预编译头文件的文件名。当你创建新的项目时,该文件会自动生成,并包含一些常见的头文件,可以加快编译过程,减小编译时间。可以在stdafx.h中包含一些你需要用到的公共头文件。
而在Visual Studio 2017及更高版本中,则将预编译头文件的文件名更改为了pch.h,功能与stdafx.h类似,只是名称不同而已。

简单绘图—画线

知识点 屏幕坐标点
设备上下文(Device Content, DC)
事件

起点和终点 如何捕捉这2点? 鼠标左键按下:起点, 鼠标左键抬起:终点
点如何表示:CPoint

画布

📋CDC *cdc = getDC()
// 画笔移动到起点
cdc.MoveTo(起点)
// 在起点与终点间画一条直线
cdc.LineTo(终点)
ReleaseDC(cdc)

📋CClientDC dc(this)
dc.MoveTo(起点);
dc.LineTo(终点);

连续画线

// Cdraw3View 消息处理程序

void Cdraw3View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//保存起点的成员变量
	m_pOrigin=point;
	//if(m_bDraw){
	//	m_bDraw=false;
	//}else{
	//	m_bDraw=true;
	//}
	//m_bDraw=m_bDraw?false:true;
	//m_bDraw=!m_bDraw;
	m_bDraw=!m_bDraw;
	CView::OnLButtonDown(nFlags, point);
}

void Cdraw3View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	画线
	获得设备上下文
	//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);

	//CClientDC dc(this);
	//默认画刷,白色,不透明
	//dc.Rectangle(CRect(m_pOrigin,point));
	CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	//设备上下文选中画刷
	CBrush* pOldBrush=dc.SelectObject(pBrush);
	//画矩形
	dc.Rectangle(CRect(m_pOrigin,point));
	//恢复原画刷
	dc.SelectObject(pOldBrush);

	CBrush brush(RGB(0,255,255));
	dc.FillRect(CRect(m_pOrigin,point),&brush);

	//CBitmap bitmap;
	//bitmap.LoadBitmap(IDB_BITMAP1);
	//CBrush brush(&bitmap);
	//dc.FillRect(CRect(m_pOrigin,point),&brush);
	  

	CView::OnLButtonUp(nFlags, point);
}

void Cdraw3View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CClientDC dc(this);
	if(m_bDraw){
		dc.MoveTo(m_pOrigin);
		dc.LineTo(point);

		//m_pOrigin=point;
	}

	设备上下文恢复原画笔
	CView::OnMouseMove(nFlags, point);
}

画圆/椭圆/文字

// Cdraw3View 消息处理程序

void Cdraw3View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//保存起点的成员变量
	m_pOrigin=point;
	m_bDraw=!m_bDraw;
	CView::OnLButtonDown(nFlags, point);
}

void Cdraw3View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	//CPen pen(PS_DASH,1,RGB(0,0,255));
	//CPen* pOldpen=dc.SelectObject(&pen);

	画椭圆
	dc.Ellipse(CRect(m_pOrigin,point));

	//2点之间x
	long len=point.x-m_pOrigin.x;
	dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pOrigin.x+len,m_pOrigin.y+len);

	dc.SelectObject(pOldpen);

	CFont font;
	//字体
	font.CreatePointFont(200,_T("华文行楷"));
	CFont* pOldFont=dc.SelectObject(&font);

	CString str(_T("你好我好大家好!"));
	//设备文字颜色
	dc.SetTextColor(RGB(0,0,255));
	//输出字符串
	//dc.TextOut(point.x,point.y,str,str.GetLength());

	//获取文字在屏幕上的空间大小,长度和宽度
	CSize cz=dc.GetTextExtent(str);




	//在指定矩形区域内画文字
	dc.DrawText(str,CRect(point.x,point.y,point.x+cz.cx,point.y+cz.cy),DT_LEFT);

	dc.SelectObject(pOldFont);

	CView::OnLButtonUp(nFlags, point);
}

void Cdraw3View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CView::OnMouseMove(nFlags, point);
}

int Cdraw3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码

	return 0;
}

消息VS事件

消息是系统的,事件是人为的。
比如 单击 事件,其实是鼠标在 按下消息 和 松开消息之后,CButton自己觉得我该告诉上层我被点击了,于是以消息的方式发送给父窗口。 在使用上有什么区别呢? quote] 区别就是,消息一般被我们用来改变UI。 事件才是我们真正处理事情的地方。

文字循环显示

int Cdraw3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码

	//添加定时器
	SetTimer(TIMER_TEXT,200,NULL);


	return 0;
}

void Cdraw3View::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CFont font;
	//字体
	font.CreatePointFont(200,_T("华文行楷"));
	CFont* pOldFont=dc.SelectObject(&font);

	CString str(_T("你好我好大家好!"));
	//设备文字颜色
	dc.SetTextColor(RGB(0,0,255));
	//输出字符串
	//dc.TextOut(point.x,point.y,str,str.GetLength());
	//获取文字在屏幕上的空间大小,长度和宽度
	CSize cz=dc.GetTextExtent(str);
	CRect rect;
	switch(nIDEvent){
		case TIMER_TEXT:
			{
				m_nWidth+=10;
				rect.left=200;
				rect.top=100;
				rect.bottom=rect.top+cz.cy;
				rect.right=rect.left+m_nWidth;

				//在指定矩形区域内画文字,DT_LEEF 从左边开始画,DT_RIGHT从右边开始画,DT_CETER从中间位置开始画
				dc.DrawText(str,rect,DT_LEFT);

				if(m_nWidth>cz.cx){
					m_nWidth=0;
					//使屏幕上的东西全部无效,擦除屏幕上的内容
					Invalidate();
				}


			}
			break;
	}
	dc.SelectObject(pOldFont);
	CView::OnTimer(nIDEvent);
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月10日 0

暂无评论

推荐阅读
5Z6Aj0LQwRjK