2010-02-01 13 views
6

Chciałbym nakładać szary, półprzezroczysty obszar na całym ekranie przez C#. Czy można to zrobić za pomocą Windows Forms i jak mam to zrobić?Nakładka ekranu do zrzutu ekranu

+1

Hej, może wreszcie sprawisz, że ten cholerny monit UAC okaże się przydatny, jeśli możesz po prostu ustawić swoje okienko na monitorze ... –

Odpowiedz

8

Oczywiście, po prostu utwórz przezroczyste, półprzezroczyste okno, które obejmuje wszystkie ekrany pulpitu.

Można znaleźć odpowiedni prostokąt na pokrycie wszystkich ekranach z następującym LINQ:

Rectangle bounds = Screen.AllScreens 
         .Select(x => x.Bounds) 
         .Aggregate(Rectangle.Union); 

Następnie ustaw lewą, górną szerokość i wysokość okna z bounds

+0

Dobrze, zastanawiam się, jak to zrobić. Nie mogę stworzyć okna bez obramowania, a ilekroć wybiorę formę, która ma być "zmaksymalizowana", nie obejmie ona całego ekranu, a pominie 5 pikseli i 10 pikseli. – cam

+4

Zmaksymalizowany prawdopodobnie nie jest tym, czego potrzebujesz. Chcesz, żeby twoje okno było tego samego rozmiaru co cały widoczny obszar ekranu (może na wszystkich ekranach) i możesz uczynić go bez granic, ustawiając właściwość 'FormBorderStyle' na' Brak'. – Joey

+2

+1 Przyjemne korzystanie z Linq do obsługi wielu ekranów, dzięki! – BillW

2

oprócz używając sugestię, aby ustawić "Johannes własność FormBorderStyle na none, ja również ustawić następujące właściwości tego formularza stosowanego do«dim-out»ekranu:

  1. , pokaz najwyższego InTaskBar, ControlBox, MaximizeBox, MinimizeBox: „Fałsz
  2. właściwość Text: jasne, że

bym ustawić«dim-out»rozmiar forma w przypadku obciążenia w postaci: użyję elegancki kod w odpowiedzi Roba, aby ustawić granice formularza dodanego do projektu, jeśli chciałbym obsłużyć przypadek wielu monitorów. Gdybym tylko chciał obsłużyć tylko jeden monitor, to bym po prostu zrobić coś prostego, takich jak:

// in the Load Event of the "dim-out" Form 
    this.Bounds = Screen.PrimaryScreen.Bounds; 

Potem, oczywiście, można pokazać ten „dim-out” forma, kiedy trzeba w odpowiedzi na cokolwiek Twoje widoczne formularze.

Po wyświetleniu formularza "niewyraźnego" pojawi się on na wierzchu innych widocznych Formularzy aplikacji (chyba że jedna z nich ma ustawione właściwości TopMost lub TopLevel).

Ale dobrym efektem, jaki można osiągnąć, jest pokazanie formularza "dim-out" tuż przed wyświetleniem komunikatu MessageBox (lub formularza pokazanego w sposób modalny): oznacza to, że zostanie wyświetlone okno dialogowe MessageBox (lub formularz modalny) "z przodu" ze wszystkim innym za nim "przyciemnione".

Więc oto jak Twój kod, aby pokazać „wygaszone” forma może wyglądać:

dimmedForm.Show(); 

    // change these to suit your taste or purpose 
    // this.BringToFront(); 
    // dimmedForm.BringToFront(); 

    // example of showing a MessageBox over the dimmedForm 
    // which will block the current thread 
    MessageBox.Show("why not ?"); 

    // now hide the dimmedForm 
    dimmedForm.Hide(); 

Czasami warto spojrzeć na „własność Toplevel (która nie jest narażona w czasie projektowania) i odświeżanie Twoja wiedza na temat tego, jak ta właściwość może wpływać na kolejność Form na ekranie, a także na badaniu właściwości TopMost formularza (który jest wyświetlany w czasie projektowania).

+2

Potrzebujemy funkcji "odpowiedz merge" :) (+1) –