MFC中制作一个似命令行的输入框
在做一个MFC软件的时候有一个这样的需求,就是要有类似与AutoCad的命令输入框,如下图所示:
本着不重写已有功能的原则,在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。实现效果如下:
当然,这是一个最简单的实现,还有很多问题没有处理,比如自定义菜单,屏蔽系统菜单等;还有很多工作可以做,比如封装成一个自定义控件,做更好的显示效果等等。但基本的思路还是一样的,恩,如果谁有更好的实现方案,也欢迎留言,谢谢先:)
MFC中制作一个似命令行的输入框相关推荐
- 如何在PowerPoint中制作打字机或命令行动画
Adding quirky animations to your Microsoft PowerPoint presentation gives your slideshow a little ext ...
- 【网络通信】简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用
简易MFC程序的创建与命令行工具cl.exe.linker.exe的使用 实验目标 实验流程 一.MFC程序 1.创建MFC项目 2.资源与代码 3.演示效果 二.编译连接windows API程序 ...
- Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行
Linux 有问必答:如何在Ubuntu或者Debian中启动后进入命令行 提问:我运行的是Ubuntu桌面,但是我希望启动后临时进入命令行.有什么简便的方法可以启动进入终端? Linux桌面自带了一 ...
- 自己写的python软件可以在哪发布-如何发布一个Python命令行工具
本文简介 上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,并且发布到PIP和RubyGems上面.在发布PIP包的时候,居然Google不到一篇可以非常好的讲解这个流程的文章.于是整理 ...
- python编写请求参数带文件_转载:如何编写一个带命令行参数的Python文件
看到别人执行一个支持命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持命 ...
- 使用go的ssh包快速打造一个本地命令行ssh客户端
2019独角兽企业重金招聘Python工程师标准>>> 热身运动? 在开始之前,先来个热身运动.虽然标题党写着快速打造一个ssh客户端,但是和跑步一样,在运动前还是需要先热身一下,不 ...
- c语言编程实现二进制计算器,本程序是用纯C语言编的一个基于命令行的四则运算计算器。主要用于计算四则运算表达式的值,同时可以实现四...
本程序是用纯C语言编的一个基于命令行的四则运算计算器.主要用于计算四则运算表达式的值,同时可以实现四 2016-08-22 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 本程序是用纯C语言 ...
- 如何在R代码中找到一个值的行号
如何在R代码中找到一个值的行号? 例如: 在以下一组值中,如何在第4列中找到特定值的行号? 如何使用R代码命令找到列4中的值"1578"的行号. > mydata_2sex ...
- android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果
如何在Android应用层中制作一个LED指示灯效果 发布时间:2020-12-08 16:12:59 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关如何在Android应用层中 ...
最新文章
- python表示复数的语句是_在python中复数如何表示
- 通道注意力改进ECANet
- 我如何将Google I / O 2018的兴奋带给尼日利亚沃里的115个人
- HTTP协议是无状态协议,怎么理解
- 我当圣诞老人跳舞啦!
- Android Studio (6)---Gradle
- nand flash 原理简介
- Cloud Foundry 在 Azure 中国正式发布
- CUDA memory
- 小马激活工具对比暴风激活工具
- 善用PPT背景填充,让模板变得耳目一新
- 再见,MySQL !
- 王牌战争服务器维护中多少才能玩,王牌战争最低配置要求一览 什么手机可以玩...
- 如何在Windows上下载java
- Linux学习1-Xshell连接阿里云ECS服务器
- 世界地图并不是世界的真实样貌!甚至误差非常大
- 鄙人最近搞的js购物车程序
- 注册登录时,在点击获取验证码按钮后,改变按钮状态
- Win10系统默认的输入法如何设置
- vue多个页面引用相同组件 在一个页面修改数据 多个页面受影响
热门文章
- LAMP_apache安装_2
- ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
- 工作休息之余的生活乐趣
- 存储过程编写经验和优化措施
- WEB API的安全问题
- L2-006. 树的遍历
- Spring Security源码分析十三:Spring Security 基于表达式的权限控制
- jsp自定自定义标签
- UTF-8 BOM头
- [转]解读ASP.NET 5 MVC6系列(7):依赖注入