Dynamische Größenänderung eines StatusBar-Feldes (WIN)
Verfasst: 13.12.2007 12:52
Da ich weder hier, im englischen Board oder im Code-Archiv etwas passendes gefunden habe und PureBasic leider keine enstprechende Funktion bietet (warum auch immer), habe etwas gebastelt, das die Größe eines beliebigen StatusBar-Feldes "on-the-fly" in typischer PureBasic-Einfachheit ändert. Sehr praktisch zum Beispiel, wenn man ein in der Größe flexibles Fenster hat und die StatusBar-Felder bei einem Resize ihre Größe bzw. Breite auch ändern sollen. Das Ganze funktioniert ohne Callback-Funktion und kann beispielsweise direkt in #PB_Event_SizeWindow eingebaut werden. Hier der Code, sollte selbsterklärend sein
[edit]
Speicher muss am Ende der Funktion noch freigegeben werden. Ansonsten wird bei jedem Resize-Window mehr Speicher reserviert
Ist bestimmt nicht der schönste Code, aber er verrichtet seine Arbeit schnell und zuverlässig
HTH

[edit]
Speicher muss am Ende der Funktion noch freigegeben werden. Ansonsten wird bei jedem Resize-Window mehr Speicher reserviert

Code: Alles auswählen
#SB_GETPARTS = $406
#SB_SETPARTS = $404
;
; Setzt die Breite eines StatusBar-Feldes neu
;
; (Long) hWndControl: Nummer der StatusBar (#StatusBar)
; (Long) dwField: Nummer des Feldes
; (Long) dwWidth: Neue Breite des Feldes
;
; Rückgabewert: (Byte) #True bei Erfolg oder #False im Fehlerfall
;
Procedure.b API_SetStatusBarFieldWidth(hWndControl.l, dwField.l, dwWidth.l)
;
; Geschützte Funktionsvariablen
;
; (Long) dwResult: Container für Funktionsergebnisse
; (Long) nParts: Container für Anzahl der StatusBar-Felder
; * dwFields: Pointer zu Positionsangaben der StatusBar-Felder (Long-Array)
; (Long) dwLeft: Container für Position eines vorangegangenen StatusBar-Feldes
;
Protected dwResult.l
Protected nParts.l
Protected *dwFields
Protected dwLeft.l
;
; Funktionsparameter prüfen
;
If IsStatusBar(hWndControl) And dwField > 0 And dwWidth > 0
;
; DLL laden
;
OpenLibrary(0, "user32.dll")
;
; Aktuelle Anzahl Felder ermitteln
;
nParts = CallFunction(0, "SendMessageW", StatusBarID(hWndControl), #SB_GETPARTS, #Null, #Null)
If nParts <> 0 And dwField <= nParts
;
; Speicher für Positionsangaben der Felder reservieren
;
*dwFields = AllocateMemory(SizeOf(Long) * nParts)
;
; Positionsangaben ermitteln
;
nParts = CallFunction(0, "SendMessageW", StatusBarID(hWndControl), #SB_GETPARTS, nParts, *dwFields)
If nParts <> 0
;
; Alte Feld-Position ermitteln (vorangegangenes Feld)
;
If dwField = 1
dwLeft = 0
Else
dwLeft = PeekL(*dwFields + (SizeOf(Long) * (dwField - 2)))
EndIf
;
; Neue Feld-Position setzen
;
PokeL(*dwFields + (SizeOf(Long) * (dwField - 1)), dwLeft + dwWidth)
;
; Neue Feld-Position an StatusBar übergeben
;
dwResult = CallFunction(0, "SendMessageW", StatusBarID(hWndControl), #SB_SETPARTS, nParts, *dwFields)
EndIf
;
; Speicher freigeben
;
FreeMemory(*dwFields)
EndIf
;
; DLL schließen
;
CloseLibrary(0)
EndIf
;
; Funktionsergebnis zurückgeben
;
If dwResult <> 0
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure

HTH