0

在过去的几天里,我一直在互联网上寻找我的问题的答案,但没有运气。

因此,我试图了解常量在程序中的作用以及它们在类中的引用方式。

我一直在查看 Scintilla 的源代码,并且已经看到有几个值,例如:

public const int SC_WRAP_NONE = 0;
public const int SC_WRAP_WORD = 1;
public const int SC_WRAP_CHAR = 2;
public const int SC_WRAP_WHITESPACE = 3;

这些位于 NativeMethods.cs 文件(此处)中。

我找到了解释其中一些是枚举的文档( here )。上述示例是自动换行的枚举(按单词、字符或空格换行)。

但是,有一些常量定义如下:

public const int SCI_START = 2000;
public const int SCI_OPTIONAL_START = 3000;
public const int SCI_LEXER_START = 4000;
public const int SCI_ADDTEXT = 2001;
public const int SCI_ADDSTYLEDTEXT = 2002;
public const int SCI_INSERTTEXT = 2003;
public const int SCI_CHANGEINSERTION = 2672;
public const int SCI_CLEARALL = 2004;
public const int SCI_DELETERANGE = 2645;
public const int SCI_CLEARDOCUMENTSTYLE = 2005;
//
// ... list continues
//
public const int SCI_SETWRAPINDENTMODE = 2472;
public const int SCI_GETWRAPINDENTMODE = 2473;

如果将它们用作枚举,我想知道为什么它们以2000.

不仅如此,在类的实现中(以SCI_SETWRAPINDENTMODESCI_GETWRAPINDENTMODE常量为例,值的使用方式如下:

public WrapIndentMode WrapIndentMode
{
    get
    {
        return (WrapIndentMode)DirectMessage(NativeMethods.SCI_GETWRAPINDENTMODE);
    }
    set
    {
        var wrapIndentMode = (int)value;
        DirectMessage(NativeMethods.SCI_SETWRAPINDENTMODE, new IntPtr(wrapIndentMode));
    }
}

这些值使用DirectMessage函数(类似于微软的SendMessage函数)发送到 Scintilla。但是,我要弄清楚的是应用程序如何从接收枚举值到(在这种情况下)包装文本。这与.dll文件有关吗?

所以我的问题是:

  1. 为什么有些枚举以如此大的引用(> 2000)开头?
  2. 应用程序如何知道如何处理这些值以产生所需的输出。
  3. 最重要的是,我如何创建自己的函数,可以通过向它们发送枚举值来执行操作,以及程序如何知道如何处理我的枚举值?

如果可能的话,我希望有人为我逐步分解并解释这里发生的事情的一般过程。

目前我的印象是枚举值被发送到.dll它调用方法的文件中,但我可能还差得很远。

4

1 回答 1

2

请记住,Scintilla 编辑控件最初设计为传统的 Windows 控件,与您在 Winforms 项目的工具箱中找到的 TextBox 或 RichTextBox 控件没有什么不同。ScintillaNET 是它的包装器,就像 .NET TextBox 和 RichTextBox 类是包装器一样,可以轻松地通过 C# 等托管语言使用控件。您链接到的 GitHub 存储库仅包含包装器,而不包含控件本身的代码。

它遵循与此类控件交互的传统方式,您向它发送消息。特定的消息号告诉它要做什么,可选的 wparam 和 lparam 消息参数可能包含附加值。您看到的声明样式是 25 年前声明这些消息和值的方式的样板。

选择消息号码的基本方法是“选择一个号码,任何号码,只要它大于 1024 (WM_USER) 并且是唯一的”。偏移量是必需的,因此它们不会与系统消息(如 WM_CREATE)发生冲突。原作者刚刚决定从 2000 年开始。

特定的消息号告诉控件要做什么以及如何解释消息参数(wparam 和 lparam)。您只能通过为其选择消息编号并修改控件以识别消息并实现功能来添加功能。控件的窗口过程(传统上称为 WndProc)解释消息,您可以在此处查看。请记住,您需要 C++ 技能和对现有代码库的良好理解才能顺利完成。

于 2017-02-24T09:13:28.560 回答