Jag har upptäckt att skärmbredden blir fel när man ändrar upplösningen medans ett program är igång. Jag använder samma kod som Henrik skrev. För att felet ska uppstå så måste jag kompilera programmet till en exe-fil och sen måste tex ett spel ändra upplösningen medans programmet är igång. Hur ser din kod ut? ÄR det fönstret som behåller storleken? Har du labels där du skriver ut skärmstorleken? Som jag sa så använder jag samma kod som Henrik skrev: Du kan ju testa med: Perfekt! Med SystemParametersInfo() så visar Desktop.Right och Desktop.Bottom rätt upplösning.Felaktig skärmbredd
Kör man tex 1024x768 och startar program, ändrar upplösningen till 800x600 och slutligen ändrar tillbaka till 1024x768 så visar programmet att man har upplösningen 768x768.
Hur löser man det?
ThomasSv:Felaktig skärmbredd
Jag kör 1024x768 och kör jag ett spel i 800x600 och sedan avslutar det så kommer programmet att visa 768x768 som upplösning.
ThomasSv: Felaktig skärmbredd
Då min telepati förmåga eller hackerkunskaper inte är tillräckliga för att få tag i din kod, ber jag dig posta den här. Sv:Felaktig skärmbredd
<code>
Private Sub Timer1_Timer()
Me.Caption = (Screen.Width / Screen.TwipsPerPixelX) & "x" & (Screen.Height / Screen.TwipsPerPixelY)
End Sub
</code>
Problemet uppstår även i en del av mina "riktiga" program och då sätter jag positionen på fönstret (som har en fast storlek).
<code>
Me.Left = Screen.Width - Me.Width
Me.Height = Screen.Height - Me.Height
</code>
Vanligtvis hamnar fönstret längst nere till höger, som den ska. Efter att upplösningen har ändrats så hamnar fönstret på ca 75% av X men helt rätt på Y.
ThomasSv: Felaktig skärmbredd
Option Explicit
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const SPI_GETWORKAREA As Long = 48
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Declare Function MoveWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _
(ByVal uAction As Long, _
ByVal uParam As Long, _
lpvParam As Any, _
ByVal fuWinIni As Long) As Long
Public Function MoveRightBottom(frm As Form)
Dim lNewLeft As Long
Dim lNewTop As Long
Dim lWidth As Long
Dim lHeight As Long
Dim lReturn As Long
Dim Desktop As RECT
Dim Window As RECT
If frm.WindowState = vbNormal Then
lReturn = GetWindowRect(frm.hwnd, Window)
lReturn = SystemParametersInfo(SPI_GETWORKAREA, 0&, Desktop, 0&)
lWidth = Window.Right - Window.Left
lHeight = Window.Bottom + Window.Top
lNewLeft = Desktop.Right - lWidth
lNewTop = Desktop.Bottom - lHeight
lReturn = MoveWindow(frm.hwnd, lNewLeft, lNewTop, lWidth, lHeight, True)
End If
End Function
Sv:Felaktig skärmbredd
Thomas