Imagegadget neue Eigenschaft zuweisen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Imagegadget neue Eigenschaft zuweisen

Beitrag von dysti »

Hallo,
ich habe hier zwei Imagegadget erzeugt. Wenn ich das rechte Gadget anklicke, soll das linke auch so aussehen, evtl ein anderes Bild, wie beim Mausover in HTML. Aber das linke Imagegadget verschwindet einfach.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 322, 150, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
     ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Single     ) 

    If LoadImage(0,"Data\Drive.bmp")    ; ändern Sie den 2. Parameter in den Pfad/Dateiname Ihres Bildes
      ImageGadget(1, 10, 15, 80, 24, ImageID(0))                     ; Imagegadget Standard
      ImageGadget(2, 95, 15, 80, 24, ImageID(0), #PB_Image_Border)   ; Imagegadget mit Rand
    EndIf
 CloseGadgetList() 

    Repeat 
    
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      
      Select EventGadget()
        Case 2
        If #PB_EventType_LeftDoubleClick
          MessageRequester("Information", "You did it !", 0)
          ImageGadget(1, 10, 15, 80, 24, ImageID(0), #PB_Image_Border)
          
          EndIf
          EndSelect

    EndIf

    
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Du erstellst ein komplett neues ImageGadget anstatt dem existierenden eine neue ImageID zu zuweisen. Mach es so:

Code: Alles auswählen

SetGadgetState(1,ImageID(0))
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Wie kann ich nachträglich dieses Flag setzen?

Code: Alles auswählen

#PB_Container_Single
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ContainerGadget(0,5,5,300,200)

SetWindowLong_(GadgetID(0),#GWL_EXSTYLE,#WS_EX_STATICEDGE)
SetWindowPos_(GadgetID(0),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)

While WaitWindowEvent() ! 16 : Wend
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Da kommt: falscher Parameter und wenn ich die beiden andren Flags nehme, ändert sich garnichts. Normal sollte es so aussehen, wie der rechte Button.

Code: Alles auswählen

If #PB_EventType_LeftDoubleClick
MessageRequester("Information", "Ändere den Flag !", 0)
          SetWindowLong_(GadgetID(1),#PB_Image_Border);#GWL_EXSTYLE,#WS_EX_STATICEDGE);#PB_Image_Border)  
EndIf
EndSelect
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Korrektur: SetWindowsPos muß auch gesetzt sein. Komisch ist nur, das nur die obere Hälfte des Icon selektiert ist. Ist das bei euch auch so oder liegt das nur an meiner Bildschirmdarstellung

Code: Alles auswählen

If #PB_EventType_LeftDoubleClick
          MessageRequester("Information", "You did it !", 0)
          SetWindowLong_(GadgetID(1),#GWL_EXSTYLE,#WS_EX_STATICEDGE);#PB_Image_Border)
          SetWindowPos_(GadgetID(1),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
          EndIf
          EndSelect
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Da kommt: falscher Parameter und wenn ich die beiden andren Flags nehme, ändert sich garnichts.
Wo genau? Bei mir läuft es ohne Probleme.
Korrektur: SetWindowsPos muß auch gesetzt sein.
Allerdings. Immer wenn du Änderungen am Rahmen Stil eines Fenters machst muß du ein #WM_SIZE Event schicken sonst wird die Darstellung nicht aktualisiert.
Komisch ist nur, das nur die obere Hälfte des Icon selektiert ist. Ist das bei euch auch so oder liegt das nur an meiner Bildschirmdarstellung
PB ändert die Größe des image gadgets automatisch wenn man einen Rahmen angibt. Mach man das manuell mit dem API muß du die Größe selber ändern:

Code: Alles auswählen

OpenWindow(0,0,0,322,150,"ImageGadget",#PB_Window_SystemMenu | 1)
CreateGadgetList(WindowID(0))
ContainerGadget(0,8,8,306,133,#PB_Container_Single)

hIcon = LoadIcon_(0,#IDI_APPLICATION)
ImageGadget(1,10,5,0,0,hIcon)
ImageGadget(2,95,5,0,0,hIcon,#PB_Image_Border)
CloseGadgetList()

Repeat
	EventID = WaitWindowEvent()
	
	If EventID = #PB_Event_Gadget
	
		Select EventGadget()
			Case 2
			If EventType() = #PB_EventType_LeftDoubleClick
				MessageRequester("Information", "You did it !", 0)
				
				SetWindowLong_(GadgetID(1),#GWL_EXSTYLE,#WS_EX_CLIENTEDGE)
         		SetWindowPos_(GadgetID(1),0,0,0,36,36,#SWP_NOMOVE | #SWP_FRAMECHANGED) 					
			EndIf
		EndSelect	
	EndIf
Until EventID = 16
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Fluid Byte,
das ist ja super. Genauso hatte ich mir das vorgestellt.
Danke.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Würdest du so lieb sein und mir noch zeigen, welcher Paramter eingestzt werden muß, um den Ursprung wieder zu erhalten.
Danke im voraus.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag von PBZecke »

Mit GetWindowLong_(GadgetID(1),#GWL_EXSTYLE) kannst Du vor der
Änderung den Fensterstyle auslesen und speichern, und mit
SetWindowLong_() dann wieder setzen.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Antworten