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