Avatar billede bootie Nybegynder
23. november 2006 - 12:30 Der er 9 kommentarer og
2 løsninger

True Dual monitor support

Hejsa xperter

Jeg har et problem med at få min main form til at virke rigtig nå jeg køre med dual monitor. Det der er mit mål er at sætte applicationen *ind på plads* hvis den er lukket lidt uden for skærmen. Dette vil så også bevirke at hvis man har brugt dual monitor og slå det fra at så *hænger* min application ikke ude i det blå.

Men jeg kan ikke helt få det til at virke som det skal. Jeg kan fint nok Loade og Save min form position i en My.Setting og det virker som det skal, men jeg har sværre problemer med at få udformet selve *out_of_bounds* tjekket.

Jeg oplever at hvis jeg sætter min taskbar til ikke at expande over begge skærme at så kan jeg ikke rigtig beregne working area for begge skærme.

Hvordan klare i dette?

At sætte windåse til at styre location is not an option.
Avatar billede bootie Nybegynder
23. november 2006 - 12:32 #1
Dim workingArea As Rectangle = Screen.GetWorkingArea(New Point(0, 0))
        Dim newPosition As Point = My.Settings.WindowLocation

        If My.Settings.WindowLocation.X < workingArea.X Then
            newPosition.X = workingArea.X
        ElseIf My.Settings.WindowLocation.X + Me.Width > workingArea.Width Then
            newPosition.X = workingArea.Width - Me.Width
        End If

        If My.Settings.WindowLocation.Y < workingArea.Y Then
            newPosition.Y = workingArea.Y
        ElseIf My.Settings.WindowLocation.Y + Me.Height > workingArea.Height Then
            newPosition.Y = workingArea.Height - Me.Height
        End If

        Me.Location = newPosition

Dette er hvad jeg gør lige nu. Det virker fint nok på een skærm, men der er ingen dual support i det.
Avatar billede bootie Nybegynder
23. november 2006 - 12:33 #2
Det underlige er at sætter jeg min taskbar op til at expande så virker ovenstående kode perfekt.
Avatar billede bernhof Nybegynder
23. november 2006 - 18:16 #3
Følgende kode har jeg ikke haft mulighed for at teste, men prøv at se om den virker alligevel:

  Private Sub EnsureVisible()
    Dim OutOfBounds As Boolean = True
    For Each Scr As Screen In Screen.AllScreens
      If Me.Bounds.IntersectsWith(Scr.Bounds) Then
        'Programmet er synlig på én af skærmene. Gør ikke noget
        OutOfBounds = False
        Exit For
      End If
    Next
    If OutOfBounds Then
      'Programmet er ikke synligt. Flyt det tilbage til den primære skærm:
      Me.Left = Screen.PrimaryScreen.Bounds.Left
      Me.Top = Screen.PrimaryScreen.Bounds.Top
    End If
  End Sub

Hvis det ikke virker, så prøv at lege lidt med Screen klassen, som netop giver dig mulighed for at understøtte flere skærme.

- Bernhof
Avatar billede bootie Nybegynder
24. november 2006 - 08:09 #4
Ja men jeg synes ikke Screen klassen er god nok. Jeg vil jo mene at lige meget hvordan det er sat op så bør WorkingArea være alt det plads jeg kan bruge. Men det skal jeg selv ind og regne på i dette tilfælde og hvis jeg expander min taskbar så virker det som om XP slet ikke kan se at der er 2 skærme. Men det er måske meget godt og lavet som det skal være.
Avatar billede bernhof Nybegynder
24. november 2006 - 12:30 #5
Som jeg forstod det, er der tale om en almindelig windows form, som skal flyttes ind på plads, hvis den ikke er synlig på nogen skærme, men måske har jeg misforstået din problemstilling? I så fald er jeg ikke helt sikker på, hvad du forsøger at opnå?
Avatar billede bootie Nybegynder
24. november 2006 - 12:37 #6
Jeg vil flytte applicationen helt ind i på skærmen hvis den er lidt udenfor.

Mit problem er at hvis jeg køre med dual monitor vil mit kode, hvis applicationen er lidt udenfor skærmen 2 flytter den helt tilbage på skærm 1 fordi i det tilfælde at jeg ikke strækker taskbaren ud på begge skærme har begge skærme sit eget working area.

Jeg skal holde styr på om jeg er på \\.\DISPLAY1 eller \\.\DISPLAY2 også! Men jeg skal bare lige have den knækket.
Avatar billede bootie Nybegynder
24. november 2006 - 12:38 #7
Og så skal koden jo så in effect også flytte applicationen ind i billedet hvis skærmen ikke findes længere.
Avatar billede bootie Nybegynder
24. november 2006 - 14:22 #8
Wuuhuu. Så fandt jeg en løsning.

        newPosition = My.Settings.WindowLocation
        Dim screens() As Screen = Screen.AllScreens
        Dim screenFound As Screen = Nothing

        If screens.Length > 1 Then
            For Each screen As Screen In screens
                If My.Settings.OnScreen = My.Misc.Tools.StripControlCharactors(screen.DeviceName.Trim) Then
                    screenFound = screen
                    Exit For
                End If
            Next
        End If

        If screenFound IsNot Nothing Then
            CalculateFormPosition(screenFound)
        Else
            CalculateFormPosition()
        End If

        Me.Location = newPosition

...

    Private Sub CalculateFormPosition()
        CalculateFormPosition(Screen.PrimaryScreen)
    End Sub

    Private Sub CalculateFormPosition(ByVal screen As Screen)
        If My.Settings.WindowLocation.X < screen.WorkingArea.Left Then
            newPosition.X = screen.WorkingArea.Left
        ElseIf My.Settings.WindowLocation.X + Me.Width > screen.WorkingArea.Right Then
            newPosition.X = screen.WorkingArea.Right - Me.Width
        End If

        If My.Settings.WindowLocation.Y < screen.WorkingArea.Top Then
            newPosition.Y = screen.WorkingArea.Top
        ElseIf My.Settings.WindowLocation.Y + Me.Height > screen.WorkingArea.Bottom Then
            newPosition.Y = screen.WorkingArea.Bottom - Me.Height
        End If
    End Sub

Hvor jeg i My.Setting.OnScreen gemmer hvilken skærm applicationen gemmes på ved nedlukning. Det tager endda højde for taskbaren sådan at applicationen fremstår over denne hvis man har sat den ned under. Sådan ka jeg lide det.
Avatar billede bernhof Nybegynder
24. november 2006 - 16:45 #9
Ok, jamen det var da godt. Så kunne Screen klassen godt bruges alligevel ;-)
Avatar billede bootie Nybegynder
27. november 2006 - 09:14 #10
Ja men jeg synes alligevel jeg blev nødt til at lave noget fekundik for at få det til at virke som jeg gerne ville have det.

Der må da være andre der har skulle lave dual monitor support derude så jeg kan egentlig ikke forstå at der ikke i .NET ligger et eller andet.

Oh well.. problem solved  :)

Smid et svar så deler vi.
Avatar billede bernhof Nybegynder
27. november 2006 - 19:48 #11
Du kan nok have ret i, at Screen-klassen godt kunne byde på lidt flere muligheder end den gør.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester