none
時計表示のちらつき防止について RRS feed

  • 質問

  • .net compact framework 2.0でアプリケーションの開発をしています。
    以下のようなコードで画面に時計を表示させていますが、数秒に1回程度、文字が
    ちらつきます。
            private void timer1_Tick(object sender, EventArgs e)
            {
                // 現在時刻取得
                DateTime dt = DateTime.Now;
                // ラベルに年月日、時刻を表示
                dateNow.Text = dt.ToString("yyy/MM/dd(ddd)");
                timeNow.Text = dt.ToString("HH:mmTongue Tieds");
       }
    じっと画面を見ているようなアプリケーションではないので、このままでも
    かまわないのですが、気になります。
    compact frameworkの場合は、ダブルバッファリングの仕組みが用意されて
    いないようなので、自分で作る必要があると思うのですが、初心者なので、
    やり方がわかりません。
    どなたかご存知の方、お教えいただけないでしょうか。


    2007年6月18日 7:46

回答

  • お教えいただいたページだけでは、ちらつきを解消させるにはいたりません

    でした。(たぶん、私が理解できていないためと思います)

     

    文字をbitmapに変換する方法を調べていたところ、以下のページがあり、

    クリップボードを使って、ダブルバッファと同様のことを行うことで、ちらつきが

    なくなりました。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/158setclpbrd/setclpbrd.html

     

    trapemiyaさん、ありがとうございました。

     

    以下、少々長くなりますが、コードを載せておきます。

    (大部分、コピーさせていただきました。感謝。)

    もし、他に良い方法がありましたら、ご指導よろしくお願いいたします。
          private Bitmap backBuffer = null;
            private void timer1_Tick(object sender, EventArgs e)
            {
                // 現在時刻取得
                DateTime dt = DateTime.Now;
                dateNow.Text = dt.ToString("yyy/MM/dd(ddd)");
    //            timeNow.Text = dt.ToString("HH:mmTongue Tieds");

              string time = dt.ToString("HH:mmTongue Tieds");
                backBuffer = CreateTextBitmap(38, time);

              DataObject data = new DataObject();
                data.SetData(backBuffer);
                Clipboard.SetDataObject(data);

              Invalidate();
            }

          static Bitmap CreateTextBitmap(int size, string text)
            {
                // 指定されたサイズのフォントを作成
                Font myFont = new Font("MS ゴシック", size, FontStyle.Regular);

              // テキストの描画に必要なビットマップのサイズを測定
                Bitmap bmp = new Bitmap(1, 1);
                Graphics g = Graphics.FromImage(bmp);
                SizeF bmpSize = g.MeasureString(text, myFont);

              // 必要なビットマップの幅と高さ
                int w = (int)bmpSize.Width;
                int h = (int)bmpSize.Height;
                
                // brush設定
                SolidBrush fillBrush = new SolidBrush(Color.Blue);
                SolidBrush brush = new SolidBrush(Color.White);

              // ビットマップを作成し、テキストを描画
                bmp = new Bitmap(w, h);
                g = Graphics.FromImage(bmp);
                g.FillRectangle(fillBrush, 0, 0, w, h);
                g.DrawString(text, myFont, brush, 0, 0);

              fillBrush.Dispose();
                brush.Dispose();
                myFont.Dispose();
                g.Dispose();
                return bmp;
            }

          protected override void OnPaint(PaintEventArgs pevent)
            {
                pictureBox2.Image = null;
                IDataObject data = Clipboard.GetDataObject();
                pictureBox2.Image = (Image)data.GetData(DataFormats.Bitmap);
            }

    2007年6月19日 14:03

すべての返信

  • Compact Frameworkそのものになると日本語の資料は少ないようです。

     

    Games Programming with Cheese: Part One
     http://msdn2.microsoft.com/en-us/library/aa446511.aspx#gamesprogwithcheese_topic9

     

    とか

     

    How to Create a Microsoft .NET Compact Framework-based Image Button
     http://msdn2.microsoft.com/en-us/library/aa446518.aspx

     

    でしょうか?

     

    考え方については以下にも載っています。

     

    Pocket PC Signature Application Sample
     http://msdn2.microsoft.com/en-us/library/aa446559.aspx

     

    #あっ、でも直接描いてないんですね。

    2007年6月18日 14:47
    モデレータ
  • trapemiyaさん、返信ありがとうございます。

     

    flickingで検索していましたので、いずれもヒットしなかったページです。

    参考になりそうです。

     

    結果を報告させていただきます。

    2007年6月19日 0:20
  • お教えいただいたページだけでは、ちらつきを解消させるにはいたりません

    でした。(たぶん、私が理解できていないためと思います)

     

    文字をbitmapに変換する方法を調べていたところ、以下のページがあり、

    クリップボードを使って、ダブルバッファと同様のことを行うことで、ちらつきが

    なくなりました。

    http://www.atmarkit.co.jp/fdotnet/dotnettips/158setclpbrd/setclpbrd.html

     

    trapemiyaさん、ありがとうございました。

     

    以下、少々長くなりますが、コードを載せておきます。

    (大部分、コピーさせていただきました。感謝。)

    もし、他に良い方法がありましたら、ご指導よろしくお願いいたします。
          private Bitmap backBuffer = null;
            private void timer1_Tick(object sender, EventArgs e)
            {
                // 現在時刻取得
                DateTime dt = DateTime.Now;
                dateNow.Text = dt.ToString("yyy/MM/dd(ddd)");
    //            timeNow.Text = dt.ToString("HH:mmTongue Tieds");

              string time = dt.ToString("HH:mmTongue Tieds");
                backBuffer = CreateTextBitmap(38, time);

              DataObject data = new DataObject();
                data.SetData(backBuffer);
                Clipboard.SetDataObject(data);

              Invalidate();
            }

          static Bitmap CreateTextBitmap(int size, string text)
            {
                // 指定されたサイズのフォントを作成
                Font myFont = new Font("MS ゴシック", size, FontStyle.Regular);

              // テキストの描画に必要なビットマップのサイズを測定
                Bitmap bmp = new Bitmap(1, 1);
                Graphics g = Graphics.FromImage(bmp);
                SizeF bmpSize = g.MeasureString(text, myFont);

              // 必要なビットマップの幅と高さ
                int w = (int)bmpSize.Width;
                int h = (int)bmpSize.Height;
                
                // brush設定
                SolidBrush fillBrush = new SolidBrush(Color.Blue);
                SolidBrush brush = new SolidBrush(Color.White);

              // ビットマップを作成し、テキストを描画
                bmp = new Bitmap(w, h);
                g = Graphics.FromImage(bmp);
                g.FillRectangle(fillBrush, 0, 0, w, h);
                g.DrawString(text, myFont, brush, 0, 0);

              fillBrush.Dispose();
                brush.Dispose();
                myFont.Dispose();
                g.Dispose();
                return bmp;
            }

          protected override void OnPaint(PaintEventArgs pevent)
            {
                pictureBox2.Image = null;
                IDataObject data = Clipboard.GetDataObject();
                pictureBox2.Image = (Image)data.GetData(DataFormats.Bitmap);
            }

    2007年6月19日 14:03