【问题标题】:Enums and constants, how does it all work?枚举和常量,它们是如何工作的?
【发布时间】:2017-02-24 03:56:47
【问题描述】:

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

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

我一直在看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) 中。

我找到了说明其中一些是枚举的文档 (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 函数(类似于Microsoft 的SendMessage 函数)发送到Scintilla。但是,我要弄清楚的是应用程序如何从接收枚举值到(在这种情况下)包装文本。这与.dll 文件有关吗?

所以我的问题是:

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

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

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

【问题讨论】:

    标签: c# dll constants sendmessage native-methods


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您的回复,这对我来说很有意义。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多