トップ回答者
時計表示のちらつき防止について

質問
-
.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:mms");
}
じっと画面を見ているようなアプリケーションではないので、このままでも
かまわないのですが、気になります。
compact frameworkの場合は、ダブルバッファリングの仕組みが用意されて
いないようなので、自分で作る必要があると思うのですが、初心者なので、
やり方がわかりません。
どなたかご存知の方、お教えいただけないでしょうか。
回答
-
お教えいただいたページだけでは、ちらつきを解消させるにはいたりません
でした。(たぶん、私が理解できていないためと思います)
文字を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:mms");
string time = dt.ToString("HH:mm
s");
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);
}
すべての返信
-
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#あっ、でも直接描いてないんですね。
-
お教えいただいたページだけでは、ちらつきを解消させるにはいたりません
でした。(たぶん、私が理解できていないためと思います)
文字を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:mms");
string time = dt.ToString("HH:mm
s");
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);
}