新建一个MFC 单文档的应用程序"MousePic"。
然后,选择"View(视图)"->"建立类向导",快键键是Ctrl+W。这是MFC非常重要的一个知识点,对话框或单文档设置按钮操作、响应函数都是通过该操作实现。
1.鼠标左键按下
双击函数会定位到"MousePicView.cpp"文件,现在可以对OnLButtonDown()函数进行编辑。其中CPoint point参数记录当前鼠标左键按下的位置,nFlags表示掩码。
//定义一个点类型的变量,用来保存当用户点击界面时点击的位置
CPoint m_point;
//鼠标左键按下
void CMousePicView::OnLButtonDown(UINT nFlags, CPoint point)
{
//把当前点击的点的位置赋给点m_point
m_point = point;
CView::OnLButtonDown(nFlags, point);
}
//鼠标释放:记录当前坐标
void CMousePicView::OnLButtonUp(UINT nFlags, CPoint point)
{
//绘制图形
CDC *p = GetDC();
p->MoveTo(m_point); //鼠标移动到左键按下点
p->LineTo(point); //绘制一条直线 终点为鼠标释放点
CView::OnLButtonUp(nFlags, point);
}
此时鼠标绘制图形如下所示,但是存在两个问题:绘制过程中不可见、绘制结果只是直线。
//定义一个点类型的变量,用来保存当用户点击界面时点击的位置
CPoint m_point;
//定义布尔型变量 m_click=true表示鼠标点击 false表示鼠标释放
bool m_click;
//鼠标左键按下
void CMousePicView::OnLButtonDown(UINT nFlags, CPoint point)
{
//把当前点击的点的位置赋给点m_point
m_point = point;
m_click = true;
CView::OnLButtonDown(nFlags, point);
}
//鼠标释放:记录当前坐标
void CMousePicView::OnLButtonUp(UINT nFlags, CPoint point)
{
//绘制图形
/*
CDC *p = GetDC();
p->MoveTo(m_point); //鼠标移动到左键按下点
p->LineTo(point); //绘制一条直线 终点为鼠标释放点
*/
m_click = false;
CView::OnLButtonUp(nFlags, point);
}
//鼠标移动绘制图形
void CMousePicView::OnMouseMove(UINT nFlags, CPoint point)
{
//定义画笔并选择
CDC *p=GetDC();
CPen pen(PS_SOLID, 4, RGB(255,0,0));
p->SelectObject(pen);
//鼠标按下进行绘制
if(m_click==true) {
p->MoveTo(m_point);
p->LineTo(point);
m_point = point;
}
CView::OnMouseMove(nFlags, point);
}
绘制结果如下所示,相当于一个简单的画图软件。//鼠标移动绘制图形
void CMousePicView::OnMouseMove(UINT nFlags, CPoint point)
{
//定义画笔并选择
CDC *p=GetDC();
CPen pen(PS_SOLID, 1, RGB(255,0,0));
p->SelectObject(pen);
//鼠标按下进行绘制
if(m_click==true) {
p->MoveTo(m_point);
//p->LineTo(point);
p->Rectangle(point.x, point.y,point.x+20, point.y+30);
m_point = point;
}
CView::OnMouseMove(nFlags, point);
}
输出如下所示: //定义画笔绘制矩形
CPen MyPen, *OldPen;
MyPen.CreatePen(PS_DASH, 2, RGB(0,0,255)); //虚线 粗2 蓝色
OldPen = pDC->SelectObject(&MyPen); //旧画笔赋值
//绘制图形
//清除
pDC->SelectObject(OldPen);
MyPen.DeleteObject();
//鼠标按键
void CMousePicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CDC *p = GetDC();
p->MoveTo(m_point); //键盘按下
m_point.x += 40; //水平平移40
p->Rectangle(m_point.x, m_point.y, m_point.x+20, m_point.y+30);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
绘制图形如下所示: 3.响应不同键盘的操作
需要将UINT nChar转换为Char字符型,然后进行盘,WASD进行上下左右移动绘制椭圆。
//鼠标按键
void CMousePicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CDC *p = GetDC();
char cChar; //当前被按下的字符
cChar = char(nChar); //将按下的键转换为字符
//定义画笔
CPen MyPen, *OldPen;
MyPen.CreatePen(PS_DASH, 2, RGB(0,0,255)); //虚线 粗2 蓝色
OldPen = p->SelectObject(&MyPen); //旧画笔赋值
//画刷
CBrush MyBrush, *OldBrush;
MyBrush.CreateSolidBrush(RGB(0,255,0));
OldBrush = p->SelectObject(&MyBrush);
if (cChar == 'D') {
p->MoveTo(m_point); //D键按下
m_point.x += 40; //水平向右平移40
p->Ellipse(m_point.x, m_point.y, m_point.x+20, m_point.y+40);
}
if (cChar == 'A') {
p->MoveTo(m_point); //A键按下
m_point.x -= 40; //水平向左平移40
p->Ellipse(m_point.x, m_point.y, m_point.x+20, m_point.y+40);
}
if (cChar == 'S') {
p->MoveTo(m_point); //S键按下
m_point.y += 50; //竖直向下平移50
p->Ellipse(m_point.x, m_point.y, m_point.x+20, m_point.y+40);
}
if (cChar == 'W') {
p->MoveTo(m_point); //W键按下
m_point.y -= 50; //竖直向上平移50
p->Ellipse(m_point.x, m_point.y, m_point.x+20, m_point.y+40);
}
//清除
p->SelectObject(OldPen);
MyPen.DeleteObject();
p->SelectObject(OldBrush);
MyBrush.DeleteObject();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
绘制如下图所示:
//鼠标按键
void CMousePicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//光标操作
char cChar; //当前被按下的字符
HCURSOR hCursor = 0; //显示光标句柄
HCURSOR hPrevCursor = 0; //以前的光标句柄
cChar = char(nChar); //将按下的键转换为字符
if (cChar == 'A'){
//加载箭头光标
hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
}
if (cChar == 'B'){
//加载箭头光标
hCursor = AfxGetApp()->LoadStandardCursor(IDC_IBEAM);
}
if (cChar == 'C'){
//加载箭头光标
hCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);
}
if (cChar == 'X'){
hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
hPrevCursor = SetCursor(hCursor);
if (hPrevCursor)
DestroyCursor(hPrevCursor);
}
else{
if (hCursor){
hPrevCursor = SetCursor(hCursor);
if (hPrevCursor)
DestroyCursor(hPrevCursor);
}
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
最后展示学生做的成果,虽然代码非常简单,原理也很简单,但是学生做得真的挺好的,原来编程还可以这样上啊,一方面提升学生的学习兴趣,另一方面增加他们的编程能力。
还是那句话,非常佩服学生的创造力及想象力吧!而且编程课原来可以这么进行,提升学生的编程能力的同时也培养了学生的兴趣。希望文章对你有所帮助~
(By:Eastmount 2016-11-20 半夜2点半 http://blog.csdn.net/eastmount/ )