Add Buttons to Windows Title Bar(Windows)

Share your advanced PureBasic knowledge/code with the community.
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Add Buttons to Windows Title Bar(Windows)

Post by Michael Vogel »

Lewis wrote:Hi folks!

This is an interesting thread! 8) However, it occurred to me that code to remove system icons in the titlebar would be of interest to many a programmer. For example, it's not unusual to see games with just the close icon visible/available.

Anyone care to propose a solution? ...

Cheers,
Lewis

Code: Select all

OpenWindow(0,0,0,333,222,"You mean something like that?",#PB_Window_NoGadgets|#PB_Window_SystemMenu)
While WaitWindowEvent()<>#WM_CHAR : Wend
User avatar
Fluid Byte
Addict
Addict
Posts: 2336
Joined: Fri Jul 21, 2006 4:41 am
Location: Berlin, Germany

Re: Add Buttons to Windows Title Bar(Windows)

Post by Fluid Byte »

Can we have skin support?
Windows 10 Pro, 64-Bit / Whose Hoff is it anyway?
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: Add Buttons to Windows Title Bar(Windows)

Post by RASHAD »

Hi FB
I know that you are very busy with your ListGrid
But if there is anyone who can do that so you are
But I will try MV can try also or any fellow
Everybody are welcomed

@MV
I am afraid that Lewis need it that way check please

Code: Select all

OpenWindow(0,0,0,333,222,"You mean something like that?      Press Esc to quit",#PB_Window_NoGadgets|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
While WaitWindowEvent()<>#WM_CHAR : Wend
Egypt my love
yrreti
Enthusiast
Enthusiast
Posts: 546
Joined: Tue Oct 31, 2006 4:34 am

Re: Add Buttons to Windows Title Bar(Windows)

Post by yrreti »

Unless I'm not understanding you, try this code, as this is what I use. (using XP Pro)

Code: Select all

OpenWindow(0,0,0,333,222,"You mean something like that?")
  r=GetMenuItemCount_(GetSystemMenu_(WindowID(0),#False)) ; Get number of menu items.
  RemoveMenu_(GetSystemMenu_(WindowID(0),0),r-1,#MF_BYPOSITION) ; Disable "X" button.
  RemoveMenu_(GetSystemMenu_(WindowID(0),0),r-2,#MF_BYPOSITION) ; Remove separator.
While WaitWindowEvent()<>#WM_CHAR : Wend
User avatar
Alireza
Enthusiast
Enthusiast
Posts: 143
Joined: Sat Aug 16, 2008 2:02 pm
Location: Iran

Re: Add Buttons to Windows Title Bar(Windows)

Post by Alireza »

Hello RASHAD
your code is very nice, if u find a free time please development it :D
thanks man
PB v 5.6 :D
IdeasVacuum
Always Here
Always Here
Posts: 6425
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Add Buttons to Windows Title Bar(Windows)

Post by IdeasVacuum »

[PB5.20 Beta12]
One thing this code does prove is that the Microsoft's GetSystemMetrics() does not deliver accurate values for title bar height etc. :)

The code below is an alternative, using an actual button instead of an image gadget. Works fine on WinXP, no doubt Win7 will need tweaks for the button size/position:

Code: Select all

UsePNGImageDecoder()
EnableExplicit

Enumeration
#WinMain
#WinTitlebar
#BtnTitlebar
EndEnumeration

Global   igBtnW.i, igBtnH.i, igBorderW.i, igMa.i, igOffsetY.i, igOffsetX.i, igTitleBarH.i
Global igBtnImg.i = CatchImage(5,?Btn)

Procedure WndProc(hwnd, uMsg, wParam, lParam)
;--------------------------------------------

               Select uMsg

                      Case #WM_SIZE, #WM_MOVE, #WM_PAINT

                                igTitleBarH = (WindowHeight(#WinMain, #PB_Window_FrameCoordinate) - WindowHeight(#WinMain, #PB_Window_InnerCoordinate)) - igBorderW
                                  igOffsetX = GetSystemMetrics_(#SM_CXBORDER) + (igBtnW * 4)
                                  igOffsetY = (igTitleBarH - igBtnH) / 2
                                ResizeWindow(#WinTitlebar,(WindowX(#WinMain) + WindowWidth(#WinMain)) - igOffsetX, WindowY(#WinMain) + igOffsetY,#PB_Ignore,#PB_Ignore)
               EndSelect

               ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure WinTitlebar()
;----------------------

  If OpenWindow(#WinTitlebar, (WindowX(#WinMain) + WindowWidth(#WinMain)) - igOffsetX, WindowY(#WinMain) + igOffsetY, igBtnW, igBtnH, "", #PB_Window_BorderLess, WindowID(#WinMain))

            SetWindowColor(#WinTitlebar,RGB(224,223,227))

         ButtonImageGadget(#BtnTitlebar, 0, 0, igBtnW, igBtnH, igBtnImg)

  EndIf

EndProcedure
               Define iExit.i = #False
               Define anm.ANIMATIONINFO\cbSize = SizeOf(ANIMATIONINFO)
               SystemParametersInfo_($0048, SizeOf(ANIMATIONINFO), @anm, 0)

                  igMa = anm.ANIMATIONINFO\iMinAnimate
               If igMa = 1

                        anm.ANIMATIONINFO\iMinAnimate = 0
                        SystemParametersInfo_($0049, SizeOf(ANIMATIONINFO), @anm, 0)
               EndIf

               If OpenWindow(#WinMain,0,0,600,400,"Title Bar Button",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

                          igBorderW = GetSystemMetrics_(#SM_CXBORDER)
                        igTitleBarH = (WindowHeight(#WinMain, #PB_Window_FrameCoordinate) - WindowHeight(#WinMain, #PB_Window_InnerCoordinate)) - igBorderW
                             igBtnW = GetSystemMetrics_(#SM_CXSIZE) - 2
                             igBtnH = GetSystemMetrics_(#SM_CYSIZE) - 2
                          igOffsetX = igBorderW + (igBtnW * 4)
                          igOffsetY = (igTitleBarH - igBtnH)

                             WinTitlebar()
                         SetActiveWindow(#WinMain)
                       SetWindowCallback(@WndProc())

                       Repeat

                               Select WaitWindowEvent()

                                         Case #PB_Event_CloseWindow

                                                     If igMa = 1
                                                                anm.ANIMATIONINFO\iMinAnimate = 1
                                                                SystemParametersInfo_($0049, SizeOf(ANIMATIONINFO), @anm, 0)
                                                     EndIf

                                                     iExit = #True

                                         Case #PB_Event_Gadget

                                                     Select EventGadget()

                                                                 Case #BtnTitlebar: Debug "Button Pressed"
                                                     EndSelect

                                                     SetActiveWindow(#WinMain)
                               EndSelect

                       Until iExit = #True
               EndIf
          End

DataSection
  Btn:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1200000012000000,$19ACD90000000208,$5948700900000000
  Data.q $0E0000C40E000073,$00001B0E2B9501C4,$DD07454D49740700,$FDD59821350F0309,$584574070000001B
  Data.q $00726F6874754174,$0C00000048CCAEA9,$6373654474584574,$006E6F6974706972,$0A00000023210913
  Data.q $79706F4374584574,$0FAC007468676972,$45740E0000003ACC,$6974616572437458,$00656D6974206E6F
  Data.q $09000000090FF735,$74666F5374584574,$FF705D0065726177,$5845740B0000003A,$69616C6373694474
  Data.q $8FB4C0B70072656D,$7458457408000000,$00676E696E726157,$0700000087E61BC0,$72756F5374584574
  Data.q $00EB83FFF5006563,$4374584574080000,$F600746E656D6D6F,$7406000000BF96CC,$656C746954745845
  Data.q $01000027D2EEA800,$63912854414449A1,$19DF0F87FDE2F17C,$7AC82C9C02020148,$AC33C5E2F1F8FC7E
  Data.q $2085050405F9F94A,$9DCB20B3BE1F0FEC,$58584F2CACA27339,$0C0D5F6FB7CF4D04,$D05845C3A77B7A8C
  Data.q $784FB7B5CACAC854,$6D9595845C35F6FB,$5643DE1F0FDDFEFF,$D2E96181818DAE86,$44457381EE0F0705
  Data.q $D160D4D1ADCDCD44,$E70BADADAFEDEDE6,$B0957EBF5D717172,$17B83C1C0E4723B6,$22D75753151515CE
  Data.q $0989898F5B5B4DAC,$0DF6FB7FE3E3E5CE,$F178B83D1E8F6D61,$26262A22222B9C1C,$0C678DC6F186A681
  Data.q $FA7D3AAFD7EB0C0C,$8DBBDDEFCF178BF8,$EDF6F95FAFD70019,$465CACACB9B1B19B,$B39B542B0B0B1E46
  Data.q $160B0B1D9595B9B3,$DADAFB43A1C191CB,$18181858ADCDCDFA,$DCDAC2C2C5FAFD7E,$BEDF6FFFFFFFFDDC
  Data.q $C2C2CECECEC0D562,$A83BC3E1F813131A,$0A0B910FFFFFFEDF,$8C6D562DFEFF7F72,$462B86AE170B4C8C
  Data.q $78BC5F3F5FAFD571,$3F9FC0BF3F1B558E,$AEE7736D145CE07F,$C2C26D560EFF7FB8,$D8D8DA282A4A4A22
  Data.q $26FB7DB3FDFEFED8,$1818187AAC0E7676,$F7C3D1E8FC793C9E,$31B541F2F2F1DFEF,$3C5E2EF8787A3232
  Data.q $3031B4B8BFDFEFF7,$19AB2B2931313030,$9792303030339B1B,$33EDEA9AB46C014D,$454900000000CAC2
  Data.q $0000826042AE444E
EndDataSection
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
Post Reply