| |
|
|
Georg Teles | Damit lässt sich die Fenstergröße nach Belieben begrenzen - die Message zum Ändern der Position / Größe des Fensters wird aufgefangen, verändert & an das Fenster versendet
'###############################################
'# #
'# Fenstergröße begrenzen mittels MINMAXINFO #
'# #
'# Georg Teles am 27.12.2018 #
'# #
'###############################################
$H structs.ph
$H windows.ph
$H messages.ph
Declare OldWndProc&, ico&, e%
'-------------# Definitionen
Def GetWindowLong(2)!"USER32","GetWindowLongA"
Def SetWindowLong(3)!"USER32","SetWindowLongA"
Def CallWindowProc(5)!"USER32","CallWindowProcA"
Def RtlMoveMemory(3)!"KERNEL32","RtlMoveMemory"
'-------------# Strukturen
'reserviert, keine Verwendung
Struct ptReserved = ptReservedX&, ptReservedY&
'maximale Breite (x) & Höhe (y) beim Maximierten Fenster
Struct ptMaxSize = ptMaxSizeX&, ptMaxSizeY&
'Position links (x) & oben (y) beim Maximierten Fenster
Struct ptMaxPosition = ptMaxPositionX&, ptMaxPositionY&
'kleinste Breite (x) & Höhe (y) beim Vergrößern/Verkleindern des Fensters
Struct ptMinTrackSize = ptMinTrackSizeX&, ptMinTrackSizeY&
'größte Breite (x) & Höhe (y) beim Vergrößern/Verkleindern des Fensters
Struct ptMaxTrackSize = ptMaxTrackSizeX&, ptMaxTrackSizeY&
'MINMAXINFO Struktur
Struct MinMax = ptReserved, ptMaxSize, ptMaxPosition, ptMinTrackSize, ptMaxTrackSize
'Variable für MINMAXINFO
Declare MMI#
Dim MMI#, MinMax
'-------------# CallBack Routine
Proc WindowProc
Parameters hWnd&, Message&, wParam&, lParam&
' alternativ in der Schleife regeln
'If Message& = ~WM_KEYFIRST ' TASTEN auswertung
'Case WParam& = 27:~PostQuitMessage(0) 'zB %Key = 27 für ESC
'Endif
If Message& = ~WM_GETMINMAXINFO' Message auffangen
' Pointer lParam auffangen und MMI füllen
RtlMoveMemory(MMI#, lParam&, SizeOf(MMI#))
' Werte nach Belieben anpassen
'-------------# Alternative 1
With MMI#
.ptMinTrackSizeX& = 355
.ptMinTrackSizeY& = 282
.ptMaxTrackSizex& = 500
.ptMaxTrackSizey& = 500
Endwith
'-------------# Alternative 2
'MMI#.ptMinTrackSizeX& = 355
'MMI#.ptMinTrackSizeY& = 282
'MMI#.ptMaxTrackSizex& = 500
'MMI#.ptMaxTrackSizey& = 500
' MMI dem lParam Pointer wieder zuweisen
RtlMoveMemory(lParam&, MMI#, SizeOf(MMI#))
EndIf
' alternativ in der Schleife regeln
'If Message& = ~wm_Destroy
' ~PostQuitMessage(0)
'Endif
Return CallWindowProc(OldWndProc&, hWnd&, Message&, wParam&, lParam&)
EndProc
'-------------# Programm
Set("FastMode",1)
Set("TrueColor",1)
Windowtitle "Fenstergröße Begrenzen"
Window 100,100 - 355,282
ico& = Create("hIcon",Par$(0),0)' Icon erwünscht ?
SendMessage(%HWnd,$80,1,ico&)' Icon setzen
SetWindowLong(%HWnd,-16,$92CE0000)' passenden Style wählen
OldWndProc& = GetWindowLong(%hWnd, -4)' original WndProc speichern
SetWindowLong(%hWnd, -4, ProcAddr("WindowProc",4))' WindowProc zuweisen
WhileNot e%
Waitinput
If %Key = 27
Inc e%
ElseIf %Key = 2
Inc e%
EndIf
EndWhile
SetWindowLong(%hWnd, -4, OldWndProc&)' original WndProc wiederherstellen
DeleteObject ico&
DisPose MMI#
Grüße Georg |
|
|
| |
|
|