如何在 Windows 环境下使用 Scintilla 编辑控件?收藏

2024-01-07 11:32

本文主要是介绍如何在 Windows 环境下使用 Scintilla 编辑控件?收藏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何在 Windows 环境下使用 Scintilla 编辑控件?收藏

新一篇: scintilla 中的代码折叠功能的使用 | 旧一篇: 插件及可扩展性

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

请注意:此文翻译自http://scintilla.sourceforge.net/Steps.html

Scintilla 控件可以在网站http://scintilla.sourceforge.net/index.html上获取。

如何在 Windows 环境下使用 Scintilla 编辑控件?
下面的将逐步介绍如何在 Windows 环境下使用 Scintilla 控件。

如何创建 Scintilla 编辑控件?
首先载入 Scintilla 控件的动态库,如下:
    hmod = LoadLibrary("SciLexer.DLL");
    if (hmod == NULL)
    {
        MessageBox(hwndParent,
                   "The Scintilla DLL could not be loaded.",
                   "Error loading Scintilla",
                   MB_OK | MB_ICONERROR);
    }

如果动态库成功载入,该动态库就已经为我们注册了一个新的 window class。
这个名称为 "Scintilla" 的新 window class 就是 Scintilla 编辑控件。

好了,我们已经可以像使用其他的windows控件一样来使用这个控件了:
    hwndScintillaCreateWindowEx(0, "Scintilla", ""
                    WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,
                    10, 10, 500, 400, hwndParent, (HMENU)GuiID, hInstance, NULL);

请注意这个新的 window class 的名称是 "Scintilla"。到这里,我们实际上已经在我们的 windows 程序中引入了这个 Scintilla 控件。

怎样操作 Scintilla 控件呢?
简单地说,我们可以通过直接向 Scintilla 发送 commands 来操作该控件。有两种方式,一种方式使用起来比较简单而另外一种方式在执行速度上有优势。

操作 Scintilla 控件的简单的方法
这 种方法和我们使用其他的 windows 控件没什么两样。我们可以发送消息给 Scintilla 控件,然后接受来自 Scintilla 控件的通知(notifications )消息(请注意, Scintilla 控件是将这些通知消息都发送到其父窗体上);

Scintilla 能够识别每一个 command,我们可以直接用 SendMessage 函数来向 Scintilla 控件发送消息:

    SendMessage(hwndScintilla, sci_command, wparam, lparam);
譬如:
    SendMessage(hwndScintilla, SCI_CREATEDOCUMENT, 0, 0);
 
有些 commands 是有返回值的,而另外一些命令的参数没有用到,这些参数需要设置成 NULL。


操作 Scintilla 控件的快速的方法
这里所说的快速调用的方法,其实就是在我们的代码中直接调用 Scintilla 编辑控件的消息处理函数。
Scintilla 为我们提供了一个消息处理函数,我们可以获取到这个消息处理函数,然后直接调用这个函数函数来执行相应的 commands。这种方式要比使用 SendMessage 发送消息的处理速度要快。

首先,我们可以通过 SCI_GETDIRECTFUNCTION 和 SCI_GETDIRECTPOINTER 这两个命令来获取到上面提到的消息处理函数和该函数所需要的第一个参数。获取这两个指针我们必须通过 SendMessage :)(译者注:新版本的Scintilla 已经在动态库中导出了相应的函数)

整个过程如下:

    int (*fn)(void*, int, int, int);
    void * ptr;
    int canundo;

    fn = (int (__cdecl *)(void *, int, int, int))SendMessage(
        hwndScintilla, SCI_GETDIRECTFUNCTION, 0, 0);
    ptr = (void *)SendMessage(hwndScintilla, SCI_GETDIRECTPOINTER, 0, 0);

    canundo = fn(ptr, SCI_CANUNDO,0,0);

上面的 "fn" 就是 Scintilla 控件的消息处理函数, "ptr" 就是我们每次调用消息处理函数必须用到的第一个参数。剩下的几个参数分别是 Scintilla 的 command(消息、命令) 和该 Command 的两个可选参数。


如何接受 Scintilla 的通知消息?
一旦某个事件触发了,而且 Scintilla 控件认为需要通知用户,它就会向该控件的父窗体发 WM_NOTITY 消息。 我们收到这个消息后需要根据该消息的实际数据结构进行处理。


我们可以在 Scintilla 的父窗体的消息处理函数中包含类似下面的代码:

    NMHDR *lpnmhdr;

    [...]

    case WM_NOTIFY:
        {
            lpnmhdr = (LPNMHDR) lParam;

            if(lpnmhdr->hwndFrom == hwndScintilla)
            {
                switch (lpnmhdr->code)
                {
                case SCN_CHARADDED:
                    {
                        /* Hey, Scintilla just told me that a new  */
                        /* character was added to the Edit Control.*/
                        /* Now i do something cool with that char. */

                    }break;
                }
            }
        }break;

 

Page contributed by Holger Schmidt.. libbyliugang translate it to chinese.:)

这篇关于如何在 Windows 环境下使用 Scintilla 编辑控件?收藏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/579777

相关文章

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P