Seite 1 von 2

ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 29.02.2012 09:35
von canrap
Guten Morgen liebe Community,

ich würde gerne zwei Buttons mit #BS_COMMABDLINK als Flag benutzen, nur mit der Hintergrundfarbe Weiß, nur gelingt es mir nicht. :(

Ich hab schon alles versucht aber ich kriegs nur in Standart Grau :(

Hier zum Test: (Bitte als Unicode mit XP-Skin starten)

Code: Alles auswählen

#BS_COMMANDLINK  = $0000000E
If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  SetWindowColor(0,#White)
  ButtonGadget(1, 10, 10, 150, 58, "Step Back", #BS_COMMANDLINK)
  SetGadgetColor(0,#PB_Gadget_BackColor,#White)
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
    
  Until Quit = 1
  
EndIf

End
Hab schon tausend Codes zum einfärben getestet und Windows hats ja von Standart auch:
Bild

Wäre schön wenn jemand ne Idee hätte :)

lg

canrap

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 29.02.2012 10:01
von ts-soft

Code: Alles auswählen

Global white = CreateSolidBrush_($FFFFFF) 

Procedure myCallback(hWnd, uMsg, wParam, lParam) 

  Select uMsg 
    Case #WM_CTLCOLORBTN 
      If lparam = GadgetID(1) 
        SetBkMode_(wParam, #TRANSPARENT) 
        SetTextColor_(wParam, $000000) 
        ProcedureReturn white
      EndIf 
    EndSelect 
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

#BS_COMMANDLINK  = $0000000E
If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  SetWindowColor(0, #White)
  ButtonGadget(1, 10, 10, 150, 58, "Step Back", #BS_COMMANDLINK)
  SetWindowCallback(@myCallback())
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
   
  Until Quit = 1
 
EndIf

DeleteObject_(white)
End 

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 29.02.2012 13:46
von canrap
Super :) Lieben vielen Dank!

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 08.03.2012 20:15
von canrap
Eine Frage hab ich doch noch ;)

Es ist ja möglich mit SetWindowTheme das Design des ListIconGadgets dem des Explorers anzunähern, nur leider nicht komplett.

Mit SetWindowTheme siehts so aus:
Bild

Ich hätte es aber gerne so:
Bild

Also diese weiße Columnbar, gibt es dafür vlt. ein kurzes Codeschnipsel?

Danke schonmals :)

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 18.03.2012 23:07
von canrap
Ich push hier mal, falls jemand noch eine Lösung für mich hat?! Ich bin zwar soweit das sich die Columnheader eigl. nurnoch sehr gering unterscheiden, aber halt immernoch etwas. Und bevor ich nun auch den letzten Strich selbst zeichne, frag ich lieber nochmal, obs nicht doch einfacher geht?

Ansonsten trotzdem danke :)

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 18.03.2012 23:15
von RSBasic
Sowas?

Code: Alles auswählen

;Coloured header control.
;By srod.
;Purebasic 4.
;Windows.


#LVM_GETHEADER = #LVM_FIRST + 31

; Globals
Global oldListIconCallback, hHeader, redbrush, bluebrush
redbrush=CreateSolidBrush_(#White)
bluebrush=CreateSolidBrush_(#White)


; Proc for subclassed ListIconGadget
Procedure SubclassedListIcon(hwnd, msg, wparam, lparam)
  Protected hdi.hd_item
  result = CallWindowProc_(oldListIconCallback, hwnd, msg, wparam, lparam)
  Select msg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lparam
      ;--> Get handle to ListIcon header control
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        ;--> Determine drawing stage
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
;Get header text.
            text$=Space(100)
            hdi\mask = #HDI_TEXT
            hdi\psztext = @text$
            hdi\cchtextmax = Len(text$)
            SendMessage_(hHeader, #HDM_GETITEM,*pnmcd\dwItemSpec,hdi)
;Check button state.
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
;Offset text because of the selected button.
              InflateRect_(*pnmcd\rc,-1,-1)
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
;Draw background.
;Here we alternate red text on blue background.
            ;InflateRect_(*pnmcd\rc,-1,-1)
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            If *pnmcd\dwItemSpec&1
              FillRect_(*pnmcd\hdc, *pnmcd\rc, redbrush)
            ;  SetTextColor_(*pnmcd\hdc, #Blue)
            Else
              FillRect_(*pnmcd\hdc, *pnmcd\rc, bluebrush)
            ;  SetTextColor_(*pnmcd\hdc, #Red)
            EndIf
            DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_END_ELLIPSIS)
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure


; ************************************************
; Main Window
; ************************************************
If OpenWindow(0, 100, 100, 415, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListIconGadget(0, 5, 5, 405, 200, "col 0", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  hHeader = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
;Subclass ListIcon so we can customdraw the header text
  oldListIconCallback = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @SubclassedListIcon())

;Add 10 more columns.
  For i = 1 To 10
    AddGadgetColumn(0, i, "col "+Str(i), 50)
  Next 
;Add some data
  For b=0 To 99; Add 100 rows.
    AddGadgetItem(0,-1,"")
  Next
  For i = 0 To 99
    For j = 0 To 50
      SetGadgetItemText(0,i,Str(i+j),j)
    Next j
  Next i           

  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow

  DeleteObject_(redbrush)
  DeleteObject_(bluebrush)
 
EndIf
End 
Quelle: http://www.purebasic.fr/english/viewtop ... 28#p149328

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 18.03.2012 23:30
von ts-soft
RSBasic hat geschrieben:

Code: Alles auswählen

redbrush=CreateSolidBrush_(#White)
bluebrush=CreateSolidBrush_(#White)
Sprechende Variablen :bounce:

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 18.03.2012 23:39
von RSBasic
Ich habe einfach (siehe Quellenangabe) den Code aus dem Thread entnommen und einfach die entsprechende Konstante angepasst. Ich hab mir aber nicht die Mühe gegeben, die Variablennamen anzupassen und es zusammenzufassen und u.a. auch dafür zu sorgen, dass es auch unter x64 funktioniert. (SetWindowLong > SetWindowLongPtr). :mrgreen:
Soviel Zeit habe ich grad nicht. Ist eh nur eine Beispiel-Vorlage für canrap. Wenn canrap es gut findet, kann man es sowieso noch verfeinern. ;)

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 18.03.2012 23:44
von ts-soft
Soll ja kein Vorwurf sein, ich wollte damit nur ausdrücken, das nachdem redbrush und bluebrush aus der
Dusche kamen, waren beide whitebrush :lol:

Re: ButtonGadget mit #BS_COMMABDLINK Flag in Weiß?

Verfasst: 19.03.2012 08:18
von rolaf
ts-soft hat geschrieben:Soll ja kein Vorwurf sein, ich wollte damit nur ausdrücken, das nachdem redbrush und bluebrush aus der
Dusche kamen, waren beide whitebrush
:lol:
Bild