MFC练习1:通过视类与用户进行简单交互
Ⅰ、在视中响应鼠标输入与画图1>建立一个简单的文档;2>建立变量bool m_bMouseDown; //记录鼠标左键按下HCURSOR m_hCross;//十字型鼠标句柄HCURSOR m_hArrow;//标准型鼠标句柄CPoint m_ptOld;//画线临时点CPoint m_ptStart;//画线起点3>添加鼠标动作响应函数
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)