Débutant et API Window
Publié : mer. 23/oct./2019 0:12
Bonjour à tous,
Voilà j' apprend l'API Windows avec PB et certaines choses sont plus complexes que d'autres, notamment ceci :
J'ai pris dans les forums deux supers programmes, l' un permet de colorier les boutons et l'autre d' avoir un beau menu (PopUp) si on y met de belles couleurs, mais quand je les mixe, cela ne fonctionne pas, je n' ai pas le niveau, est-ce que quelqu'un pourrait m' apporter son aide.
Merci d' avance !
Voici les deux programmes :
Voilà j' apprend l'API Windows avec PB et certaines choses sont plus complexes que d'autres, notamment ceci :
J'ai pris dans les forums deux supers programmes, l' un permet de colorier les boutons et l'autre d' avoir un beau menu (PopUp) si on y met de belles couleurs, mais quand je les mixe, cela ne fonctionne pas, je n' ai pas le niveau, est-ce que quelqu'un pourrait m' apporter son aide.
Merci d' avance !
Voici les deux programmes :
Code : Tout sélectionner
;==================================== PREMIER PROGRAMME ============================================
;/**********************************************************
;/ Title: Ownerdraw Hover Buttons
;/ Author: Sparkie
;/ Date: January 11, 2008 (original code December 22, 2004)
;/ Modifier : RASHAD
;/ Date: 23/10/2014
;/ OS Support: Microsoft Windows All
;/ PB Support: PureBasic 4.0 and later
;/**********************************************************
#TME_HOVER = 1
#TME_LEAVE = 2
#TME_NONCLIENT = $10
#TME_QUERY = $40000000
#DoHover = 1
#DoLeave = 2
#MyWindow = 0
Enumeration
#MyButton1 = 100
#MyButton2
#MyButton3
EndEnumeration
Structure ButtonData
oldCallback.i
brushLeave.l
brushClick.l
brushHover.l
brushDisabled.l
EndStructure
;... Declare Globals
Global mte.TRACKMOUSEEVENT, doWhat
mte\cbSize = SizeOf(TRACKMOUSEEVENT)
;... Create button background brushes
buttonBrushLeave = CreateSolidBrush_(RGB(237, 233, 177))
buttonBrushClick = CreateSolidBrush_(RGB(207, 203, 147))
buttonBrushHover = CreateSolidBrush_(RGB(254, 250, 194))
buttonBrushDisabled = CreateSolidBrush_(RGB(200, 200, 200))
bData.ButtonData
bData\brushHover = buttonBrushHover
bData\brushLeave = buttonBrushLeave
bData\brushClick = buttonBrushClick
bData\brushDisabled = buttonBrushDisabled
;... Main WindowCallback
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_DRAWITEM
*dis.DRAWITEMSTRUCT = lParam
If *dis\CtlType = #ODT_BUTTON
buttonNum = *dis\CtlID
*bData.ButtonData = GetGadgetData(buttonNum)
;... Default button attributes
SetBkMode_(*dis\hdc, #TRANSPARENT)
doWhatBrush = *bData\brushLeave
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, 0, 0))
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(125, 125, 125))
doWhatBrush = *bData\brushDisabled
Case *dis\itemState & #ODS_FOCUS
;... ClickDown
SetTextColor_(*dis\hdc, RGB(255, 0, 0))
doWhatBrush = *bData\brushLeave
doFlags = #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
;drawFocus = 1
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, 0, 0))
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)
; If drawFocus = 1
; DrawFocusRect_(*dis\hDC, *dis\rcItem)
; EndIf
EndSelect
ProcedureReturn result
EndProcedure
;... ButtonCallback
Procedure myButtonCallback(hwnd, msg, wParam, lParam)
Shared mouseLeave, hover, hot
buttonID = GetDlgCtrlID_(hwnd)
*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
;... Set flag to reset previous down botton
doWhat = #DoLeave
EndSelect
ProcedureReturn CallWindowProc_(*bData\oldCallback, hwnd, msg, wParam, lParam)
EndProcedure
If OpenWindow(#MyWindow, 100, 100, 250, 200, "Custom Hover Buttons", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
SetWindowCallback(@myWindowCallback())
CreateStatusBar(0, WindowID(#MyWindow))
AddStatusBarField(250)
StringGadget(0, 75, 10, 100, 20, "Ownerdraw Buttons", #PB_String_BorderLess | #PB_String_ReadOnly)
ButtonGadget(#MyButton1, 75, 50, 100, 20, "Testing")
ButtonGadget(#MyButton2, 75, 80, 100, 20, "Customized")
ButtonGadget(#MyButton3, 75, 110, 100, 20, "Buttons")
;... Remove #BS_PUSHBUTTON and add #BS_OWNERDRAW to buttons
For b = #MyButton1 To #MyButton3
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
DisableGadget(#MyButton2,1)
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
StatusBarText(0, 0, "No Button selected")
Case #MyButton1
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton1) + " text is: Testing")
Case #MyButton2
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton2) + " text is: Customized")
Case #MyButton3
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton3) + " text is: Buttons")
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
DeleteObject_(buttonBrushLeave)
DeleteObject_(buttonBrushClick)
DeleteObject_(buttonBrushHover)
DeleteObject_(buttonBrushDisabled)
;==================================== DEUXIEME PROGRAMME ============================================
Global SFColor.i, SBColor.i
Structure new_mm
Text.s
EndStructure
Global Dim menu.new_mm(6),hFont
;LoadFont(0,"Ms Sans Serif",12,#PB_Font_HighQuality)
LoadFont(0,"Georgia",14,#PB_Font_Bold)
hFont = FontID(0)
Procedure Menu_Owner(hWnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_MEASUREITEM
hdc = GetDC_(hWnd)
*nmm.MEASUREITEMSTRUCT = lParam
*lnew_mm.new_mm = *nmm\itemData
hFontOld = SelectObject_(hDC,hFont)
GetTextExtentPoint32_(hdc,*lnew_mm\Text,Len(*lnew_mm\Text),@size.SIZE);
*nmm\itemWidth = size\cx
*nmm\itemHeight = size\cy
ReleaseDC_(hWnd,hdc)
Case #WM_DRAWITEM
*nmd.DRAWITEMSTRUCT = lParam
*llnew_mm.new_mm = *nmd\itemData
If *nmd\itemState & #ODS_SELECTED
hFontOld = SelectObject_(*nmd\hDC,hFont)
SetTextColor_(*nmd\hDC,SFColor)
SetBkColor_(*nmd\hDC,SBColor)
ntx = *nmd\rcItem\left
nty = *nmd\rcItem\top
ExtTextOut_(*nmd\hDC,ntx,nty,#ETO_OPAQUE,*nmd\rcItem,*llnew_mm\Text,Len(*llnew_mm\Text),0)
Else
ntx = *nmd\rcItem\left
nty = *nmd\rcItem\top
hFontOld = SelectObject_(*nmd\hDC,hFont)
ExtTextOut_(*nmd\hDC,ntx,nty,#ETO_OPAQUE,*nmd\rcItem,*llnew_mm\Text,Len(*llnew_mm\Text),0)
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0,400,300, "PopupMenu Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListIconGadget(0, 10, 10, 280, 240, "Tools", 200)
AddGadgetItem(0, -1, "Hammer")
AddGadgetItem(0, -1, "Screwdriver")
hMenu = CreatePopupMenu(0)
MenuItem(1, "")
MenuItem(2, "")
MenuItem(3, "")
MenuBar()
OpenSubMenu("")
MenuItem(4, "")
MenuItem(5, "")
CloseSubMenu()
MenuBar()
MenuItem( 6, "")
ModifyMenu_(hMenu,1,#MF_BYCOMMAND|#MF_OWNERDRAW,1,menu(0))
ModifyMenu_(hMenu,2,#MF_BYCOMMAND|#MF_OWNERDRAW,2,menu(1))
ModifyMenu_(hMenu,3,#MF_BYCOMMAND|#MF_OWNERDRAW,3,menu(2))
ModifyMenu_(hMenu,4,#MF_BYPOSITION|#MF_OWNERDRAW,0,menu(6))
ModifyMenu_(hMenu,4,#MF_BYCOMMAND|#MF_OWNERDRAW,4,menu(3))
ModifyMenu_(hMenu,5,#MF_BYCOMMAND|#MF_OWNERDRAW,5,menu(4))
ModifyMenu_(hMenu,6,#MF_BYCOMMAND|#MF_OWNERDRAW,6,menu(5))
menu(0)\Text = " Cut"
menu(1)\Text = " Copy"
menu(2)\Text = " Paste"
menu(3)\Text = " Window..."
menu(4)\Text = " Gadget..."
menu(5)\Text = " Quit"
menu(6)\Text = " Options"
SFColor = $00FFFF
SBColor = $EAAB0D
SetWindowCallback(@Menu_Owner())
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
DisplayPopupMenu(0, WindowID(0))
EndIf
Case #PB_Event_Menu
Select EventMenu() ; To see which menu has been selected
Case 1 ; Cut
MessageRequester("PureBasic", "Cut", 0)
Case 2 ; Copy
MessageRequester("PureBasic", "Copy", 0)
Case 3 ; Paste
MessageRequester("PureBasic", "Paste", 0)
Case 6 ; Quit
Quit = 1
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
End