23. november 2006 - 12:30Der 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.
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.
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.
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.
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å?
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.
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.
Du kan nok have ret i, at Screen-klassen godt kunne byde på lidt flere muligheder end den gør.
Synes godt om
Ny brugerNybegynder
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.