让我们写一个Win32文本编辑器吧-2.计划和显示假若你已然阅读了简介,相信你早已对我们接出来要做的事情有所了解。本文,将会把简介中基础程序更改为一个窗体应用程序。并
让我们写一个Win32文本编辑器吧-2.计划和显示
假如你已然阅读了简介,相信你早已对我们接出来要做的事情有所了解。
本文,将会把简介中基础程序更改为一个窗体应用程序。并对编辑器接出来的编辑计划进行说明。
1.程序改建
阅读过以前我觉得C语言就是个女儿这篇文章的读者应当晓得,编辑器(包括所有Win32应用程序控件),本质上都是一个窗口(WNDCLASSA(已被WNDCLASSEX代替)结构体描述)。
在本节,我们将对上一篇文章所构建的项目进行整修,使其弹出一个主窗体,并附加一个编辑器窗体。
设置项目子系统
在之前,我们为了简便,没有更改vicapp项目的子系统,其默认值为控制台应用程序,所以我们可以用如下代码调用vitality-controls给出的函数vic_prints。
#e:8:f:7:a:0:3:7:f:b:c:3:8:a:2:c:d:e:2:9:c:5:3:b:e:a:2:a:d:f:2:0#
然而,对于一个编辑器来说,应当是一个窗体应用程序。所以,我们要对vicapp进行子系统设置,打开vicapp项目属性(参考上一篇文章),最终设置如下:
#a:5:7:c:8:0:a:6:9:3:b:c:0:b:e:3:e:b:0:e:5:1:1:5:c:2:a:d:2:4:4:c#
更改主程序代码
更改之系统为窗口后,编译程序,会发觉如下错误:
#7:5:d:0:a:2:0:d:5:5:e:d:1:8:9:e:3:5:e:c:7:a:b:d:3:8:b:d:e:c:3:b#
这是由于,链接程序会按照项目设置,去查找不同的主函数名称,而对于窗体应用程序,其主函数名应为WinMain,所以这儿会报找不到符号WinMain,由于我们没有定义它。
对于不同项目类型的启动函数定义,参考文件VS安装目录\VC\Tools\MSVC\14.31.31103\crt\src\vcruntime\exe_common.inl,如今将相关代码列举如下:
#4:5:f:b:8:7:c:c:d:d:2:0:a:6:6:d:e:1:8:2:2:8:a:2:0:f:4:b:1:e:c:6#
可以看见,依据不同的宏定义,函数invoke_main()函数的定义也不相同,因为我们的编辑器应当支持Unicode字符,但是我们是一个窗体应用程序。所以,我们主函数应当参考_SCRT_STARTUP_WWINMAIN宏定义内的主函数定义。
不仅在exe_common.inl中定义了主函数的调用函数,另外,窗体应用程序的主函数还在WinBase.h(该文件可以通过Windows.h查找到#include"WinBase.h"一行,之后打开,或则可以直接引用)文件中做了定义,如下:
#a:8:2:7:4:b:e:6:7:d:9:b:d:a:a:b:9:7:1:6:1:4:e:d:9:9:5:c:8:5:8:2#
按照之前的描述,我们把之前的vitality-controls.h更改为如下代码:
#e:6:b:c:e:5:a:7:3:c:6:8:6:0:9:0:9:3:0:c:2:e:d:8:1:7:5:f:2:d:b:4#
首先,我们将stdio.h的引用,换成了Windows.h,这容许我们使用Windows关于桌面应用程序的API。
其次,我们去不仅vic_print函数的定义。由于该函数主要是上一篇文章测试跨DLL调用函数的测试函数。如今,我们不再须要它。
同时,我们添加了两个函数:
接出来,我们还要实现这两个函数。
在项目vitality-controls的src\include\目录,构建一个common.h文件,输入如下内容:
#1:c:e:2:4:6:9:d:8:d:f:2:b:6:0:d:5:6:7:3:8:2:2:4:3:6:d:6:8:c:3:2#
其中,该文件引入了外部API文件定义,同时,申明了一个宏EDITOR_CLASS_NAME,该宏定义了我们要创建的目标编辑器的类名。
在项目vitality-controls的src\controls\文件夹下,构建一个init.c文件,并编辑如下代码:
#d:7:d:4:c:3:c:0:1:b:b:8:b:7:8:8:4:2:1:7:8:f:9:4:8:4:a:3:0:4:3:4#
在项目vitality-controls的src\controls\文件夹下,构建一个common.c文件,并输入如下代码:
#7:9:2:5:a:a:7:f:0:7:7:1:1:6:8:6:8:1:2:b:6:4:c:a:f:7:5:3:a:6:4:e#
其中,新增了一个TextEditorWindowProc函数,该函数是我们编辑器的反弹函数,参考init.c文件中,对wnd.lpfnWndProc数组的形参。关于反弹函数,参考文档。
最后,让我们更改我们应用程序的主函数,更改项目vicapp的主程序文件vicapp-main.c如下所示:
#6:9:6:b:e:9:d:4:a:a:3:1:d:3:0:6:c:1:2:9:3:7:0:b:8:9:b:3:0:8:8:f#
其中,在出程序的第一句,我们调用了控件初始化函数Vic_Init,并在创建主窗体的风波处理过程中,调用了Vic_CreateEditor函数,创建了一个子窗体,该子窗体就是我们的编辑器。
为了突出显示我们的编辑器,我们在Vic_Init函数中,设置背景颜色为绿色,代码如下:
#9:e:4:0:f:3:2:f:7:f:5:c:e:6:9:5:e:1:a:5:b:f:d:c:c:3:b:2:d:0:9:5#
编译,并运行我们的程序,可以见到如下窗体:
#0:f:9:b:5:1:a:6:6:5:8:6:4:2:7:e:0:a:d:c:b:e:9:c:0:1:0:2:d:6:8:5#
因为我们在处理函数TextEditorWindowProc中,在窗体上勾画了字符串"HELLO"。所以,可以看见界面上出现了"HELLO"的字样,但是背景色为白色。
2.以后的计划
因为代码编辑的过程中,看法可能发生改变,所以未来的计划并不是固定死的,有可能发生变更。
一般情况下,变更的可能有:
尽管计划可能会变更,并且大致的思路如下:
背景设置
在这儿,你将听到,怎么设置背景色,或则将我们的编辑器背景设置为一张图片。
这个过程可能要花费一节。
文本勾画
主要目的是将当前使用GDI的文本勾画转换为DirectWrite勾画。
这个过程可能要花费一节。
光标
在此小节,我们将会看见怎样将光标显示在编辑器的指定位置。
这个过程可能要花费一节。
键盘选择和高亮
在此主题下,我们将会为我们的编辑器添加键盘选择,以及选择区域高亮显示的支持。
这个过程可能要花费2~3个小结。
文本显存结构
这将是一个比较大的主题,由于文件内容在显存中的保存,依据不同的考虑,将会采用不同的显存结构。
这个过程可能要花费2~3个小结。
滚动条实现
因为我们计划让我们的编辑器可编辑的文件尽可能的大,而且Windows自带的滚动条的取值范围有限,所以我们准备实现一个滚动条,其最大取值为UINT64的最大取值,这样我们可以处理总行数就大大降低。
这个过程可能要花费一节。
Unicode支持
这个主题下,我们会对Unicode编码格式做一个简单的介绍,并实现对Unicode字符的显示。
这个过程可能要花费2~3个小结。
文本透明度设置
因为我们的编辑器容许我们设置背景颜色,甚至背景图片,考虑到文本颜色可能和背景色相仿,致使不容易分辨,这么文本的透明渲染就很有必要了。假如我们的文本是透明的,那就可以和背景色相结合,生成更丰富的颜色搭配,起到更好的阅读体验的目的。
这个过程可能要花费1~2个小结。
添加注解
到此为止,我们的编辑器早已可以显示内容,选择内容,上下左右滚动,是时侯添加注解功能了。
这个过程可能要花费1~2个小结。
添加款式支持
这儿所谓的款式,是依据配置,辨识出文件的不同组成部份,之后将给定辨识部份显示为固定颜色。如下方代码:
#8:f:f:b:1:a:e:3:4:3:1:c:1:e:8:c:a:f:c:2:7:a:f:a:e:b:6:2:6:b:a:3#
按照配置,将会分别以不同的颜色/字体显示不同的元素,如类型int将会被显示为红色等等。
这意味着,过了本节,你将起码可以实现一种编程语言的高亮功能。
当前,我们考虑实现C语言的高亮显示。
好了,到此为止,我们早已才能将我们的控件显示下来了,计划也早已说明。假如你有哪些建议,或则发觉程序中有BUG,欢迎到本文档所在项目lets-write-a-edit-control下留言,或则到源代码项目vitality-controls下递交issue。
假如像针对本文留言,关注陌陌公众号编程之路漫漫,码途求知已,天涯觅一心。
#9:e:d:e:4:0:6:c:c:b:a:d:a:b:2:5:8:6:b:a:3:9:3:0:9:e:4:3:2:b:d:f#