解決したいこと
・下記の画像の通り、メニューバーを作成したのですが画面遷移をする際に、遷移後のFormが開くことによって生じる画面のちらつきをなくしたいです。
ちらつきをなくしたいのですが、なるべくコードは、基底クラスでメニューバー生成処理を記述して、そのメニューバーを派生クラスで利用する形にしたいです。
自分で試してみたこととして、DoubleBufferedを有効にするためにコンストラクタに、「this.DoubleBuffered = true;」や「SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true);」を追加してみたのですが、画面のちらつきはなくなりませんでした。何か良い方法があればご教授いただけると幸いです。
コードは下記の通りとなります。
c#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp2 12{ 13 // 基底Formクラス 14 public partial class FormBase : Form 15 { 16 private Label menuberLbl; // メニューバー表示に利用するラベル 17 public static int LBL_CNT = 4; // メニューバーで表示するラベルの数 18 private Panel menuPnl; // メニューバー生成時にラベルを張り付けるためのパネル 19 20 public FormBase() 21 { 22 InitializeComponent(); 23 // 全画面表示 24 this.WindowState = FormWindowState.Maximized; 25 26 // メニューバー作成処理 27 // パネル生成処理 28 menuPnl = new Panel(); 29 menuPnl.Location = new Point(90,50); 30 menuPnl.Size = new Size(240, 30); 31 menuPnl.BackColor = Color.FromArgb(255, 255, 255); 32 this.Controls.Add(menuPnl); 33 34 // ラベル生成処理 35 List<Label> lblList = new List<Label>(); 36 for (int i = 0; i < LBL_CNT; i++) 37 { 38 menuberLbl = new Label(); 39 menuberLbl.Name = "lbl" + (i+1); 40 menuberLbl.Font = new Font("MS UI Gothic", float.Parse("9.75"), FontStyle.Bold); 41 menuberLbl.TextAlign = ContentAlignment.MiddleLeft; 42 menuberLbl.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 43 menuberLbl.AutoSize = false; 44 menuberLbl.Size = new Size(60, 30); 45 menuberLbl.Location = new Point(1+(60 * i), 1); 46 menuberLbl.BackColor = Color.FromArgb(255, 255, 255); 47 menuberLbl.ForeColor = Color.FromArgb(0, 0, 0); 48 menuberLbl.Text = "メニュー" + (i + 1); 49 menuberLbl.Click += new EventHandler(sideLbl_Click); 50 lblList.Add(menuberLbl); 51 } 52 foreach (Label lbl in lblList) 53 { 54 menuPnl.Controls.Add(lbl); 55 menuberLbl.BringToFront(); 56 } 57 58 } 59 60 // 画面遷移 61 private void sideLbl_Click(object sender, EventArgs e) 62 { 63 if (((Label)sender).Name == "lbl1") 64 { 65 Form1 f1 = new Form1(); 66 f1.Show(); 67 this.Visible = false; 68 } 69 else if (((Label)sender).Name == "lbl2") 70 { 71 Form1 f1 = new Form1(); 72 f1.Show(); 73 this.Visible = false; 74 } 75 else if (((Label)sender).Name == "lbl3") 76 { 77 Form1 f1 = new Form1(); 78 f1.Show(); 79 this.Visible = false; 80 } 81 else if (((Label)sender).Name == "lbl4") 82 { 83 Form1 f1 = new Form1(); 84 f1.Show(); 85 this.Visible = false; 86 } 87 } 88 } 89}
c#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp2 12{ 13 public partial class Form1 : FormBase 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 } 20}
お手数をおかけしますがどうぞよろしくお願いいたします。
このコードだとラベルをクリックするたびに Form1 がどんどん生成されて、画面を閉じても終了できないんですが、その辺はどう考えてますか?
返信が遅くなってしまい申し訳ございません。
重要なご指摘ありがとうございます。
ご指摘の通り、画面を閉じても終了しない点については考慮が欠けていました。
自分でも調べてみて下記のように画面遷移のコードを変更してみました。
下記のコードで考慮が足りない場合は、ご指摘いただけると幸いです。
if (((Label)sender).Name == "lbl1")
{
Form1 f1 = new Form1();
f1.Owner = this;
f1.Show();
this.Hide();
f1.Owner.Show();
f1.Close();
}
それだと f1 のインスタンスを立ち上げて、一瞬表示した後閉じてるので意味がありません。
Runメソッドの引数を変更するようにコードを修正してみようと思います。
回答4件
あなたの回答
tips
プレビュー