Buttons in einer ToolBar haben ja eine eigene simple Nummerierung, doch wenn mehrere ToolBar´s in einem Fenster sind wäre die Frage wie ich die ToolBar ermittel. Von WinAPI möchte ich möglichst Verzicht machen. (wäre mit PointRect oder derartiges machbar)
lG
ToolBarImageButton() - #PB_Any
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: ToolBarImageButton() - #PB_Any
Da Du die IDs selber vergibst, sollte auch klar sein, welche zu welchem Menü oder welcher Toolbar gehört.
Verstehe Dein ansinnen also nicht.
Verstehe Dein ansinnen also nicht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: ToolBarImageButton() - #PB_Any
Diese vergebe ich nicht selbst. Das Programm kann erweitert werden, so würde der Nutzer der einen Button mit 0 erstellt den von mir festgelegten auslösen.
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: ToolBarImageButton() - #PB_Any
Da ich sowas selbst gerade brauch. Wie wäre es damit:
Code: Alles auswählen
EnableExplicit
Structure DynamicID_List
max.i
List freeIDs.i()
EndStructure
Global NewMap DynamicID_Map.DynamicID_List(64)
Procedure getFreeId(prefix.s = "")
Protected *entry.DynamicID_List = FindMapElement(DynamicID_Map(), prefix)
Protected freeId.i = -1
If (Not *entry)
*entry = AddMapElement(DynamicID_Map(), prefix)
If (Not *entry) : ProcedureReturn #False : EndIf
EndIf
With *entry
;Falls IDs wieder freigegeben wurden, nimm ein von diesen anstatt eine ganz frische
If (ListSize(\freeIDs()) > 0)
If FirstElement(\freeIDs())
freeId = \freeIDs()
DeleteElement(\freeIDs())
EndIf
Else
;Es gab keine IDs mehr zum Wiederverwenden, also nimm eine frische
\max + 1
freeId = \max
EndIf
EndWith
If (freeId > 0)
ProcedureReturn freeId
EndIf
ProcedureReturn #False
EndProcedure
Procedure freeId(id.i, prefix.s = "")
Protected *entry.DynamicID_List = FindMapElement(DynamicID_Map(), prefix)
If (Not *entry)
ProcedureReturn #False
EndIf
With *entry
If (id = \max)
\max - 1
ProcedureReturn #True
Else
LastElement(\freeIDs())
If AddElement(\freeIDs())
\freeIDs() = id
ProcedureReturn #True
EndIf
EndIf
EndWith
ProcedureReturn #False
EndProcedure
Debug "menu id: " + getFreeId("menuitem")
Debug "menu id: " + getFreeId("menuitem")
Debug "menu id: " + getFreeId("menuitem")
Debug "tool id: " + getFreeId("toolbaritem")
Debug "menu id: " + getFreeId("menuitem")
Debug "2 löschen (ok:" + freeId(2, "menuitem") + ")"
Debug "tool id: " + getFreeId("toolbaritem")
Debug "menu id: " + getFreeId("menuitem") + " (wurde zuvor gelöscht)"Re: ToolBarImageButton() - #PB_Any
Und jetzt noch als Macrogedöns?
Code: Alles auswählen
Procedure AnyToolBarImageButton(id, imageid, mode = 0)
Static Dim IDs(6553)
Protected i
If id <> #PB_Any
If IDs(id) <> 1
ToolBarImageButton(id, imageid, mode)
IDs(id) = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
For i = 6553 To 0 Step -1
If IDs(i) = 0
IDs(i) = 1
ToolBarImageButton(i, imageid, mode)
ProcedureReturn i
EndIf
Next
ProcedureReturn #False
EndIf
EndProcedure
Macro ToolBarImageButton(a, b, c = 0)
AnyToolBarImageButton(a, b, c)
EndMacroRe: ToolBarImageButton() - #PB_Any
Problem leider nicht gelöst, das Macro funktioniert seltsamerweise nicht. Erhalte immer 1 als Rückgabe.
Re: ToolBarImageButton() - #PB_Any
Du gibst ja auch 1 (#True) zurück, wenn du einen Button mit fester Nummer erstellst, trotzdem funktioniert der Code bei mir ohne Probleme:
Code: Alles auswählen
Procedure AnyToolBarImageButton(id, imageid, mode = 0)
Static Dim IDs(6553)
Protected i
If id <> #PB_Any
If IDs(id) <> 1
ToolBarImageButton(id, imageid, mode)
IDs(id) = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
For i = 6553 To 0 Step -1
If IDs(i) = 0
IDs(i) = 1
ToolBarImageButton(i, imageid, mode)
ProcedureReturn i
EndIf
Next
ProcedureReturn #False
EndIf
EndProcedure
Macro ToolBarImageButton(a, b, c = 0)
AnyToolBarImageButton(a, b, c)
EndMacro
Enumeration
#Window
#ToolBar
EndEnumeration
UsePNGImageDecoder()
OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CreateToolBar(#ToolBar, WindowID(#Window))
Debug ToolBarImageButton(#PB_Any, ImageID(CatchImage(#PB_Any, ?server_components)))
Debug ToolBarImageButton(#PB_Any, ImageID(CatchImage(#PB_Any, ?server_components)))
Debug ToolBarImageButton(#PB_Any, ImageID(CatchImage(#PB_Any, ?server_components)))
Debug ToolBarImageButton(10, ImageID(CatchImage(#PB_Any, ?server_components)))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Menu
Debug EventMenu()
EndSelect
ForEver
DataSection
server_components:
Data.q $0A1A0A0D474E5089,$524448490D000000,$1000000010000000,$FFF31F0000000608,$5845741900000061
Data.q $72617774666F5374,$2065626F64410065,$6165526567616D49,$00003C65C9717964,$DA78544144493103
Data.q $C61865536C5F927C,$ACFF4F4A3B4FE77F,$0D8C6C0636C65D1B,$F12259A0C42F045D,$B8CB206E04D0104F
Data.q $C130B910D0BC42E0,$5BD188CAE1606190,$D844A26A209A89A3,$BA85859084402620,$6B6C0ACAE83A30BA
Data.q $E776D76D2B65394D,$E4DF1342F44EDF1C,$79CF3EF3DEFBE73D,$B05BE391F47BEF9F,$BA0E3849B1C5A76D
Data.q $BE03AAD7143150AA,$A387150F8B5E535F,$868E14531CA8A038,$0A5BE9134573108C,$87CD75E113ACB6DD
Data.q $74587578A1EE5B5B,$DAA6BBB3CD1266B9,$12E91AFD671CDE99,$FEDAFDCCFE9C7882,$1A3F645AD6FADE5C
Data.q $3BAF47C8E2155545,$0B9900278376FA9B,$7C9FE316005DB0D0,$1405C6630A8DE649,$957BEB58FA85361B
Data.q $333269BD190763D3,$99CD2F4073A5D44D,$1AF95E16AB001D10,$6573C7935A103EC6,$0211BE9A3B075ADC
Data.q $D47D921F88616485,$CFB55B701E85E104,$A39D53AC30A678FC,$4AA073940CCC1DA5,$714EA58864A8437A
Data.q $B279C9B59D441EC7,$2F40A9FDA22D2F50,$FA883F4E71AFFDEB,$C1AA4DFC917E2CC0,$F2EF7060422BB016
Data.q $3500FAD4695D3263,$021E6D164AF9209E,$2C228878EDDE3E53,$FBFD49C991F727E7,$9D60ECB1911BA9EB
Data.q $ADF8C2BD5F2BED62,$BF186BB245DD6C24,$771FEC9AB7C04CD1,$E1A2B32AC161B8E4,$89DAF9D4FD524679
Data.q $BA75B03DBF423C4E,$9DE4CF82F4C5C8E3,$F05D43D8ADB4DD17,$A598E9D5C974C269,$0E4B3288AE8C8E38
Data.q $4ACBDE19D029D173,$8DB7D471FADC06FF,$2AA9C345927CBC8B,$0CE50B15F93A3328,$73A493F3643D3D2B
Data.q $EB70846F68865813,$44996AD8DDBC1A1A,$8057BA2285F32CF1,$173443F23D442062,$BDA01B11B8262A3C
Data.q $7FE6243DF54D1B69,$2D49B0762BDFD3A2,$AA9879604333C844,$B46D2C9F2FF57497,$10A9694AF65B812A
Data.q $96E761566B84307F,$21228B02773EFC2B,$1EA79F186F0C59FD,$26BE42D2FC552671,$2568A9D146884DAF
Data.q $383964A06AD22174,$F2CC233E3AF6456A,$25D0F4E5E1CC8665,$30FE71279D49E6C4,$471CF631B276BBDB
Data.q $5E1628DCED3EABA2,$B2DC9A6A10B62426,$DEE767C2B17C91BF,$20611D2C44F5DAE7,$C93CDE087FD19676
Data.q $44CFD6F771EF33CD,$DB8F9BA252F2F61E,$F128A9956EE9A91A,$732512470C2FE0DD,$5248125C53D1439C
Data.q $F22109FF1E450530,$AE0B6C5BF36DABCB,$91FE8C749E7898E5,$FFE660A4FA9219CF,$7EAE4908FFF855EE
Data.q $A7F0DDFF34929EB2,$AB553C2D6B000300,$49000000000382EA,$00826042AE444E45
EndDataSection
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr