Nachdem alles, was ich bisher so versucht habe, sogar zu einem (zumindest für mich) positiven Resultat geführt hat, bin ich nun schon seit einiger Zeit dabei, die Programmoberfläche an das Windows 10 Dark-Design anzupassen auch ein bisschen mit Anlehnung an die Microsoft Teams Oberfläche.
Allerdings habe ich mittlerweile mehr Fragen als Lösungen und komme leider über die Forumsuche nicht weiter.
Was ich bisher verstanden habe ist, dass ich wohl an Windows CallBacks nicht vorbei komme.
Hier mein bisheriges Ergebnis - vielleicht könnte mir ja jemand weiterhelfen oder auf grobe Fehler aufmerksam machen.
Als nächstes würde ich gerne bei den Panel Gadgets die Rahmen verändern, so dass sie einen dünnen hellgrauen Rahmen haben, wie gewöhnliche PanelGadgets eben auch.
Dann wäre da das ListIcon - hier sieht man leider in der nicht vorhanden vierten Spalte einen weißen Fleck im Header - bekomme ich das irgendwie weg, ohne eine vierte Spalte anzulegen mit einer sehr großen Breite und zu hoffen, dass niemand weiter nach rechts scrollen mag?
Code: Alles auswählen
; Erster Verusch der Anpassung zum Dark-Windows-Theme von Windows 10 (und Microsoft Teams)
EnableExplicit
;Variablen
Global panel, result, b, bstyle, event, Gadget, tabText$
Global active=0
Global active1=0
Global oldWndProc, oldPanelWndProc
Global panelBackColorBrush = CreateSolidBrush_(RGB(30,36,40))
Global tabBackColorBrush = CreateSolidBrush_(RGB(30,36,40))
Global tabTextColor = RGB(255, 255, 255)
Global Color = RGB(60, 145, 231) ;Textfarbe der aktiven Lasche
Global Color2 = RGB (202,80,16) ;Textfarbe des Bearbeitungsmodus
Global defaultBrush = CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE))
Define DefaultListIconCallback.I
;Konstanten für Änderung des Kopfes für Listicon
Global oldListIconCallback, hHeader, redbrush, bluebrush
redbrush=CreateSolidBrush_(RGB(30,36,40))
bluebrush=CreateSolidBrush_(#Blue)
#LVM_GETHEADER = #LVM_FIRST + 31
;Konstanten für Mausbewegungen über Buttons
#TME_HOVER = 1
#TME_LEAVE = 2
#TME_NONCLIENT = $10
#TME_QUERY = $40000000
#DoHover = 1
#DoLeave = 2
Enumeration
#Window1
#Panel_links
#Panel_rechts
#Text0
#Text1
#Text3
#Liste
#Container
#Font14
#check1
EndEnumeration
Enumeration ;Buttons
#Button1 =100
#Button2
#Button3
#Button4
#Button5
#Button6
#Button7
EndEnumeration
;{ Variablen für Buttons
Structure ButtonData
oldCallback.i
brushLeave.l
brushClick.l
brushHover.l
brushDisabled.l
EndStructure
Global mte.TRACKMOUSEEVENT, doWhat
mte\cbSize = SizeOf(TRACKMOUSEEVENT)
Global buttonBrushDisabled = CreateSolidBrush_(RGB(200, 200, 200))
Global buttonBrushLeave = CreateSolidBrush_(RGB(88, 93, 98))
Global buttonBrushClick = CreateSolidBrush_(RGB(0,65,151))
Global buttonBrushHover = CreateSolidBrush_(RGB(60, 145, 231))
Global hBrushBack = CreateSolidBrush_(RGB(200,200,200))
Global bData.ButtonData
bData\brushHover = buttonBrushHover
bData\brushLeave = buttonBrushLeave
bData\brushClick = buttonBrushClick
bData\brushDisabled = buttonBrushDisabled
;}
LoadFont(#Font14, "Arial", 14, #PB_Font_HighQuality)
;{ Callback-Prozeduren
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_CTLCOLORSTATIC ;Verändert das Aussehen der Textfelder
Select lparam
Case GadgetID(#Text0)
SetBkMode_(wparam,#TRANSPARENT)
SetTextColor_(wparam, RGB(135, 100, 184))
ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
Case GadgetID(#Text1)
SetBkMode_(wparam,#TRANSPARENT)
SetTextColor_(wparam, RGB(136, 23, 152))
ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
EndSelect
Case #WM_DRAWITEM ;Verändert das Aussehen der Buttons
Define *dis.DRAWITEMSTRUCT = lParam
If *dis\CtlType = #ODT_BUTTON
Define buttonNum = *dis\CtlID
Define *bData.ButtonData = GetGadgetData(buttonNum)
;... Default button attributes
SetBkMode_(*dis\hdc, #TRANSPARENT)
Define doWhatBrush = *bData\brushLeave
Define doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
If *dis\itemState > 500
*dis\itemState = *dis\itemState -768
EndIf
Select *dis\itemState
Case #ODS_SELECTED
;... DoHover or DoLeave
If *dis\itemAction = 1 And doWhat = #DoHover
;... DoHover
SetTextColor_(*dis\hdc, RGB(255, 255, 255))
doWhatBrush = *bData\brushHover
doFlags = #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
ElseIf *dis\itemAction = 1 And doWhat = #DoLeave
;... DoLeave
SetTextColor_(*dis\hdc, RGB(255, 0, 0))
doWhatBrush = *bData\brushLeave
doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
EndIf
Case #ODS_DISABLED
SetTextColor_(*dis\hdc, RGB(255, 255, 255))
doWhatBrush = *bData\brushDisabled
Case *dis\itemState & #ODS_FOCUS
;... ClickDown
SetTextColor_(*dis\hdc, RGB(255, 255, 255))
doWhatBrush = *bData\brushLeave
doFlags = #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
If *dis\itemAction = 2 And doWhat = #DoLeave
;... DoHover
doWhatBrush = *bData\brushHover
EndIf
If *dis\itemAction = 1 And doWhat = #DoHover
;... DoHover
doWhatBrush = *bData\brushHover
EndIf
Case*dis\itemState & ( #ODS_FOCUS | #ODS_SELECTED)
;... ClickUp
SetTextColor_(*dis\hdc, RGB(255, 255, 255))
doWhatBrush = *bData\brushClick
doFlags = #DFCS_BUTTONPUSH | #DFCS_PUSHED | #DFCS_ADJUSTRECT
EndSelect
EndIf
DrawFrameControl_(*dis\hdc, *dis\rcItem, #DFC_BUTTON, doFlags)
FillRect_(*dis\hdc, *dis\rcItem, doWhatBrush)
DrawText_(*dis\hdc, GetGadgetText(buttonNum), Len(GetGadgetText(buttonNum)), *dis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER)
doWhat = #DoLeave
EndSelect
ProcedureReturn result
EndProcedure
Procedure myButtonCallback(hwnd, msg, wParam, lParam)
Define mouseLeave, hover, hot
Define buttonID = GetDlgCtrlID_(hwnd)
Define *bData.ButtonData = GetGadgetData(buttonID)
Select msg
Case #WM_MOUSEMOVE
If wParam <> #MK_LBUTTON And mouseLeave = 0
mouseLeave = 1
doWhat = #DoHover
;... Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
; Track mouse leaving button
mte\dwFlags = #TME_LEAVE
mte\hwndTrack = GadgetID(buttonID)
TrackMouseEvent_(mte)
EndIf
Case #WM_MOUSELEAVE
mouseLeave = 0
doWhat = #DoLeave
;... Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
Case #WM_LBUTTONDOWN
;SetCapture_(hWnd)
;... Set flag to reset previous down botton
doWhat = #DoLeave
EndSelect
ProcedureReturn CallWindowProc_(*bData\oldCallback, hwnd, msg, wParam, lParam)
EndProcedure
Procedure myWindowProc(hWnd,msg,wParam,lParam)
Define backColorBrush = CreateSolidBrush_(RGB(30,36,40))
Define *PGdis.DRAWITEMSTRUCT = lParam
Define item=wParam
Select msg
Case #WM_DRAWITEM
If *PGdis\CtlType = #ODT_TAB
Gadget = GetProp_(*PGdis\hwnditem, "PB_ID")
If item = 1
Select *PGdis\itemID
Case 0 ;Linkes Panel, erste Lasche
If *PGdis\itemID = GetGadgetState(Gadget)
;Lasche aktiv
If active=0 ;Prüfung ob Bearbeitungsmodus aktiv - 0=nein
tabText$ = GetGadgetItemText(#Panel_links, *PGdis\itemID, 0)
SetTextColor_(*PGdis\hdc, Color)
FillRect_(*PGdis\hdc, *PGdis\rcItem, tabBackColorBrush)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
Else ;Prüfung ob Bearbeitungsmodus aktiv - 0=ja
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der aktiven Lasche
SetTextColor_(*PGdis\hdc, Color2)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
EndIf
;Lasche inaktiv
Else
If active=1 ;Prüfung ob Bearbeitungsmodus aktiv - 0=nein
tabText$ = GetGadgetItemText(#Panel_links, *PGdis\itemID, 0)
SetTextColor_(*PGdis\hdc, Color2)
FillRect_(*PGdis\hdc, *PGdis\rcItem, tabBackColorBrush)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
Else
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID) ;Textfarbe der inaktiven Lasche
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der inaktiven Lasche
SetTextColor_(*PGdis\hdc, #White)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
EndIf
EndIf
Case 1 ;Linkes Panel, zweite Lasche
If *PGdis\itemID = GetGadgetState(Gadget)
;Lasche aktiv
If active1=0 ;Prüfung ob Bearbeitungsmodus aktiv - 0=nein
tabText$ = GetGadgetItemText(#Panel_links, *PGdis\itemID, 0)
SetTextColor_(*PGdis\hdc, Color)
FillRect_(*PGdis\hdc, *PGdis\rcItem, tabBackColorBrush)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
Else ;Prüfung ob Bearbeitungsmodus aktiv - 0=ja
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der aktiven Lasche
SetTextColor_(*PGdis\hdc, Color2)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
EndIf
;Lasche inaktiv
Else
If active1=1 ;Prüfung ob Bearbeitungsmodus aktiv - 0=nein
tabText$ = GetGadgetItemText(#Panel_links, *PGdis\itemID, 0)
SetTextColor_(*PGdis\hdc, Color2)
FillRect_(*PGdis\hdc, *PGdis\rcItem, tabBackColorBrush)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
Else
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID) ;Textfarbe der inaktiven Lasche
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der inaktiven Lasche
SetTextColor_(*PGdis\hdc, #White)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
EndIf
EndIf
EndSelect
EndIf
If item=2 ;rechtes Panel (ohne Bearbeitungsmodus)
If *PGdis\itemID = GetGadgetState(Gadget)
Color = RGB(2, 145, 231) ;Textfarbe der aktiven Lasche
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der aktiven Lasche
SetTextColor_(*PGdis\hdc, Color)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
Else
tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID) ;Textfarbe der inaktiven Lasche
FillRect_(*PGdis\hDC,*PGdis\rcItem,tabBackColorBrush) ;Hintergrundfarbe der inaktiven Lasche
SetTextColor_(*PGdis\hdc, #White)
SetBkMode_(*PGdis\hdc, #TRANSPARENT)
DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
EndIf
EndIf
EndIf
DeleteObject_(defaultBrush)
ProcedureReturn 1
EndSelect
ProcedureReturn CallWindowProc_(oldWndProc,hWnd,msg,wParam,lParam)
EndProcedure
Procedure myPanelProc(hWnd,msg,wParam,lParam)
Protected rect.Rect
Select msg
Case #WM_ERASEBKGND
GetClientRect_(hWnd,rect)
FillRect_(wParam,rect,panelBackColorBrush)
ProcedureReturn #True
EndSelect
ProcedureReturn CallWindowProc_(oldPanelWndProc,hWnd,msg,wParam,lParam)
EndProcedure
Procedure myListIcon(hwnd, msg, wparam, lparam)
Protected hdi.hd_item
Protected *pnmh.NMHDR
Protected *pnmcd.NMCUSTOMDRAW
Protected result
Protected text$
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.
InflateRect_(*pnmcd\rc,-1,-1)
SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
*pnmcd\dwItemSpec&1
FillRect_(*pnmcd\hdc, *pnmcd\rc, redbrush)
SetTextColor_(*pnmcd\hdc, #White)
DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_END_ELLIPSIS)
result = #CDRF_SKIPDEFAULT
EndSelect
EndIf
EndSelect
ProcedureReturn result
EndProcedure
;}
;{ Programmstart
OpenWindow(#Window1,0,0,800,680,"Panel_Test",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
ContainerGadget(#Container,0,0,800,680, #PB_Container_BorderLess); Container wird benötigt, damit auch Button1 eingefärbt wird
SetGadgetColor(#Container,#PB_Gadget_BackColor,RGB(30,36,40)); anpassen an Window1-Farbe
ButtonGadget(#Button1, 375, 620 , 80, 25, "Ende")
CloseGadgetList()
SetWindowColor(#Window1, RGB(30,36,40)) ;Farbe des Fensters
SetWindowLongPtr_(WindowID(#Window1),#GWL_EXSTYLE,#WS_EX_LAYERED) ;Fenster wird auf Transparenz vorbereitet
SetLayeredWindowAttributes_(WindowID(#window1),0,240,#LWA_ALPHA) ;Transparenz wird eingestellt 0=durchsichtig
SetWindowCallback(@myWindowCallback())
oldWndProc = SetWindowLong_(WindowID(#Window1),#GWL_WNDPROC,@myWindowProc())
PanelGadget(#Panel_rechts,400,10,390,580)
oldPanelWndProc = SetWindowLong_(GadgetID(#Panel_rechts),#GWL_WNDPROC,@myPanelProc()) ;Farbe der Lasche
SetWindowLong_(GadgetID(#Panel_rechts),#GWL_STYLE,#TCS_OWNERDRAWFIXED|GetWindowLong_(GadgetID(#Panel_rechts),#GWL_STYLE)) ;Farbe des Panels
AddGadgetItem (#Panel_rechts, 0, "Tab1_rechts")
ButtonGadget(#Button2, 10, 10, 80, 25,"Hallo")
TextGadget(#Text0,10,50,220,80,"Beispiel ListIconGadget:")
SetGadgetFont(#Text0,FontID(#Font14))
ListIconGadget(#Liste, 10, 100, 186, 240,"Spalte1", 60, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#Liste,1,"Spalte2",60)
AddGadgetColumn(#Liste,2,"Spalte3",60)
;AddGadgetColumn(#Liste,3,"",200) ;Spalte, die den "weißen Fleck" im Header verdeckt
AddGadgetItem(#Liste, -1, "SubItem 1"+ #LF$ +"Eintrag"+ #LF$ +"Null")
SetGadgetItemColor(#Liste, -1, #PB_Gadget_FrontColor, RGB (135, 100, 184))
SetGadgetColor(#Liste, #PB_Gadget_BackColor, RGB(30,36,40))
SetGadgetColor(#Liste, #PB_Gadget_LineColor, RGB(135, 100, 184))
SetWindowLongPtr_(GadgetID(#Liste),#GWL_EXSTYLE,0)
SetWindowPos_(GadgetID(#Liste),0,10,100,186,240,#SWP_FRAMECHANGED )
hHeader = SendMessage_(GadgetID(#Liste), #LVM_GETHEADER, 0, 0 )
;Subclass ListIcon so we can customdraw the header text
oldListIconCallback = SetWindowLong_(GadgetID(#Liste), #GWL_WNDPROC, @myListIcon())
AddGadgetItem (#Panel_rechts, 1, "Tab2_rechts")
ButtonGadget(#Button3, 10, 10, 80, 25,"Welt")
CloseGadgetList()
PanelGadget(#Panel_links, 10 , 10 , 390, 580)
oldPanelWndProc = SetWindowLong_(GadgetID(#Panel_links),#GWL_WNDPROC, @myPanelProc()) ;Farbe der Lasche
SetWindowLong_(GadgetID(#Panel_links),#GWL_STYLE,#TCS_OWNERDRAWFIXED|GetWindowLong_(GadgetID(#Panel_links),#GWL_STYLE)) ;Farbe des Panels
AddGadgetItem(#Panel_links, 2,"Tab1_links")
TextGadget(#Text1,50,50,150,80,"Beispiel-Text1")
SetGadgetFont(#Text1,FontID(#Font14))
ButtonGadget(#Button4, 10, 10, 120, 25, "Bearbeitungsmodus")
ButtonGadget(#Button5, 150, 10, 120, 25,"Bearbeiten beenden")
AddGadgetItem(#Panel_links, 3, "Tab2_links")
ButtonGadget(#Button6, 10, 10, 120, 25, "Bearbeitungsmodus")
ButtonGadget(#Button7, 150, 10, 120, 25,"Bearbeiten beenden")
CloseGadgetList()
For b = #Button1 To #Button7
bStyle = GetWindowLongPtr_(GadgetID(b), #GWL_STYLE)
SetWindowLongPtr_(GadgetID(b), #GWL_STYLE, bStyle & ~#BS_PUSHBUTTON | #BS_OWNERDRAW)
bData\oldCallback = SetWindowLongPtr_(GadgetID(b), #GWL_WNDPROC, @myButtonCallback())
SetGadgetData(b, bData)
Next b
;}
;{ Eventschleife
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button1
End
Case #Button4
If active1=1
Else
active=1
ResizeGadget(#Panel_links, #PB_Ignore , #PB_Ignore , #PB_Ignore, #PB_Ignore)
EndIf
Case #Button5
active=0
ResizeGadget(#Panel_links, #PB_Ignore , #PB_Ignore , #PB_Ignore, #PB_Ignore)
Case #Button6
If active=1
Else
active1=1
ResizeGadget(#Panel_links, #PB_Ignore , #PB_Ignore , #PB_Ignore, #PB_Ignore)
EndIf
Case #Button7
active1=0
ResizeGadget(#Panel_links, #PB_Ignore , #PB_Ignore , #PB_Ignore, #PB_Ignore)
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
DeleteObject_(panelBackColorBrush)
DeleteObject_(tabBackColorBrush)
DeleteObject_(buttonBrushLeave)
DeleteObject_(buttonBrushClick)
DeleteObject_(buttonBrushHover)
DeleteObject_(buttonBrushDisabled)
;}
Danke