2017-02-24 12 views
0

私は私の質問への答えを探して、そして運がないところで、ここ数日間インターネットのいたるところにいました。列挙型と定数、それはどのように機能しますか?

私は、プログラムでの定数の役割と、それらがクラスでどのように参照されているかを理解しようとしています。

Iは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関数を使用してScintillaのに送られしかし、私が把握しようとしていることは、アプリケーションが列挙型の値を受け取って(この場合)テキストを折り返す方法です。.dllファイルと何か関係がありますか?

私のクエスト

  1. なぜいくつかの列挙型は、そのような大きな参照(> 2000)で始まるのですか?
  2. アプリケーションは、希望の出力を実行するために値をどうするかをどのように知っていますか?
  3. 最も重要なことに、列挙型の値を送信することによって実行できる独自の関数を作成するにはどうすればよいのですか?また、プログラムはMY列挙型の値をどのように処理するのかを知っていますか?

可能であれば、私は誰かが私にこのステップを一歩一歩踏み外し、ここで起こっていることの一般的なプロセスについて説明したいと思います。

現在、私は、enum値がメソッドを呼び出す.dllファイルに送信されているように感じていますが、私は方法が間違っている可能性があります。

答えて

2

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++のスキルが必要であり、既存のコードベースを理解しておくことが必要です。

+0

お返事いただきありがとうございます。今は私には分かりやすいものです。 – JMad

関連する問題