2017-08-22 88 views
1

我想在C#Windows窗體中製作一個Windows覆蓋圖,但它不會填充我的設置上的第二個屏幕。我使用的命令找出所有的屏幕分辨率:C#窗體不會填滿整個屏幕

表1:

Rectangle a; 
    Rectangle b; 
    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Hide(); 
     pictureBox2.Hide(); 
     Positions(); 
     int i = 0; 
     foreach (Screen S in AllScreens) 
     { 
      if (i == 0) 
      { 
       a = S.Bounds; 
       i++; 
      } 
      else 
      { 
       b = S.Bounds; 
      } 
     } 
     FormBorderStyle = FormBorderStyle.None; 
     Work(); 
     IDK(b); 
    } 
    void Work() 
    { 
     Height = a.Height; 
     Width = a.Width; 
    } 
    void MsgBox(string a) 
    { 
     MessageBox.Show(a); 
    } 
    void IDK(Rectangle b) 
    { 
     int showOnMonitor = 1; 
     Screen[] sc; 
     sc = AllScreens; 
     Form2 f = new Form2(b) 
     { 
      FormBorderStyle = FormBorderStyle.None, 
      Left = sc[showOnMonitor].Bounds.Left, 
      Top = sc[showOnMonitor].Bounds.Top, 
      StartPosition = FormStartPosition.Manual 
     }; 
     f.Show(); 
    } 
    void Positions() 
    { 
     label1.Location = new Point(
     Width/2 - label1.Width/2, 
     Height/2 - label1.Height - 40); 
     label1.Anchor = AnchorStyles.None; 
     button1.Location = new Point(
     Width/2 - button1.Width/2, 
     Height/2 - button1.Height + 40); 
     button1.Anchor = AnchorStyles.None; 
     linkLabel1.Location = new Point(
     Width/2 - linkLabel1.Width/2, 
     Height/2 - linkLabel1.Height + 500); 
     linkLabel1.Anchor = AnchorStyles.None; 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     LoadGUI(); 
     MsgBox(Width.ToString()); 
     MsgBox(Height.ToString()); 
    } 
    void LoadGUI() 
    { 
     label1.Hide(); 
     button1.Hide(); 
     linkLabel1.Hide(); 
     pictureBox1.Show(); 
     pictureBox1.Location = new Point(20, 20); 
     pictureBox1.Anchor = AnchorStyles.None; 
     pictureBox2.Show(); 
     pictureBox2.Location = new Point(20, 188); 
     pictureBox2.Anchor = AnchorStyles.None; 
    } 
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     Application.Exit(); 
    } 

表2:

Rectangle a; 
    public Form2(Rectangle b) 
    { 
     InitializeComponent(); 
     a = b; 
     Work(); 
    } 
    void Work() 
    { 
     Height = a.Height; 
     Width = a.Width; 
    } 
    private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Application.Exit(); 
    } 

的問題是,表2不會充滿整個第2屏幕。 我不知道爲什麼屏幕沒有完全填滿,代碼工作了一天前,但它後Windows更新(我不知道這是否是問題。)。對於我所知道的這將永遠不會工作...任何幫助將不勝感激。 -Alex

圖片證明: Image (右下)

回答

2

我設法複製這一點。我檢查屏幕WorkingArea相比界:

屏幕[0]

屏幕\ \ DISPLAY1;

界限:{X = 0,Y = 0,Width = 1920,Height = 1080};

工作區域:{X = 0,Y = 0,寬度= 1920,高度= 1040}

屏幕[1]

屏幕\ \ DISPLAY2;

界限:{X = -1920,Y = -74,Width = 1920,Height = 1080};

工作地區:{X = -1920,Y = -74,寬1920,高1080 =}

我想這可能是事做與Y-74,但沒」解釋寬度。

最終,在玩了一下之後,我設法讓它按照你的意圖顯示,並且我簡化了一下。

實際的修復是代替設置表單大小,我使用form.SetBounds(),通過它的屏幕邊界。我包好了一個簡單的函數,你傳遞給它的形式和屏幕:

public static class SetScreen 
{ 
    public static void setFormLocation(Form form, Screen screen) 
    { 
     Rectangle bounds = screen.Bounds; 
     form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height); 
    } 
} 

然後我把它叫做是這樣的:

public Form1() 
{ 
    InitializeComponent(); 
    pictureBox1.Hide(); 
    pictureBox2.Hide(); 
    Positions(); 
    this.StartPosition = FormStartPosition.Manual; 
    this.FormBorderStyle = FormBorderStyle.None; 
    SetScreen.setFormLocation(this, Screen.PrimaryScreen); 

    Form2 f = new Form2(); 
    f.StartPosition = FormStartPosition.Manual; 
    f.FormBorderStyle = FormBorderStyle.None; 
    SetScreen.setFormLocation(f, Screen.AllScreens[1]); 
    f.Show(); 
} 
+0

什麼碼的地方我用這種替換形式1 ? – user6481546

+0

和我的視覺工作室說SetScreen不存在 – user6481546

+0

我編輯了我的答案,以便您可以用我的替換您的Form1初始化代碼。關注SetScreen,我創建了一個單獨的靜態類「setScreen」。編輯這一點 - 只要確保它在相同的名稱空間。 – ainwood