Code: Select all
Global oldProc, brush, DWMEnabled, sizeCursor, border=8
#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-border, border, 0, 0, #SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOCOPYBITS)
SetWindowPos_(GadgetID(2), 0, width-40-border, border, 0, 0, #SWP_NOSIZE|#SWP_NOZORDER|#SWP_NOCOPYBITS)
SetWindowPos_(GadgetID(1), 0, width-60-border, border, 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+22+border)<<16 + p\x)
EndSelect
Case #WM_MOUSEMOVE
posX = lParam & $FFFF
posY = (lParam >> 16) & $FFFF
width = WindowWidth(0)
height = WindowHeight(0)
sizeCursor = 0
If IsZoomed_(hWnd) = 0
If posX <= border And posY <= border
SetCursor_(LoadCursor_(0, #IDC_SIZENWSE))
sizeCursor = #HTTOPLEFT
ElseIf posX > border And posX <= width - border And posY <= border
SetCursor_(LoadCursor_(0, #IDC_SIZENS))
sizeCursor = #HTTOP
ElseIf posX > width - border And posY <= border
SetCursor_(LoadCursor_(0, #IDC_SIZENESW))
sizeCursor = #HTTOPRIGHT
ElseIf posX > width - border And posY > border And posY <= height - border
SetCursor_(LoadCursor_(0, #IDC_SIZEWE))
sizeCursor = #HTRIGHT
ElseIf posX > width - border And posY > height - border
SetCursor_(LoadCursor_(0, #IDC_SIZENWSE))
sizeCursor = #HTBOTTOMRIGHT
ElseIf posX > border And posX <= width - border And posY > height - border
SetCursor_(LoadCursor_(0, #IDC_SIZENS))
sizeCursor = #HTBOTTOM
ElseIf posX <= border And posY > height - border
SetCursor_(LoadCursor_(0, #IDC_SIZENESW))
sizeCursor = #HTBOTTOMLEFT
ElseIf posX <= border And posY > border And posY <= height - border
SetCursor_(LoadCursor_(0, #IDC_SIZEWE))
sizeCursor = #HTLEFT
EndIf
EndIf
If wParam = 0 And sizeCursor = 0
SetCursor_(LoadCursor_(0, #IDC_ARROW))
ElseIf wParam = #MK_LBUTTON
SendMessage_(hWnd, #WM_NCLBUTTONDOWN, sizeCursor, 0)
EndIf
Case #WM_LBUTTONDOWN, #WM_LBUTTONDBLCLK
GetCursorPos_(cursor.POINT)
MapWindowPoints_(0, hWnd, cursor, 1)
If cursor\y <= 22+border And sizeCursor = 0
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
Select sizeCursor
Case #HTTOPLEFT, #HTBOTTOMRIGHT
SetCursor_(LoadCursor_(0, #IDC_SIZENWSE))
Case #HTTOP, #HTBOTTOM
SetCursor_(LoadCursor_(0, #IDC_SIZENS))
Case #HTTOPRIGHT, #HTBOTTOMLEFT
SetCursor_(LoadCursor_(0, #IDC_SIZENESW))
Case #HTLEFT, #HTRIGHT
SetCursor_(LoadCursor_(0, #IDC_SIZEWE))
EndSelect
If Msg = #WM_LBUTTONDBLCLK
If sizeCursor = #HTTOP
SendMessage_(hWnd, #WM_NCLBUTTONDBLCLK, #HTTOP, 0)
ElseIf sizeCursor = #HTBOTTOM
SendMessage_(hWnd, #WM_NCLBUTTONDBLCLK, #HTBOTTOM, 0)
EndIf
EndIf
Case #WM_LBUTTONUP
Select sizeCursor
Case #HTTOPLEFT, #HTBOTTOMRIGHT
SetCursor_(LoadCursor_(0, #IDC_SIZENWSE))
Case #HTTOP, #HTBOTTOM
SetCursor_(LoadCursor_(0, #IDC_SIZENS))
Case #HTTOPRIGHT, #HTBOTTOMLEFT
SetCursor_(LoadCursor_(0, #IDC_SIZENESW))
Case #HTLEFT, #HTRIGHT
SetCursor_(LoadCursor_(0, #IDC_SIZEWE))
EndSelect
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+border, 4+border, 200, 20, txt$)
ButtonGadget(1, 0, 0, 20, 20, "_")
ButtonGadget(2, 0, 0, 20, 20, "")
ButtonGadget(3, 0, 0, 20, 20, "×")
ButtonGadget(4, border, border, 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)