MFC练习1:通过视类与用户进行简单交互

Ⅰ、在视中响应鼠标输入与画图

1>建立一个简单的文档;

2>建立变量

bool m_bMouseDown; //记录鼠标左键按下
HCURSOR m_hCross;  //十字型鼠标句柄
HCURSOR m_hArrow;  //标准型鼠标句柄
CPoint m_ptOld;    //画线临时点
CPoint m_ptStart;  //画线起点

3>添加鼠标动作响应函数

按下Ctrl+W,添加WM_LBUTTONDOWN(鼠标左键按下消息处理函数)

void CSDIView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bMouseDown=true;  //记录按下左键
	m_ptStart=point;    //画线起点
	m_ptOld=point;      //画线临时点
	SetCapture();       //将鼠标消息发送到视窗口
	CRect rect;
	GetClientRect(&rect);  //得到客户窗口大小
	ClientToScreen(&rect); //将当前窗口坐标转为屏幕坐标
	ClipCursor(&rect);     //把鼠标限定在其参数指定的矩形区域
	SetCursor(m_hCross);   //设置鼠标为十字形
	CView::OnLButtonDown(nFlags, point);
}

说明:

a.当在视察口内按下左键时,就会运行此函数,point即为当前鼠标位置,nFlags识别Ctrl与Shift键是否按下;

b.SetCapture()把以后的鼠标输入消息送到此视窗中;

c.CRect是一个矩形类。

按下Ctrl+W,添加WM_MOUSEMOVE(鼠标移动消息处理函数)

void CSDIView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bMouseDown)
	{
		//CClientDC用于在窗口客户区画图和显示文本
		CClientDC dc(this);
		dc.SetROP2(R2_NOT);
		//擦除从起点到之间移动到的位置之间的临时线
		dc.MoveTo(m_ptStart);
		dc.LineTo(m_ptOld);
		//从起点到当前位置的画线
		dc.MoveTo(m_ptStart);
		dc.LineTo(point);
		//记录当前位置
		m_ptOld=point;
	}
	CView::OnMouseMove(nFlags, point);
}

说明:

a.当鼠标在窗口移动时,此函数以一定的时间间隔被调用;

b.由于鼠标的移动,而此函数又在不断的调用,要擦除许多多余的画线;

c.MoveTo()将画笔移到指定的位置,LiveTo()从当前位置到指定点画直线,SetROP2()设置绘图方式,R2_NOT表示用该位置的相反颜色。

按下Ctrl+W,添加WM_LBUTTONUP(鼠标左键放开消息处理函数)

void CSDIView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bMouseDown)
	{
		m_bMouseDown=false; //一次画图结束
		ReleaseCapture();   //结束鼠标抓取
		ClipCursor(NULL);   //结束鼠标位置的限定
		CClientDC dc(this);
		dc.SetROP2(R2_NOT);
		dc.MoveTo(m_ptStart);
		dc.LineTo(m_ptOld);
		dc.SetROP2(R2_COPYPEN);//使用当前画笔的颜色
		dc.MoveTo(m_ptStart);
		dc.LineTo(point);
		SetCursor(m_hArrow);//恢复标准箭头形
	}	
	CView::OnLButtonUp(nFlags, point);
}

Ⅱ、在视中响应键盘输入与显示字符
1>建立一个简单的文档;

2>建立变量

int m_nLine;//记录已经输入字符的行数
CString m_strDisplay;//字符串

3>添加键盘消息响应函数

按下Ctrl+W,添加WM_CHAR(键盘消息处理函数)

void CSDIView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==VK_RETURN)//如果按下回车
	{
		m_strDisplay.Empty();//将字符串置空
		m_nLine++;
	}
	else if(m_strDisplay.GetLength()<64)m_strDisplay+=nChar;//限定一行只显示64个字符,将按下的字符的ACSII码值加在后面
	CClientDC dc(this);
	TEXTMETRIC tm;   //包含显示字符的尺寸信息的结构体
	dc.GetTextMetrics(&tm);//获得字符尺寸的具体数值
	int nLineHeight=tm.tmHeight+tm.tmExternalLeading;//tmHeight为字符高度,tmExternalLeading为行间距
	dc.TextOut(0,m_nLine*nLineHeight,m_strDisplay);  //起始点x坐标,终点y坐标,字符串
	CView::OnChar(nChar, nRepCnt, nFlags);
}

说明:

a.当按下某键时,OnChar()就被调用,参数nChar为按下键的ASCII码值,nRepCnt是重复次数,nFlags为一些标志

b.TextOut()用于输出字符串。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值