| |
|
|
Peter Mallow | Arbeiten mit Buttons war per mich immer stressig. Wenn ich ein Button mit Create(Button... erstellt habe, haben sich die Buttons nicht so verhalten, wie ich es wollte bzw. auch nicht wie es in Windows üblich ist. Die Alternative mit Control(Button... ist nicht schlecht, nur wusste ich irgendwann nicht mehr, welches MenuItem jetzt zu welchen Button gehört.
Um das alles extrem zu vereinfachen und um die Panoramica herzustellen, habe ich diese INC-File geschrieben. Ich weiß die Lösung ist nicht die eleganteste, jedoch die einfachste und besonders per ältere Profanversion 8- eine vielleicht wertvolle Erweiterung, da es erst ab Profan 9 den Befehl Clicked() gab. Aber auch dieser Befehl hat per mich Nachteile. z.B. funktioniert dieser nur, wenn vorher ein WaitIput erfolgte. KompilierenMarkierenSeparieren################################################################
# BUTTONS.INC Version 1.2 #
#==============================================================#
# Erleichtert extrem die Buttonverwaltung im Programm #
# #
# C o p y r i g h t 2 0 0 5 b y P e t e r M a l l o w #
################################################################
Def @LoadImage(6) !"USER32","LoadImageA"
Def @ALoadImage(6) ! "USER32","LoadImageA"
Def @ExtractIcon(3) ! "SHELL32","ExtractIconA"
Declare ButtonID%,MerkeButton%[100] MerkeButton%[100] Merkt sich das Buttonhandle, Max 100 Buttons (standart)
Proc Button
Parameters Handle%,ButtonText$,X1%,Y1%,X2%,Y2%
Button wird erstellt. Diese Procedure hat die gleichen
Parameter wie CreateButton.
Inc ButtonID%
MerkeButton%[ButtonID%] = @Control("Button",ButtonText$,$40000000+$10000000,X1%,Y1%,X2%,Y2%,Handle%,ButtonID%+4000,%HINSTANCE)
Return ButtonID%
EndProc
Proc CheckButton
Parameters Button%
Diese Funktion gibt True zurück, wenn der Button% geklickt
wurde. PRAKTISCH ist, dass nach der Ausführung dieser Procedure
der MenuItem-Status wieder auf 0 gesetzt wird.
If Button%=0
Return 0
ElseIf @Abs(%MenuItem)=Button%+4000
SetMenuItem 0
Return 1
Else
Return 0
EndIf
EndProc
Proc GetButtonHandle
Parameters Button%
Diese Funktion liefert den echten Handle vom Button zurück.
Damit kann dann jede beliebige Funktion wie "DestroyWindow"
normal angesteuert werden:
Bsp. -> DestroyWindow(GetButtonHandle(Button%))
Return MerkeButton%[Button%]
EndProc
Proc DestroyButton
Parameters Button%
Die Buttons, die mit der Procedure "Button" erstellt werden,
die können nur mit dieser Funktion zerstrört werden oder Sie
verwenden: -> DestroyButton(MerkeButton%[ButtonHandel%]) <-
DestroyWindow(MerkeButton%[Button%])
EndProc
Proc EnableButton
Parameters Button%, Type%
Die Buttons, die mit der Procedure "Button" erstellt werden,
die können nur mit dieser Funktion zerstrört werden oder Sie
verwenden: -> EnableWindow MerkeButton%[ButtonHandel%],0 <-
EnableWindow MerkeButton%[Button%],Type%
EndProc
Proc SetButtonText
Parameters Button%, String$
Die Buttons, die mit der Procedure "Button" erstellt werden,
die können nur mit dieser Funktion zerstrört werden oder Sie
verwenden: -> EnableWindow MerkeButton%[ButtonHandel%],0 <-
SetText MerkeButton%[Button%]ng$
EndProc
Diese Include kann man naturalmente um BmpButton(), AniButton oder IconButton(), ... beliebig erweitern.
Falls ich mich irren sollte, und man dies auch viel einfacher realisieren kann, dann bitte antworten Auch circa Proposte, Erweiterungen, Kritik und Verbesserungen freue ich mich
MfG Peter Mallow |
|
|
| WinXP Pro SP2, XProfan 9 + XPSE AMD Athlon 64 X2 3800 | 06.09.2005 ▲ |
|
|
|
|
| Nun - einen Schönheitsfehler sehe ich auf Anhieb - Du benutzt Integer statt Longs. Es wird zwar zumeinst trotzdem funktionieren - jedoch gibt die Funktion Control nunmal einen Long statt einen Integer zurück.
Salve, iF. |
|
|
| |
|
|
|
Peter Mallow | Ok werde ich machen.
Sry! Diesen Thread gibt es ja schon :/ Ich Trottel habe vergessen, dass es ihn schon gab. Also bitte eines der beiden Threads löschen!!!
Sorry, wollte nicht spammen |
|
|
| WinXP Pro SP2, XProfan 9 + XPSE AMD Athlon 64 X2 3800 | 07.09.2005 ▲ |
|
|
|
|
Peter Mallow | Hier die Version 2.0 von der Buttons.inc KompilierenMarkierenSeparieren################################################################
# BUTTONS.INC Version 2.0 #
#==============================================================#
# Erleichtert extrem die Buttonverwaltung im Programm #
# #
# C o p y r i g h t 2 0 0 5 b y P e t e r M a l l o w #
################################################################
Def @LoadImage(6) !"USER32","LoadImageA"
Def @ALoadImage(6) !"USER32","LoadImageA"
Def @ExtractIcon(3) !"SHELL32","ExtractIconA"
Def @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID" Par: Handle; Return %MenuItem
Declare ButtonID%,bmp#
ButtonID% = 4000 Startwert
Proc CheckButton
Parameters b&
Diese Funktion gibt True zurück, wenn der Button% geklickt
wurde. PRAKTISCH ist, dass nach der Ausführung dieser Procedure
der MenuItem-Status wieder auf 0 gesetzt wird.
If (@Abs(%MenuItem) = @GetDlgCtrlID(b&)) And (b& > 0)
SetMenuItem 0
Return 1
Else
Return 0
EndIf
EndProc
Proc CButton ein Button als Checkbox
Parameters Wnd&,t$,X%,Y%,SizeX%,SizeY%
Inc ButtonID%
Return @Control("Button",t$,$50001000+3,X%,Y%,SizeX%,SizeY%,Wnd&,ButtonID%,%Hinstance)
EndProc
----------------------------------------------------------------------
- Folgende Funktionen und Prozeduren sind nur noch zu Kompatibilität -
- zur alten Version von der Button.inc vorhanden. --------------------
----------------------------------------------------------------------
Proc Button
Parameters Wnd&,t$,X1%,Y1%,X2%,Y2%
Inc ButtonID%
Return @Control("Button",t$,$50000000,X1%,Y1%,X2%,Y2%,Wnd&,ButtonID%,%HInstance)
EndProc
Proc GetButtonHandle
Parameters Button&
Return Button&
EndProc
Proc DestroyButton
Parameters Button&
@DestroyWindow(Button&)
EndProc
Proc EnableButton
Parameters Button&,t%
EnableWindow @Button&,t%
EndProc
Proc SetButtonText
Parameters Button&,t$
SetText Button EndProc
Ich habe vor kurzen die API GetDlgCtrlID entdeckt. Da viel mir gleich Verbesserungen per die Button.inc ein. Der grande Vorteil dieser Version ist, dass Button() jetzt das echte Handle zurückliefert. Dadurch werden die Funtionen GetButtonHandle(), DestroyButton(), EnableButton() und SetButtonText() nicht mehr necessario, habe sie aber noch wegen Kompatibilität in der Button.inc aufgenommen. Außerdem können mit der Funktion CheckButton() auch mit CreateButton() erstellte Buttons abgefragt werden. In dieser Version habe ich auch den Ratschlag von IF berücksichtigt. Neu ist auch die Funktion CButton(), mit der man Buttons erstellen kann, die sich wie eine CheckBox einrasten lassen - also wie ein Schalter.
Allerdings muss ich dazu sagen, dass man mit der aktuellen Version geringe Geschwindigkeitsverluste in Kauf nehmen muss. Das liegt daran, dass das Abfragen der API Getdlgctrlid() etwas länger dauert. Aber wer in seinem Program sowieso ein WaitInput verwendet, dem kann es egal sein. Mit der Funktion Clicked() kann allerdings keine der beiden Versionen mithalten, jedoch ist es meines Wissens nach sinnlos Clicked() in einer Schleife ohne WaitInput oder WaitMouse zu verwenden.
Also fällt dieser Nachteil schonmal raus
Wer kein Profan 9 hat kann sich selbst die Funktion Clicked() erstellen: KompilierenMarkierenSeparieren |
|
|
| WinXP Pro SP2, XProfan 9 + XPSE AMD Athlon 64 X2 3800 | 06.10.2005 ▲ |
|
|
|
|
| Huch - die Api GetDlgCtrlID ist ja sogar schon in der OnlineDoku gelistet. |
|
|
| |
|
|