Eigenes Button Design

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Eigenes Button Design

Beitrag von D@nte »

Also wie der Titel schon sagt versuch ich mich grad daran meine Buttongadgets neu zu gestalten im aktuellen Fall würde ich gerne runde Buttons haben.
Bin bei meiner Suche bin ich auf nen immer wieder auftauchenden Code zum erstellen runder Buttons (zuletzt hier von edel gepostet) gestossen.
Schön und gut, hab's nach nem bisserl gebastel und rumgelese auch hinbekommen meine Buttons verschieden zu färben etc.
Problem ist nur das mir eine Füllfarbe pro Button nicht reicht, aussehen sollen die Buttons eigentlich so wie folgender Code sie erstellt...

Code: Alles auswählen

#Silver = $C0C0C0

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Image_0
  #Image_1
  #Image0
  #Image1
EndEnumeration

Procedure Jetons(Image, Color, Pattern, Worth.s)
  CreateImage(Image, 40, 40)
    StartDrawing(ImageOutput(Image))
      Box   ( 0,  0, 40, 40, GetWindowColor(#Window_0));$C8D0D4)
      Circle(20, 20, 20, Color)
      Circle(20, 20, 15, Pattern)
      Circle(20, 20, 14, Color)
      Box   (18,  0,  4,  4, Pattern)
      Box   (18, 36,  4,  4, Pattern)
      Box   ( 0, 18,  4,  4, Pattern)
      Box   (36, 18,  4,  4, Pattern)
      LineXY( 5,  7,  7,  9, Pattern)
      LineXY( 6,  6,  8,  8, Pattern)
      LineXY( 7,  5,  9,  7, Pattern)
      LineXY(30,  7, 32,  5, Pattern)
      LineXY(31,  8, 33,  6, Pattern)
      LineXY(32,  9, 34,  7, Pattern)
      LineXY(32, 31, 34, 33, Pattern)
      LineXY(31, 32, 33, 35, Pattern)
      LineXY(30, 33, 33, 35, Pattern)
      LineXY( 5, 33,  7, 31, Pattern)
      LineXY( 6, 34,  8, 32, Pattern)
      LineXY( 7, 35,  9, 33, Pattern)
      Textx = ImageWidth (Image) / 2 - TextWidth (Worth) / 2
      Texty = ImageHeight(Image) / 2 - TextHeight(Worth) / 2
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(Textx, Texty, Worth, Pattern)
    StopDrawing()
EndProcedure

If OpenWindow(#Window_0, 283, 82, 110, 60, "",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  SetWindowColor(#Window_0, $006300)
  Jetons(#Image0, #Black, #Yellow, "100")
  Jetons(#Image1, #Blue, #Silver, "50")
  If CreateGadgetList(WindowID(#Window_0))
    ImageGadget(#Image_0, 10, 10, 40, 40, ImageID(#Image0))
    ImageGadget(#Image_1, 60, 10, 40, 40, ImageID(#Image1))
  EndIf

  Repeat
    e = WaitWindowEvent()

    If e = #PB_Event_CloseWindow
      quit = 1
    ElseIf e = #PB_Event_Gadget 
      If EventType() = #PB_EventType_LeftClick Or EventType() = #PB_EventType_LeftDoubleClick
        If EventGadget() = #Image_0
          black + 100
          Debug "Black Jeton : $" + Str(black)
        ElseIf EventGadget() = #Image_1
          blue + 50
          Debug "Blue Jeton : $" + Str(blue)
        EndIf
      ElseIf EventType() = #PB_EventType_RightClick Or EventType() = #PB_EventType_RightDoubleClick
        If EventGadget() = #Image_0
          black - 100
          Debug "Black Jeton : $" + Str(black)
        ElseIf EventGadget() = #Image_1
          blue - 50
          Debug "Blue Jeton : $" + Str(blue)
        EndIf
      EndIf 
    EndIf

  Until quit = 1

EndIf

End
Also ich hoffe jmd kann mir näher bringen wie ich runde Buttons mit dem in meinem Source dargestellten Design hinbekomme...
Zuletzt geändert von D@nte am 11.07.2007 16:07, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

windowseitig hat auch ein Image(Gadget) ein click-event...
ist dann nur in PB glaubich kein GadgetEvent,
müßtest du also via API verarbeiten (zumindest über check der durch API-Konstanten beschriebenen events)...

den von dir erwähnten code von edel kenne ich nicht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Danke für den Tipp Kaeru ;)

War dann doch einfacher als gedacht:

Code: Alles auswählen

If WaitWindowEvent() = #PB_Event_Gadget
  If EventType() = #PB_EventType_LeftClick Or EventType() = #PB_EventType_LeftDoubleClick
    If EventGadget() = #Image_0
      black + 100
      Debug "Black Jeton : $" + Str(black)
    Endif
  Endif
Endif
also zumindest funktioniert's bis jetzt so.
Nu nur noch gucken ob ich da noch ne kleinen 3D-Effekt hin bekomme damit die nen bischen aussehen wie Buttons und nicht nur wie hingemalt...
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@Dante
Und das funktioniert echt? Du fragst hier in einer Zeile 2 mal EventType() ab, das dürfte meiner Meinung nach nicht funktionieren.
Besser wäre:

Code: Alles auswählen

EreignisTyp = EventType()
If EreignisTyp = #PB_EventType_LeftClick Or EreignisTyp = #PB_EventType_LeftDoubleClick
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

afaik gibt EventType() immer den aktuellen status zurück,
der beim letzten WindowEvent() aktualisiert wurde,
insofern kann man es beliebig oft in einem durchgang aufrufen.
allerdings ist das natürlich unnötig, zu beginn des Loops in eine variable speichern ist besser.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Beitrag von ts-soft »

@CSprengel
Innerhalb des EventLoops kann beliebig oft EventType(), EventGadget() usw.
abgefragt werden! Lediglich ein weiteres WindowEvent() oder
WaitWindowEvent() darf nicht enthalten sein.

Aber schön ist so ein Kontrukt nicht :wink:
Lieber alles direkt nach WaitWindowEvent() zuordnen

//edit
The frog was faster :wink:
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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

mal schnell zusammen gezimmert :

Code: Alles auswählen


Procedure WindowCallback(hWnd,msg,wParam,lParam)
  Protected old.l
  Protected *item.DRAWITEMSTRUCT
  Protected point.POINT , oldpoint.POINT
 
  old = GetProp_(hWnd,"PROP_OLDPROC")
  Select msg
    Case #WM_DRAWITEM
     
      *item = lParam
     
      DC = *item\hdc
      w =  *item\rcItem\right   - *item\rcItem\left
      h =  *item\rcItem\bottom  - *item\rcItem\top
     
      MapWindowPoints_(GetParent_(hWnd),hWnd,@point,1)
      BackBrush = GetClassLong_(hWnd, #GCL_HBRBACKGROUND)
      SetBrushOrgEx_(DC,point\x,point\y,@oldpoint)
      FillRect_(DC,*item\rcItem,BackBrush)
      SetBrushOrgEx_(DC,oldpoint\x,oldpoint\y,0)
     
      color = getwindowlong_(GadgetID(*item\CtlID),#GWL_USERDATA) 
     
      If *item\itemState & #ODS_SELECTED
        hbrush = CreateSolidBrush_(color)
        *item\rcItem\bottom + 2
      Else
        hbrush = CreateSolidBrush_(color)
      EndIf
     
      SelectObject_(DC,hbrush)
     
      Ellipse_(DC,0,0,w,h)
      
      DeleteObject_(hbrush)
      SetBkMode_(DC,#TRANSPARENT)
      DrawText_(DC, GetGadgetText(*item\CtlID), Len(GetGadgetText(*item\CtlID)), *item\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
     
      ProcedureReturn #True
    Case #WM_DESTROY
      RemoveProp_(hWnd,"PROP_OLDPROC")
  EndSelect
 
 
  ProcedureReturn CallWindowProc_(old,hWnd,msg,wParam,lParam)
EndProcedure

Procedure RoundButton(id,x,y,cx,cy,text.s,color,flags=0)
  Protected temp.l
  Static old.l
 
  temp = ButtonGadget(id,x,y,cx,cy,text,flags|#BS_OWNERDRAW)
 
  If id = #PB_Any
    hWnd = GadgetID(temp)
  Else
    hWnd = temp
  EndIf
 
  If old = 0
    old = SetWindowLong_(GetParent_(hWnd),#GWL_WNDPROC,@WindowCallback()) 
    setprop_(GetParent_(hWnd),"PROP_OLDPROC",old)
  EndIf
 
  SetWindowLong_(hWnd,#GWL_USERDATA,color)
 
  ProcedureReturn temp
 
EndProcedure

*win.long = OpenWindow(#PB_Any,0,0,200,200,"",$C80001)

CreateGadgetList(*win\l)
rb0 = RoundButton(#PB_Any,10,10,50,50,"blub",$FF0000) ;: DisableGadget(rb0,1)
rb1 = RoundButton(#PB_Any,60,60,50,50,"blub",$0080FF)
rb2 = RoundButton(#PB_Any,10,90,50,50,"blub",$C080FF)

Repeat
  e = WaitWindowEvent()
 
  If e = #PB_Event_Gadget
   
    Select EventGadget()
      Case rb0  : Debug "Press rb0"
      Case rb1  : Debug "Press rb1"
      Case rb2  : Debug "Press rb2"
    EndSelect
  ElseIf e = #PB_Event_CloseWindow
    Break
  EndIf       
 
ForEver

End


Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Danke für deine Bemühungen edel aber du hast mein Problem anscheinend missverstanden (oder ich seh grad nicht was du mit deinem Code noch zeigen möchtest außer den verschiedenen Farben)
Mein Prob ist mehr als eine Farbe pro Button hinzubekommen
BildDie hab ich mit dem editieren schon hinbekommen bevor ich hier gefragt hab.
BildAussehen sollten se aber nacher so (ist mein Code von oben)

Das Problem beim OWNERDRAW ist also:

Code: Alles auswählen

      SelectObject_(DC, hpen)
      SelectObject_(DC, hbrush)

      Ellipse_(DC, 0, 0, w, h)
;      Rectangle_(DC, 1, 2, 3, 4) ; <= Hier liegt der Hund begraben
Das, bzw später ja mehrere, Vierecke in einer vom hbrush unterschiedlichen Farbe hinzubekommen.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Du musst einfach einen neue farbe einstellen.

Code: Alles auswählen

pen2 = createpen_(#ps_solid,1,farbe)
selectobject_(hdc,pen2)
rectangel_(...)
deleteobject(pen2)
Antworten