【发布时间】: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_SETWRAPINDENTMODE和SCI_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 文件有关吗?
所以我的问题是:
- 为什么有些枚举以如此大的引用 (>2000) 开头?
- 应用程序如何知道如何处理这些值以产生所需的输出。
- 最重要的是,我如何创建自己的函数,可以通过向它们发送枚举值来执行操作,以及程序如何知道如何处理我的枚举值?
如果可能的话,我希望有人为我逐步分解并解释这里发生的一般过程。
目前我的印象是枚举值被发送到一个.dll 文件,在该文件中它调用了一个方法,但我可能还差得很远。
【问题讨论】:
标签: c# dll constants sendmessage native-methods