zoukankan      html  css  js  c++  java
  • MFC实现文字随鼠标移动

    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 结果展示


    示例:初始样式


    示例:蓝色牛腩面

    【原创声明】转载请标明出处:https://www.cnblogs.com/surecheun/
  • 相关阅读:
    第一天课程总结与心得体会
    面对一切新的事物。
    libgdx学习记录3——动画Animation
    Eclipse编辑器设置
    libgdx学习记录2——文字显示BitmapFont
    libgdx自制简易Flappy Bird
    libgdx学习记录1——图片显示Texture
    libgdx自制简易版Don't Touch The White Tile
    eclipse 最最最常用快捷键
    libgdx退出对话框
  • 原文地址:https://www.cnblogs.com/surecheun/p/9648975.html
Copyright © 2011-2022 走看看