在做一个MFC软件的时候有一个这样的需求,就是要有类似与AutoCad的命令输入框,如下图所示:

File?id=ddwgxw9r_171cd6n7gnz

本着不重写已有功能的原则,在MFC中发掘了一圈,没发现有可用的现成控件,上网搜了一下,发现有人做过,但竟然还收费出售,so faint,只能自己动手做一个。

其实思路还是蛮简单的,就是放个Edit控件处理它的键盘输入事件,防止删除之前的记录和提示信息,还要处理结束命令,比如回车、空格之类的。主要有以下几个步骤:

1. 将输入框内的字符串分段,比如分成三段log, tip和command,前两段都不能被修改,command的内容为可修改的。在结束了command输入后,要同步各字符串,示例代码如下:

void CMainFrame::InitCommand(CString tip)
{
 // 记录老字符串,类似于UpdateData(true)

this->GetText();

// 设置新的log
 if(this->m_log != "")
  this->m_log += "\r\n";
 this->m_log += tip;

// 更新字符串,类似与UpdataData(false)
 this->SetText();

// 将光标置于字符串的尾部(否则光标会在一开始的位置)

((CEdit *)m_commandDialogBar.GetDlgItem(IDC_COMMAND))->SetSel(this->m_log.GetLength(),
  this->m_log.GetLength());
}

2. 重载PreTranslateMessage事件,处理键盘信息,示例代码如下:

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->message == WM_KEYDOWN) // 处理键盘按下事件
 {
  // 判断是否是在脚本输入框上输入的

if(GetFocus() == m_commandDialogBar.GetDlgItem(IDC_COMMAND))
  {
   // 如果选择的是非正在输入的文字,抛弃这个事件

DWORD selectedRegion = ((CEdit *)m_commandDialogBar.GetDlgItem(IDC_COMMAND))->GetSel();
   int selectedStart = LOWORD(selectedRegion);
   int selectedEnd   = HIWORD(selectedRegion);

if(selectedStart != selectedEnd && selectedStart < m_log.GetLength())
    return true;

if(pMsg->wParam == 8 && selectedStart <= m_log.GetLength()) // 阻止删除之前的文字
    return true;

if(pMsg->wParam == 13 || pMsg->wParam == 32) // 当输入空格或回车是发送消息
    this->SendCommand();
  }
 }

return CMDIFrameWnd::PreTranslateMessage(pMsg);
}

其中SendCommand的内容可自定义,处理完成后不要忘记执行1的操作,同步一下字符串就OK。实现效果如下:

File?id=ddwgxw9r_1727cn3nmc7

当然,这是一个最简单的实现,还有很多问题没有处理,比如自定义菜单,屏蔽系统菜单等;还有很多工作可以做,比如封装成一个自定义控件,做更好的显示效果等等。但基本的思路还是一样的,恩,如果谁有更好的实现方案,也欢迎留言,谢谢先:)

MFC中制作一个似命令行的输入框相关推荐

  1. 如何在PowerPoint中制作打字机或命令行动画

    Adding quirky animations to your Microsoft PowerPoint presentation gives your slideshow a little ext ...

  2. 【网络通信】简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用

    简易MFC程序的创建与命令行工具cl.exe.linker.exe的使用 实验目标 实验流程 一.MFC程序 1.创建MFC项目 2.资源与代码 3.演示效果 二.编译连接windows API程序 ...

  3. Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行

    Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行 提问:我运行的是Ubuntu桌面,但是我希望启动后临时进入命令行.有什么简便的方法可以启动进入终端? Linux桌面自带了一 ...

  4. 自己写的python软件可以在哪发布-如何发布一个Python命令行工具

    本文简介 上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,并且发布到PIP和RubyGems上面.在发布PIP包的时候,居然Google不到一篇可以非常好的讲解这个流程的文章.于是整理 ...

  5. python编写请求参数带文件_转载:如何编写一个带命令行参数的Python文件

    看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命 ...

  6. 使用go的ssh包快速打造一个本地命令行ssh客户端

    2019独角兽企业重金招聘Python工程师标准>>> 热身运动? 在开始之前,先来个热身运动.虽然标题党写着快速打造一个ssh客户端,但是和跑步一样,在运动前还是需要先热身一下,不 ...

  7. c语言编程实现二进制计算器,本程序是用纯C语言编的一个基于命令行的四则运算计算器。主要用于计算四则运算表达式的值,同时可以实现四...

    本程序是用纯C语言编的一个基于命令行的四则运算计算器.主要用于计算四则运算表达式的值,同时可以实现四 2016-08-22 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 本程序是用纯C语言 ...

  8. 如何在R代码中找到一个值的行号

    如何在R代码中找到一个值的行号? 例如: 在以下一组值中,如何在第4列中找到特定值的行号? 如何使用R代码命令找到列4中的值"1578"的行号. > mydata_2sex ...

  9. android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果

    如何在Android应用层中制作一个LED指示灯效果 发布时间:2020-12-08 16:12:59 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关如何在Android应用层中 ...

最新文章

  1. python表示复数的语句是_在python中复数如何表示
  2. 通道注意力改进ECANet
  3. 我如何将Google I / O 2018的兴奋带给尼日利亚沃里的115个人
  4. HTTP协议是无状态协议,怎么理解
  5. 我当圣诞老人跳舞啦!
  6. Android Studio (6)---Gradle
  7. nand flash 原理简介
  8. Cloud Foundry 在 Azure 中国正式发布
  9. CUDA memory
  10. 小马激活工具对比暴风激活工具
  11. 善用PPT背景填充,让模板变得耳目一新
  12. 再见,MySQL !
  13. 王牌战争服务器维护中多少才能玩,王牌战争最低配置要求一览 什么手机可以玩...
  14. 如何在Windows上下载java
  15. Linux学习1-Xshell连接阿里云ECS服务器
  16. 世界地图并不是世界的真实样貌!甚至误差非常大
  17. 鄙人最近搞的js购物车程序
  18. 注册登录时,在点击获取验证码按钮后,改变按钮状态
  19. Win10系统默认的输入法如何设置
  20. vue多个页面引用相同组件 在一个页面修改数据 多个页面受影响

热门文章

  1. LAMP_apache安装_2
  2. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
  3. 工作休息之余的生活乐趣
  4. 存储过程编写经验和优化措施
  5. WEB API的安全问题
  6. L2-006. 树的遍历
  7. Spring Security源码分析十三:Spring Security 基于表达式的权限控制
  8. jsp自定自定义标签
  9. UTF-8 BOM头
  10. [转]解读ASP.NET 5 MVC6系列(7):依赖注入