ToolBarImageButton() - #PB_Any

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

ToolBarImageButton() - #PB_Any

Beitrag von Lambda »

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
Benutzeravatar
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

Beitrag von ts-soft »

Da Du die IDs selber vergibst, sollte auch klar sein, welche zu welchem Menü oder welcher Toolbar gehört.
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.
Bild
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: ToolBarImageButton() - #PB_Any

Beitrag von Lambda »

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.
Benutzeravatar
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

Beitrag von NicTheQuick »

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)"
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: ToolBarImageButton() - #PB_Any

Beitrag von Lambda »

Und jetzt noch als Macrogedöns? :D

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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: ToolBarImageButton() - #PB_Any

Beitrag von Lambda »

Problem leider nicht gelöst, das Macro funktioniert seltsamerweise nicht. Erhalte immer 1 als Rückgabe.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ToolBarImageButton() - #PB_Any

Beitrag von STARGÅTE »

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
Antworten