C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 確実な後処理の実装方法


(過去ログ 120 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■70464 / inTopicNo.1)  確実な後処理の実装方法
  
□投稿者/ ぶなっぷ (1回)-(2014/03/28(Fri) 11:14:29)

分類:[C#] 

はじめまして、ぶなっぷです。

このたび、仕事で初めてのC#+XAMLということで悪戦苦闘中です(笑)

自作コントロールの描画をCanvas派生クラスのOnRender()にて行っています。
DrawingContextを使用したテキストの描画において、
DrawingContext.DrawText()の第一引数に与えるFormattedText()クラスの
インスタンスなんですが、、、

コンストラクタの引数の多さにうんざり。
しかも、ほとんどの引数が毎回同じ値を代入するだけ。

そこで、以下のようなるFormattedTextの派生クラスを作成しました。

class MyFmtText : FormattedText
{
// デフォルト値
public static string DEF_FONTNAME { get; set; } // フォント名
public static double DEF_FONTSIZE { get; set; } // フォントサイズ
public static Brush DEF_BRUSH { get; set; } // ブラシ
public static CultureInfo DEF_CULTURE { get; set; } // カルチャー
public static string DEF_CULTURESTR // カルチャー(文字列指定)
{
// setアクセサのみ
set {DEF_CULTURE = CultureInfo.GetCultureInfo(value);}
}

// デフォルト値の初期化
public static void InitializeDefaltValue()
{
DEF_FONTNAME = "Arial";
DEF_FONTSIZE = 10.0;
DEF_BRUSH = Brushes.Black;
DEF_CULTURE = CultureInfo.CurrentCulture;
}

// コンストラクタ(static)
static MyFmtText()
{
InitializeDefaltValue();
}

// コンストラクタ(instance) - 文字列のみ指定(文字列は左寄せ)
public MyFmtText(string Text)
: base(Text, DEF_CULTURE, FlowDirection.LeftToRight,
new Typeface(DEF_FONTNAME), DEF_FONTSIZE, DEF_BRUSH)
{
}

// コンストラクタ(instance) - 文字列と文字幅,Alignment指定
// (Alignment未指定時、文字列は右寄せ)
public MyFmtText(string Text,
double Width, TextAlignment Alignment = TextAlignment.Center)
: base(Text, DEF_CULTURE, FlowDirection.LeftToRight,
new Typeface(DEF_FONTNAME), DEF_FONTSIZE, DEF_BRUSH)
{
MaxTextWidth = Width;
TextAlignment = Alignment;
}
}

使うときはこんな感じです。
protected override void OnRender(DrawingContext DC)
{
MyFmtText.DEF_BRUSH = Brushes.Red;
DC.DrawText(
new MyFmtText("テキスト文字列"),
new Point(10, 10));
}

非常に便利になったのですが、1点。
staticデフォルト値を初期化し忘れると、思わぬところに思わぬフォーマットの文字が(^-^;

C++ならデストラクタで、InitializeDefaltValue()呼ぶとかできるんですが、
C#だと、デストラクタなんていつ呼ばれるか分からないし、Dispose()実装してもusingして
もらえなかったら無意味だし、、、
C++で言うデストラクタのような、うまい方法はあるのでしょうか?

引用返信 編集キー/
■70465 / inTopicNo.2)  Re[1]: 確実な後処理の実装方法
□投稿者/ Hongliang (185回)-(2014/03/28(Fri) 11:21:50)
派生クラスにする必要がありますかね?

class FormattedTextFactory {
    public FormattedText Create(string text) {
        return new FormattedText(text, ...);
    }
    public string FontName { get; set; }
    public double FontSize { get; set; }
    ...
}

としておいて、使用者側で
static FormattedTextFactory typeA;
static FormattedTextFactory typeB;
というように必要に応じてFactoryを使い分ければいいのではないでしょうか?

引用返信 編集キー/
■70466 / inTopicNo.3)  Re[2]: 確実な後処理の実装方法
□投稿者/ ぶなっぷ (2回)-(2014/03/28(Fri) 12:03:53)
Hongliangさん。

言われてみればそうですね。
最初に見たサンプルが以下のようなものだったので、

drawingContext.DrawText( new FormattedText(Text,
 ... (以下略)

FormattedTextのインスタンスをnewして与えることに凝り固まっていた
ようです(^-^;

インスタンス生成機(FormattedTextFactory)を作れば、万事解決です。
早速、そのようにコード修正します。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -