Seite 1 von 1

Programm-Oberfläche komplett ohne systemeigene Gadgets

Verfasst: 09.11.2005 15:00
von Delle
Wie kann man sowas etwa machen:

Bild

ImageGadget ohne Border z.B. für die schönen Buttons?

Der Rest sicher 2D-Zeichnen oder?

Verfasst: 09.11.2005 15:10
von AND51
Ja, denn es geht nicht anders.
Es gibt zwar einen befehl aus der WinAPI, mit dem man zum beispiel einen knopf statt normal flach machen kann (so wie im forum, wenn ich auf beitrag hinzufügen klicke und dann steht ja da unten "Vorschau" und "Absenden" - diese knöpfe sind flach).
bestimmte gibt es da nochandere API befehle, mit denen man die normalen gadgets manipuliren kann.

das da ganz unten mit den spalten ist ganz klar ein explorer gadget. den kriegst du auch so in PB hin.

Aber z. B. Slider, und die runden knöpfe kriegst du meines wissens nach so nicht hin. Da greifst du aber beser nicht auf StartDrawing() (2D zeichnen) zurück, weil du da nicht abfragen kannst, ob der mauszeiger auf einem knopf sich befindet.
doch halt warte!
das geht! du zeichnest und lädst die knöpfe und so als sorites. dann lädst du eine 1x1 pixel großes bild, welches transparent ist. und diesses kleine bild soll immer am Mauszeiger kleben bleiben.
Dann kannst du mit SpriteCollision() oder SpritePixelCollision() abfragen, ob das keleine 1x1 bild (=maus) mit einem bestimmten knopf kollidiert (was dann einen onmouseover-effekt ergibt (onmouseover = ist-die-maus-auf...-drauf?))
wenn ja, dann nochmal ne abfrage, ob die linke oder rechte maustaste gedrückt wurde.

so habe ich es in meinem neuen spiel gemacht.
ich hoffe du das es verstanden oder TS-Soft oder mxva schauen hier mal vorbei und haben bessere vorschläge... =)

Verfasst: 09.11.2005 15:12
von freedimension
Einfache Buttons kannst du als Ownerdrawn anlegen (weiß jetzt nicht mehr ganz genau wie, aber dazu lässt sich bestimmt etwas im Code-Archiv finden). Was die Sonderbuttons (Drehregler) und Schieberegler anbelangt, so schätze ich dass die mit selbstgeschriebenen Controls angelegt wurden, da gab es z.B. mal eine UserLib für eigene Gadget-Kreationen, aber auch hier weiß ich gerade nicht wie die heißt :(

Verfasst: 09.11.2005 15:54
von edel
Runde Buttons kann man sehr leicht durch Ownerdraw und
ein wenig GDI gefummel , hinbekommen . Somit hat man
noch alle(?) Events eines Button . Bei einem eigenen Control
wird die Sache schon lustiger aber noch lange nicht langweilig ;-)
Vom ImageGadget wuerde ich die Finger lassen .


Edit : etwas laenger gedauert aber hier ein kleines Beispiel.

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)
      
      If *item\itemState & #ODS_SELECTED 
        hpen   = CreatePen_(#PS_SOLID,1,$849584) 
        hbrush = CreateSolidBrush_($BCC5BC)
        *item\rcItem\bottom + 2
      Else 
        hbrush = CreateSolidBrush_($BCC5BC) 
      EndIf 
      
      If *item\itemState & #ODS_DISABLED
        SetTextColor_(DC,$666666) 
        hpen   = CreatePen_(#PS_SOLID,1,$849584) 
      EndIf 
      
      SelectObject_(DC,hpen)
      SelectObject_(DC,hbrush)
       
      Ellipse_(DC,0,0,w,h)
      
      DeleteObject_(hpen)
      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,flags)
  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
  
  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",flags) : DisableGadget(rb0,1)
rb1 = RoundButton(#PB_Any,60,60,50,50,"blub",flags)
rb2 = RoundButton(#PB_Any,10,90,50,50,"blub",flags)

Repeat 
  e = WaitWindowEvent()
  
  If e = #PB_Event_Gadget
    
    Select EventGadgetID()
      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

Verfasst: 09.11.2005 16:13
von nicolaus
Wie man an meinem Player sehen kann geht das jedoch ist es nicht ganz einfach und daher auch nich so leicht erklärbar.

Aufbauen tut die ganze sache im Player auf jeden fall auf nem Code von GPI. Weiss jetzt nicht mehr genau wie sich die sache nannte jedoch müßte das auf PureArea.net im ShowCase zu finden sein.

Ich habe mir die sachen zwar dann alle umgebaut jedoch sollte dies dir sehr weiter helfen.

Die Trackbar´s im Player habe ich mir komplett selber geschrieben da ich leider keinen Weg gefunden hatte die von PB mit dem Skin zu belegen.

Gruß,
Nico