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









本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/362893,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
算法 安全 数据安全/隐私保护
C++ Qt开发:LineEdit单行输入组件
在Qt中,`QLineEdit`是一个用于输入单行文本的控件,它提供了一个允许用户输入和编辑文本的文本框。该组件是Qt的基础控件之一,常用于获取用户的输入,例如用户名、密码、搜索关键字等。是构建用户交互界面的基础组件之一,通常与其他控件一起使用,例如按钮、标签等,以构建完整的用户输入界面。
41 0
C++ Qt开发:LineEdit单行输入组件
|
3月前
|
存储 搜索推荐
Rstudio常用快捷键以及窗口操作有用技巧
Rstudio常用快捷键以及窗口操作有用技巧
138 0
|
9月前
|
C++
C++之MFC制作简单计算器(VS2019实现),附带完整代码
C++之MFC制作简单计算器(VS2019实现),附带完整代码
199 0
x11/xwindow GUI窗口代码范例
x11/xwindow GUI窗口代码范例
138 0
|
前端开发 C语言 C++
Python Tkinter Gui 窗口图标,标签,输入,单复选,文件导入,按钮,日志 等常用组件 基本使用
tkinter是什么? 我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口; Tk是一个图形库,支持多个操作系统,使用Tcl语言开发; Tk会调用操作系统提供的本地GUI接口,完成最终的GUI;
1117 0
Python Tkinter Gui 窗口图标,标签,输入,单复选,文件导入,按钮,日志 等常用组件 基本使用
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
315 0
“想玩点花式?” 试试快捷键操作编辑器吧(Unity3D)
在使用Unity中可能需要使用快捷键执行一些操作,或者修改Unity自带的快捷键,接下来就看一下,如何设置自定义快捷键吧
同时开左右两个SAPGUI编辑器显示同一段ABAP代码
很多文本编辑器都支持同时开左右两个窗口显示同一段代码,使用场景可能是比较同一段代码的不同版本差异,或者是ABAP里,同一段代码在Netweaver不同版本里的实现差异,比如版本为SP1的系统A和版本为SP2的系统B。
126 0
同时开左右两个SAPGUI编辑器显示同一段ABAP代码
MFC怎么用代码改变CComboBox的下拉方式?
MFC怎么用代码改变CComboBox的下拉方式?
137 0
|
C#
用C#开发类似QQ输入法的不规则窗体的程序详解+代码打包分享
QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的。。。等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能。
958 0