■95135 / inTopicNo.7) |
Re[6]: CHARFORMATのデフォルトについて |
□投稿者/ Visual C#初心者 (12回)-(2020/06/25(Thu) 03:39:54)
|
■No95086 (魔界の仮面弁士 さん) に返信 > 2020/06/23(Tue) 07:32:39 編集(投稿者) > > ■No95085 (VisualC#初心者 さん) に返信 > >>作成して頂いたコードですが拡張メソッド化したい場合、 > >>SelectionBold等がboolで宣言されてるのでこれをvoidに変えて > >>みれば良いのでしょうか? > > プロパティを拡張メソッドに変更する場合、setter と getter を別々のメソッドとして提供することになります。 > > たとえば DataRowExtensions では、 > DataRow に対するインデクサの読み書きを > ジェネリックな拡張メソッドにするために、 > getter と setter のペアが用意されています。 > > // getter 系の拡張メソッド > public static T Field<T> (this DataRow row, string columnName) > > // setter 系の拡張メソッド > public static void SetField<T> (this DataRow row, string columnName, T value) > > > ※実際にはもっと多くのオーバーロードがあります。 > https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowextensions > > > で、上記 SetField 拡張メソッドの実装は、 > row[column] = (object)value ?? DBNull.Value; > となっています。 > > >>構造体のCHARFORMAT/CHARFOMAT2構造体 >>の中身とどうリンクさせればいいか思いつかないです。 > 先のサンプルでは、 > public bool SelectionBold > { > get => GetCharFormat_Masks().HasFlag(CFE.Bold); > set => SetCharFormat_Masks(CFM.Bold, value ? CFE.Bold : CFE.None); > } > としていましたので、これを拡張メソッドにするなら、たとえば > public static bool GetSelectionBold (this RichTextBox rtb) => GetCharFormat_Masks(rtb).HasFlag(CFE.Bold); > などとします。 > > > 上記から呼ばれているヘルパーメソッドとなる > private void SetCharFormat_Masks(CFM dwMask, CFE dwEffects) > private CFE GetCharFormat_Masks() > については、インスタンスメソッドから static メソッドに変更したうえで > 引数 RichTextBox rtb を追加しておき、元のサンプルで > new HandleRef(this, Handle) > としていた箇所を > new HandleRef(rtb, rtb.Handle) > と書き換えます。
ご回答ありがとうございます. なんとかメソッドとして実装できましたが, 肝心のBold機能を実装したいです.
> public static void SetSelectionBold (this RichTextBox rtb, bool value) => SetCharFormat_Masks(rtb, CFM.Bold, value ? CFE.Bold : CFE.None);
は恐らく太字の状態ならばデフォルトに戻す機能になって いると思うので,BoldをNone,NoneをBoldに変えてみましたが こちらも上手くいかないです. そもそもSetCharFormat_Masks自体の中身がよく理解できていないので, こちらも併せてご教示頂けますと幸いです.
|
|