Code: Select all
Global oldProc, brush, DWMEnabled
#WM_SYSMENU = $313
Procedure WndCallback(hWnd, Msg, wParam, lParam)
Select Msg
Case #WM_GETMINMAXINFO
Protected *mmi.MINMAXINFO = lParam
Protected hMon = MonitorFromWindow_(hWnd, #MONITOR_DEFAULTTONEAREST)
Protected mie.MONITORINFOEX\cbSize = SizeOf(mie)
GetMonitorInfo_(hMon, mie)
*mmi\ptMaxPosition\x = Abs(mie\rcWork\left - mie\rcMonitor\left)
*mmi\ptMaxPosition\y = Abs(mie\rcWork\top - mie\rcMonitor\top)
*mmi\ptMaxSize\x = Abs(mie\rcWork\right - mie\rcWork\left)
*mmi\ptMaxSize\y = Abs(mie\rcWork\bottom - mie\rcWork\top) - 1
ProcedureReturn 0
Case #WM_NCCALCSIZE
ProcedureReturn 0
Case #WM_CTLCOLORSTATIC, #WM_CTLCOLORBTN
SetBkMode_(wParam, #TRANSPARENT)
ProcedureReturn brush
Case #WM_SIZE
width = WindowWidth(0)
SetWindowPos_(GadgetID(3), 0, width-20, 0, 0, 0, #SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOCOPYBITS)
SetWindowPos_(GadgetID(2), 0, width-40, 0, 0, 0, #SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOCOPYBITS)
SetWindowPos_(GadgetID(1), 0, width-60, 0, 0, 0, #SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOCOPYBITS)
Case #WM_NCACTIVATE
If DWMEnabled=0
ProcedureReturn 1
EndIf
Case #WM_COMMAND
Select wParam
Case 1
ShowWindow_(hWnd, #SW_MINIMIZE)
Case 2
If IsZoomed_(hWnd)
ShowWindow_(hWnd, #SW_RESTORE)
Else
ShowWindow_(hWnd, #SW_MAXIMIZE)
EndIf
Case 3
SendMessage_(hWnd, #WM_CLOSE, 0, 0)
Case 4
MapWindowPoints_(hWnd, 0, p.POINT, 1)
SendMessage_(hWnd, #WM_SYSMENU, 0, (p\y+20)<<16 + p\x)
EndSelect
Case #WM_LBUTTONDOWN, #WM_LBUTTONDBLCLK
GetCursorPos_(cursor.POINT)
MapWindowPoints_(0, hWnd, cursor, 1)
If cursor\y < 30
If Msg = #WM_LBUTTONDBLCLK
If IsZoomed_(hWnd)
ShowWindow_(hWnd, #SW_RESTORE)
Else
ShowWindow_(hWnd, #SW_MAXIMIZE)
EndIf
Else
SendMessage_(hWnd, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
EndIf
Case #WM_SYSMENU
SetWindowLongPtr_(hwnd, #GWL_STYLE, GetWindowLongPtr_(hwnd, #GWL_STYLE)|#WS_SYSMENU)
DefWindowProc_(hWnd, Msg, wParam, lParam)
SetWindowLongPtr_(hwnd, #GWL_STYLE, GetWindowLongPtr_(hwnd, #GWL_STYLE)&~#WS_SYSMENU)
ProcedureReturn 0
Case #WM_NCDESTROY
SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, oldProc)
ProcedureReturn 0
EndSelect
ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
EndProcedure
txt$ = "Borderless window with native shadow..."
OpenWindow(0, 0, 0, 320, 200, txt$, #WS_OVERLAPPEDWINDOW&~#WS_SYSMENU|#PB_Window_ScreenCentered|#PB_Window_Invisible)
TextGadget(0, 22, 4, 200, 20, txt$)
ButtonGadget(1, 0, 0, 20, 20, "_")
ButtonGadget(2, 0, 0, 20, 20, "")
ButtonGadget(3, 0, 0, 20, 20, "×")
ButtonGadget(4, 0, 0, 20, 20, "!")
CreateStatusBar(0, WindowID(0))
SetRect_(@Margin.RECT, 0, 0, 1, 0)
If OpenLibrary(0, "dwmapi.dll")
CallFunction(0, "DwmExtendFrameIntoClientArea", WindowID(0), @Margin)
CallFunction(0, "DwmIsCompositionEnabled", @DWMEnabled)
If DWMEnabled=0
MessageRequester("Info", "Desktop composition is disabled! Sorry, no shadow...")
SetWindowTheme_(WindowID(0), "", "")
EndIf
CloseLibrary(0)
EndIf
CreateImage(0, 8, 8, 32, RGB(127,127,127))
brush = CreatePatternBrush_(ImageID(0))
FreeImage(0)
SetClassLongPtr_(WindowID(0), #GCL_HBRBACKGROUND, brush)
oldProc = SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @WndCallback())
SetWindowPos_(WindowID(0), 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_FRAMECHANGED|#SWP_SHOWWINDOW)
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
DeleteObject_(brush)