21.09.2025, 03:55 AM
(This post was last modified: 21.09.2025, 04:03 AM by Jules Marchildon.)
I was thinking it would be easier to create a region hole instead to avoid going down a deep rabbit hole to resolve your sizing issue. OK, so here is a snippet I lifted from an old post. It has one side effect...
Code:
'
'-snippet taken from Greg Turgeon post 5 Aug 2007 PowerBASIC forum
' https://forum.powerbasic.com/forum/user-to-user-discussions/powerbasic-for-windows/14801-how-to-make-a-hole?p=205890#post205890
#COMPILE EXE
#DIM ALL
#INCLUDE "WIN32API.INC"
#RESOURCE MANIFEST, 1, "icons\xptheme_dpiaware.xml"
'--------------------------------------------------------------------------------------------------
'
'--------------------------------------------------------------------------------------------------
FUNCTION PBMAIN&()
LOCAL hDlg, x, y, lwide, lhigh AS LONG
DIALOG NEW PIXELS, 0,"", , , 496, 160, %WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_CAPTION OR %WS_THICKFRAME,, TO hDlg
DIALOG GET CLIENT hDlg TO x, y
DIALOG SHOW MODAL hDlg, CALL DlgMain&()
END FUNCTION
'--------------------------------------------------------------------------------------------------
'
'--------------------------------------------------------------------------------------------------
CALLBACK FUNCTION DlgMain&()
STATIC captionHigh AS LONG
LOCAL hRgn, lwide, lhigh, clientWide, clientHigh AS LONG
LOCAL rc AS RECT, p() AS POINTL
SELECT CASE AS LONG CBMSG
CASE %WM_INITDIALOG
captionHigh = GetSystemMetrics(%SM_CYCAPTION)
SetWindowPos CBHNDL, %HWND_TOPMOST, 0, 0, 0, 0, %SWP_NOSIZE OR %SWP_NOMOVE
DIALOG GET SIZE CBHNDL TO lwide, lhigh
DIALOG GET CLIENT CBHNDL TO clientWide, clientHigh
SetRect rc, 10, (lhigh-clientHigh)+captionHigh*2, lwide-10, lhigh-captionHigh
hRgn = CreateRectRgn(rc.nLeft, rc.nTop, rc.nRight, rc.nBottom)
CreateHole CBHNDL, hRgn, %TRUE
CASE %WM_SIZE
DIALOG GET SIZE CBHNDL TO lwide, lhigh
DIALOG GET CLIENT CBHNDL TO clientWide, clientHigh
SetRect rc, 10, (lhigh-clientHigh)+captionHigh*2, lwide-10, lhigh-captionHigh
hRgn = CreateRectRgn(rc.nLeft, rc.nTop, rc.nRight, rc.nBottom)
CreateHole CBHNDL, hRgn, %TRUE
END SELECT
END FUNCTION
'--------------------------------------------------------------------------------------------------
'
'--------------------------------------------------------------------------------------------------
FUNCTION CreateHole&(BYVAL hWnd AS LONG, BYVAL hRGN AS LONG, BYVAL Action AS LONG)
LOCAL windowRect AS RECT, hWindowRgn, hHoleRgn, hThisRgn AS LONG
GetWindowRect hWnd, windowRect
hWindowRgn = CreateRectRgn(0,0,WindowRect.nRight, WindowRect.nBottom)
hHoleRgn = CreateRectRgn(0,0,0,0)
IF Action THEN
hThisRgn = CreateRectRgn (0,0,0,0)
CombineRgn hThisRgn, hRGN, 0&, %RGN_COPY
ELSE
CombineRgn hThisRgn, hRGN, 0&, %RGN_OR
END IF
CombineRgn hHoleRgn, hThisRgn, hWindowRgn, %RGN_XOR
SetWindowRgn hWnd, hHoleRgn, %TRUE
END FUNCTION