1 实验介绍

此实验是在刚开始接触MFC时做的。它要求实现的功能如下:

  1. 文字跟随鼠标动态移动(跟随移动方式自定)
  2. 修改图标为自己喜欢的图标
  3. 修改窗口标题
  4. 修改文档名称
  5. 可以用菜单项选定指定的颜色显示文字
  6. 可以用工具栏按钮指定要显示文字的颜色
  7. 可以用菜单项选择要显示的文字
  8. 可以用快捷菜单选择要显示的文字
  9. 在状态栏的第一个窗格显示鼠标的移动位置

我做的主题是简单介绍各类面,如鸡蛋面、炸酱面等。点击鼠标左键,然后就会在点击位置出现所选的面条种类的介绍。具体实现步骤如下。

2 实验步骤

2.1 修改程序图标

具体做法看这里:MFC修改图标

下面是修改后我的res文件截图(倒数第二张‘一碗面’就是我的程序图标):

2.2 修改窗口标题

在工程资源视图那找到string table,然后修改如下:

修改红色框框里的那一项,把马赛克位置的文字改为自己喜欢的窗口标题。

2.3 修改文档名称

在类视图中找到DOC结尾的类,找到它的函数OnNewDocument(),并修改如下:

BOOL C“你的工程名”Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE; // TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档)
CDocument::SetTitle(L"欢迎查看");//修改引号里的内容为“欢迎查看”或你喜欢的文字 return TRUE;
}

2.4 设计菜单栏(选文字和颜色)

将原来的菜单栏删去,改为自己的菜单栏:

增加颜色和文字的子菜单。如:颜色下面增加名为“蓝”的子菜单,ID号为ID_BLUE...等等。我具体添加了什么,看我给出的响应函数就知道了哦。因为响应函数的名字就是ON”ID名“的形式,如ID_BLUE,那其响应函数就是OnBlue()。并为每个子菜单加上ID号,然后根据ID号来写响应消息函数。

/*
颜色响应函数如下:
首先在view类中加一个公共数据 int yanse.用于记录颜色的选择。
*/
void C“你的工程名View::OnYellow()
{
// TODO: 在此添加命令处理程序代码
yanse = 1;
}
void C“你的工程名”View::OnRed()
{
// TODO: 在此添加命令处理程序代码
yanse = 2;
}
void C“你的工程名”View::OnBlue()
{
// TODO: 在此添加命令处理程序代码
yanse = 3;
}
void C“你的工程名”View::OnGreen()
{
// TODO: 在此添加命令处理程序代码
yanse = 4;
}
/*
文字选择的响应函数:
在doc文件中加入公有数据成员:StringDate
初始化: StringData = "想了解更多好吃的面条介绍,请点击菜单栏的文字~ ";
*/
void C“你的工程名”Doc::OnJidanmian()
{
// TODO: 在此添加命令处理程序代码
StringData = "鸡蛋面是一道家常面食,原材料有鸡蛋、面粉、西红柿等.";
}
void C“你的工程名”Doc::OnNiunanmian()
{
// TODO: 在此添加命令处理程序代码
StringData = "牛腩面要先将劲道十足的面下锅,再配上青菜和各种调料,最后在淋上特色牛腩。";
}
void C“你的工程名”Doc::OnLanzhoulamian()
{
// TODO: 在此添加命令处理程序代码
StringData = "兰州拉面是兰州最具特色的大众化经济小吃。";
}
void C“你的工程名”Doc::OnZhajiangmian()
{
// TODO: 在此添加命令处理程序代码
StringData = "炸酱面由菜码、炸酱拌面条而成。";
}

2.5 设计工具栏(选颜色)

工具栏显示可选颜色,将原来的工具栏删去,弄上自己的工具栏,把工具栏颜色按钮的ID号设为对应相同颜色的在菜单栏上的颜色子菜单的ID号一样。同一个ID号使用一个响应函数就行,所以这里就不用再写响应函数了,偷点懒。。

2.6 设计快捷菜单栏(选文字)

新增一个菜单栏,子菜单为可选文字。可选文字的ID要和菜单栏中对应的可选文字一致。然后响应鼠标右键点击的函数:在类向导中,选中类为view类,然后选中消息中的WM_RBUTTONDOWN,然后增加响应。

void C“你的工程名”View::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//ZSR
CPoint pt;
::GetCursorPos(&pt);//获取鼠标坐标
CMenumenu;
//加载菜单
if (!menu.LoadMenuW(IDR_MENU1))
{
return;
}
//获得子菜单
CMenu *pPopupMenu = menu.GetSubMenu(0);//编号为0的子菜单
//弹出菜单
pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); CView::OnRButtonDown(nFlags, point);
}

2.7 设计状态栏(显示当前坐标)

增加鼠标移动响应函数:同上在类向导的view类中找到WM_MouseMove,然后写该响应函数:

void C“你的工程名”View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar;
CString str;
str.Format(_T("(%d,%d)"), point.x, point.y);
CSize size = dc.GetTextExtent(str);
int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_XXX);
pStatusBar->SetPaneInfo(nIndex, ID_INDICATOR_XXX, SBPS_NORMAL, size.cx);
pStatusBar->SetPaneText(nIndex, str);
CView::OnMouseMove(nFlags, point);
}

2.8 修改OnDraw()函数,如下:

void C“你的工程名字”View::OnDraw(CDC*  pDC)
{
C“你的工程名”Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(yanse==1)
pDC->SetTextColor(RGB(255,255,0));
if(yanse==2)
pDC->SetTextColor(RGB(255, 0, 0));
if(yanse==3)
pDC->SetTextColor(RGB(0,0,255));
if(yanse==4)
pDC->SetTextColor(RGB(60, 179,113));
if (!pDoc)
return; // TODO: 在此处为本机数据添加绘制代码 if (!Flag)//没有伧建过Caret则伧建
{
TEXTMETRIC textmetric;
pDC->GetTextMetrics(&textmetric);
CreateSolidCaret(textmetric.tmAveCharWidth / 8, textmetric.tmHeight);
CaretPosition.x = CaretPosition.y = 0;//位置为0,因为一开头没有输入文字,也就没有文字显示
SetCaretPos(CaretPosition);
ShowCaret();
Flag = true;//标记做好了,以后不再伧建
} HideCaret();//
pDC->TextOut(x, y, pDoc->StringData);//输出字符串StringData
CSize charsize = pDC->GetTextExtent(pDoc->StringData);
CaretPosition.x = x + charsize.cx;//
CaretPosition.y = y;
SetCaretPos(CaretPosition);//
ShowCaret();//
}

2.9 鼠标左键响应

增加鼠标左键点击响应函数,具体增加方法参照上面的鼠标右键点击函数的增加。响应函数如下:

/*
鼠标左键点击函数:
*/
void CZSR_作业2_文字随鼠标移动View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//zsr
x = point.x;
y = point.y;
CZSR_作业2_文字随鼠标移动Doc * p = GetDocument();
ASSERT_VALID(p);
//p->StringData.Empty();//清空字符串
//p->
Invalidate();
CView::OnLButtonDown(nFlags, point);
}

3 结果展示

示例:初始样式

示例:蓝色牛腩面

MFC实现文字随鼠标移动的更多相关文章

  1. MFC中状态栏显示鼠标坐标位置

    原文:MFC中状态栏显示鼠标坐标位置,蝈蝈 1,利用MFC向导创建一个应用工程ewq. 2,打开ResourceView,右击Menu菜单,插入Menu,在空白处双击,Caption中填入Point. ...

  2. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  3. css3文字导航鼠标悬停气泡动画特效源码下载

    效果体验:http://hovertree.com/texiao/css3/8/ 效果图: 点击这里下载:http://hovertree.com/h/bjaf/8d5vmddq.htm 更多特效:h ...

  4. 下划线文字,鼠标hover小样式

    CSS样式 //不只是a标签,其他有下划线的字体也可以 a:hover{ color: #ff3100; //这里的颜色是指字体颜色不是波浪下划线效果的svg图颜色     text-decorati ...

  5. 鼠标选择文字事件js代码,增加层问题

    在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...

  6. 不同CSS布局实现与文字鼠标选择的可用性——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2401 一.文字选择的 ...

  7. [MFC]SDI在图片背景上实现文本跟随鼠标移动

    SDI是单文档接口应用程序的简称.本文要实现的是在视图区域显示一张图片,然后在图片表层显示文字,并且文字跟随鼠标移动.思考一下,可以判断这个问题一共分为以下几个部分:1.显示图片:2.找到鼠标的位置: ...

  8. MFC中修改程序图标

    在使用MFC时,我们经常需要修改我们得到的exe文件的图标.如:写一个随机画圆的小程序,我们就希望该程序的图标是个圆或者是和圆有关的图标.所以,在这里我就记录一下我修改图标的步骤. 顺便提一下,我使用 ...

  9. CSS3鼠标移入移出图片生成随机动画

    今天分享使用html+css3+少量jquery实现鼠标移入移出图片生成随机动画,我们先看最终效果图(截图为静态效果,做出来可是动态的哟) 左右旋转 上下移动 缩放 由于时间关系我就不一步步解析各段代 ...

随机推荐

  1. Html添加百度地图

    方法/步骤 1.打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html 如下图: 2.在“1.定位中心点”中,切换城市,并 ...

  2. Tomcat的类加载器

    看完了Java类装载器,我们再来看看应用服务器(Tomcat)对类加载器的使用,每个应用服务器都有一套自己的类加载器体系,从而与Java的类加载器区别开以达到自己与应用程序隔离的目的.Tomcat的类 ...

  3. Java并发编程(十三)在现有的线程安全类中添加功能

    重用现有的类而不是创建新的类,可以降低工作量,开发风险以及维护成本. 有时候线程安全类可以支持我们所有的操作,但更多时候,现有的了类只能支持大部分的操作,此时就需要在不破坏线程安全性的情况下添加一个新 ...

  4. Pairs Forming LCM 在a,b中(a,b<=n)(1 ≤ n ≤ 10^14),有多少组(a,b) (a<b)满足lcm(a,b)==n; lcm(a,b)=p1 ^ max(a1,b1) * p2 ^ max(a2,b2) *..........*pn ^ max(an,bn)

    转自:http://www.cnblogs.com/shentr/p/5285407.html http://acm.hust.edu.cn/vjudge/contest/view.action?ci ...

  5. 008android初级篇之jni中数组的传递

    008android初级篇之jni中数组的传递 jni中在native中数据类型的实际类型 jchar 占两个字节,跟native c中的char(占一个字节)是两个数据类型 jbyte, unsig ...

  6. 用ActivatedRoute获取url中的参数

    突然让我用ActivatedRoute import {Injectable} from "@angular/core"; import {ActivatedRoute} from ...

  7. 一个改动配置文件的linux shell script

    不久以前,以前搜到一篇博客是读取配置文件的,http://www.cnblogs.com/bo083/archive/2012/11/19/2777076.html,用到如今,感觉十分方便.感谢作者. ...

  8. ROS导航之地图costmap_2d与bresenham算法

    读者可以参读http://wiki.ros.org/costmap_2d   costmap_2d: 无论是激光雷达还是如kinect 或xtion pro深度相机作为传感器跑出的2D或3D SLAM ...

  9. W​i​n​下​h​t​t​p​d​+​p​h​p​+​m​y​s​q​l​环​境​集​成

    apache+php+mysql: php下载:  VC6就是legacy Visual Studio 6 compiler,就是使用这个编译器编译的,  VC9就是the Visual Studio ...

  10. odata配置控制器方法路由1

    查看edmx:http://localhost:12769/odata/$metadata 1.配置 ODataConventionModelBuilder builder = new ODataCo ...