情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

C#でWIN32API step12 文字描画(その2)

step8:ここまでのまとめ(その1)

step9:FPSを測定する

step10:図形描画

step11:文字描画(その1)

今回は、前回解説した文字描画の応用例として、以前作ったCustomOutクラスを使用して標準出力に出力されるFPS値をメインウィンドウにも表示されるようにしてみます。

まず、CustomOutクラスを再掲します。

public delegate void CustomOutProc(string text, TextWriter stdout);

public class CustomOut : TextWriter
{
    public CustomOut()
    {
        if (stdout == null)
            stdout = Console.Out;

        innerout = Console.Out;

        Console.SetOut(this);
    }

    private static TextWriter stdout = null;
    private TextWriter innerout = null;

    public CustomOutProc Beforehand { get; set; }
    public CustomOutProc Afterward { get; set; }

    public override Encoding Encoding
    {
        get { return innerout.Encoding; }
    }

    private void InnerWrite(string text)
    {
        if (Beforehand != null)
            Beforehand(text, stdout);
        innerout.Write(text);
        if (Afterward != null)
            Afterward(text, stdout);
    }

    private void InnerWriteLine(string text)
    {
        if (Beforehand != null)
            Beforehand(text, stdout);
        innerout.WriteLine(text);
        if (Afterward != null)
            Afterward(text, stdout);
    }

    public override void Write(bool value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(char value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(char[] buffer)
    {
        InnerWrite(new string(buffer));
    }

    public override void Write(char[] buffer, int index, int count)
    {
        InnerWrite(new string(buffer, index, count));
    }

    public override void Write(decimal value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(double value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(float value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(int value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(long value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(object value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(string format, object arg0)
    {
        InnerWrite(string.Format(format, arg0));
    }

    public override void Write(string format, object arg0, object arg1)
    {
        InnerWrite(string.Format(format, arg0, arg1));
    }

    public override void Write(string format, object arg0, object arg1, object arg2)
    {
        InnerWrite(string.Format(format, arg0, arg1, arg2));
    }

    public override void Write(string format, params object[] arg)
    {
        InnerWrite(string.Format(format, arg));
    }

    public override void Write(string value)
    {
        InnerWrite(value);
    }

    public override void Write(uint value)
    {
        InnerWrite(value.ToString());
    }

    public override void Write(ulong value)
    {
        InnerWrite(value.ToString());
    }

    public override void WriteLine()
    {
        InnerWriteLine("");
    }

    public override void WriteLine(bool value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(char value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(char[] buffer)
    {
        InnerWriteLine(new string(buffer));
    }

    public override void WriteLine(char[] buffer, int index, int count)
    {
        InnerWriteLine(new string(buffer, index, count));
    }

    public override void WriteLine(decimal value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(double value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(float value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(int value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(long value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(object value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(string format, object arg0)
    {
        InnerWriteLine(string.Format(format, arg0));
    }

    public override void WriteLine(string format, object arg0, object arg1)
    {
        InnerWriteLine(string.Format(format, arg0, arg1));
    }

    public override void WriteLine(string format, object arg0, object arg1, object arg2)
    {
        InnerWriteLine(string.Format(format, arg0, arg1, arg2));
    }

    public override void WriteLine(string format, params object[] arg)
    {
        InnerWriteLine(string.Format(format, arg));
    }

    public override void WriteLine(string value)
    {
        InnerWriteLine(value);
    }

    public override void WriteLine(uint value)
    {
        InnerWriteLine(value.ToString());
    }

    public override void WriteLine(ulong value)
    {
        InnerWriteLine(value.ToString());
    }
}

CustomOutクラスを使用する小さなクラスFPSを作ります。このクラスではFPS値をキューに格納しています。

public class FPS
{
    public Queue<string> results = new Queue<string>();

    private CustomOut customOut = null;

    public FPS()
    {
        customOut = new CustomOut();
        customOut.Beforehand = (text, stdout) =>
        {
            results.Enqueue(text);
        };
    }
}

メインクラスに新たな変数を宣言します。

private static FPS fps = new FPS();
private static string fps2 = "";

WM_PAINTメッセージプロシージャを以下のように変更します。

キューに新しいFPS値が格納されている場合には描画文字列を更新します。

private static IntPtr WM_PAINT(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
    WIN32.Draw.PAINTSTRUCT paintstruct;

    IntPtr hdc = WIN32.Draw.BeginPaint(hWnd, out paintstruct);

    while (fps.results.Count > 0)
        fps2 = "FPS=" + fps.results.Dequeue();

    WIN32.Window.RECT rect = new WIN32.Window.RECT();
    rect.left = 0;
    rect.top = 0;
    rect.right = 100;
    rect.bottom = 100;
    WIN32.Draw.DrawText(hdc, fps2, fps2.Length, ref rect, 0);

    WIN32.Draw.EndPaint(hWnd, ref paintstruct);

    return IntPtr.Zero;
}

結果は以下のようになります。最新のFPS値が表示されているのが分かります。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#, WIN32API