VB MDI 文本编辑器

来源:互联网 发布:天蝎网络第三季 编辑:程序博客网 时间:2024/06/05 15:26

简单的 VB MDI 文本编辑器总结

最近兴致来潮,用VB做了一款MDI文本编辑器,在博主的资源页可以下载,在这里把思路和遇到的问题总结一下。界面如下
界面展示

1.设计思路

一个MDI窗体,一个子窗体,一个查找替换窗体,共三个窗体

在MDI窗体设置菜单,子窗体不设置菜单

在MDI窗体放置commondialog控件来实现 打开文件 保存文件 以及 设置字体的功能,该部件需要手动添加Microsoft Common Dialog Control 6.0(sp6)

在子窗体放置richtextbox控件,作为文本框,需要根据窗体大小而改变大小,适中布满整个子窗体。该空间需要手动添加Microsoft Rich Textbox Control 6.0 (sp6)

子窗体中放置2个Label控件,分别位于左下角和右下角,用于显示是否保存以及当前光标的起始位置、选中文本长度,这两个标签需要随窗体的大小变化而调整自己的位置

需要设置在子窗体的richtextbox控件上的右键菜单

查找替换窗体需要设置保持最上层状态

夜间模式的颜色调整

以该编辑器为打开方式时的cmd参数传递

其他小功能

2.遇到的问题总结

1.直接保存与另存为的判断

每次保存都调用commondialog来实现固然编码方便,但是这会让做出来的文本编辑器用起来太麻烦。

博主采取的方式是每当打开文件或者保存好当前文件时,就让当前子窗体的caption为文件的路径,这样的话每次保存的时候,若当前子窗体的caption属性是文件路径的话,就直接覆盖写入该路径的文件,否则调用commondialog来 另存为。

2.另存为时候的覆盖保存问题

另存为 时,若用户输入的文件路径已存在,则提示是否覆盖保存

3.关闭文件时的是否保存判断

在子窗体中使用左下角的标签来记录当前文件的保存状态,若“未保存”,则提示是否保存

4.richtextbox 以及2个label控件的动态变化

在子窗体的risize事件中,改变richtextbox的大小以及label的top,left属性即可

5.richtextbox上的右键菜单

在richtextbox的mouseup事件事件中判断是否是右键,是的话用popupmenu方法弹出编辑菜单

6.撤销功能

使用API函数来完成

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const EM_UNDO = &HC7Private Const EM_CANUNDO = &HC6Private Sub MenuUndo_Click()    If SendMessage(FrmMDINotepad.ActiveForm.ActiveControl.hwnd, EM_CANUNDO, 0, 0) Then        Call SendMessage(FrmMDINotepad.ActiveForm.ActiveControl.hwnd, EM_UNDO, 0, 0)    End IfEnd Sub

7.日期戳时间戳

直接对当前窗体的当前控件的选中文本赋值即可
例如
FrmMDINotepad.ActiveForm.ActiveControl.SelText = Date

8.查找替换窗体的始终最上层显示

调用API函数来完成

Private Declare Function SetWindowPos& Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)Private Sub Form_Load()    Dim myval    myval = SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3)End Sub

9.单字符查找时的bug

博主在写查找功能的代码时,为了避免对有重复块部分的查找时的遗漏(比如ababa ,查找aba时,会找到2个才对),测试时发现这样写会有单字符查找的bug。直接把单字符查询特殊处理了

10.cmd命令的引号问题

生成exe后,将txt的默认打开方式设置为自己写好的文本编辑器,之后双击一个txt文档,这个时候如果程序中没有对cmd命令的判断的话,就算原txt文档是有内容的,打开后也会是空。

处理方法是在MDI的formload事件中写好对cmd命令的判断

Dim cmd As Stringcmd = Command() '获取cmd命令传来的参数

这样cmd就是系统传来的文件路径信息,博主在测试时有遇到引号的问题,比如我们双击打开D盘中的1.txt,cmd可能会是 [ “D:\1.txt” ],或者[ D:\1.txt ] ,很显然,第一种情况下需要对引号进行处理,才可以打开正确的路径。博主没有弄清楚什么时候cmd命令给的路径是带引号什么时候不带,所以直接在程序中加入判断,如果带引号就去掉。高人请不吝赐教~

到这就总结完啦,下面再说一下博主刚开始做这个文本编辑器时折腾的一点东西

这是看同学自己做了个文本编辑器用,蛮好的,所以自己也想做一个自己用。既然是自己用的东西,所以就要添加一些自己的特征啦,自己的习惯啦。然后博主就加了个夜间模式。。。。虽然开启夜间模式后标题栏还是亮的。。。

结束

0 0