'I reworked Semen's code into a reusable implementation as a replacement for
'a standard msgbox. It always centers over it's parent. This was useful when our customers were running two instances
'of a program and needed to keep any messageboxes associated with it's parent window indstead of popping up over
'the other instance of the application. This works for 1 or two monitors. Probably used too many globals though.
'It will return a Yes/No or any other value as determined by the flags.
'a standard msgbox. It always centers over it's parent. This was useful when our customers were running two instances
'of a program and needed to keep any messageboxes associated with it's parent window indstead of popping up over
'the other instance of the application. This works for 1 or two monitors. Probably used too many globals though.
'It will return a Yes/No or any other value as determined by the flags.
Code:
#COMPILE EXE #DIM NONE DEFINT A-Z #INCLUDE "WIN32API.INC" GLOBAL szWinPos AS ASCIIZ * %MAX_PATH GLOBAL FULL_SCREENx AS LONG GLOBAL FULL_SCREENy AS LONG GLOBAL hHook AS LONG,hdlg AS LONG %ID_LABEL = 101 %ID_TEXT = 501 %ID_BUTTON = 11 FUNCTION SBProc(BYVAL lMsg AS LONG, BYVAL wParam AS LONG, _ BYVAL lParam AS LONG) AS LONG IF lMsg = %HCBT_ACTIVATE THEN DIM rc1 AS RECT,rc2 AS RECT GetWindowRect wParam, rc2 GetEnvironmentVariable "WINPOS",szWinPos,%MAX_PATH C2_WINPOS_Y& = VAL(PARSE$(szWinPos,"|",1)) C2_WINPOS_X& = VAL(PARSE$(szWinPos,"|",2)) FULL_SCREENx& = VAL(PARSE$(szWinPos,"|",3)) FULL_SCREENy& = VAL(PARSE$(szWinPos,"|",4)) CALLINGPRGM$ = PARSE$(szWinPos,"|",5) 'hdlgiconic = VAL(PARSE$(szWinPos,"|",6)) rc1.nTop = C2_WINPOS_Y& rc1.nLeft = C2_WINPOS_X& rc1.nBottom = C2_WINPOS_Y& + FULL_SCREENy& rc1.nRight = C2_WINPOS_X& + FULL_SCREENx& SetWindowPos wParam, %HWND_TOPMOST, (rc1.nLeft + rc1.nRight - rc2.nRight + rc2.nLeft) / 2 , _ (rc1.nTop + rc1.nBottom - rc2.nBottom + rc2.nTop) / 2, 0, 0, %SWP_NOSIZE OR %SWP_NOACTIVATE UnhookWindowsHookEx hHook END IF END FUNCTION FUNCTION MSGBX(MSG AS STRING,FLAGS AS LONG,HDG AS STRING) AS LONG hHook = SetWindowsHookEx(%WH_CBT, CODEPTR(SBProc), GetModuleHandle(BYVAL 0&), _ GetCurrentThreadId) FUNCTION = MSGBOX(MSG,FLAGS,HDG) END FUNCTION CALLBACK FUNCTION hDlgProc SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG DIALOG GET LOC CBHNDL TO WINPOS_X&,WINPOS_Y& DIALOG UNITS CBHNDL, WINPOS_X&,WINPOS_Y& TO PIXELS C2_WINPOS_X&,C2_WINPOS_Y& DIALOG GET SIZE CBHNDL TO WINPOS_X&,WINPOS_Y& DIALOG UNITS CBHNDL, WINPOS_X&,WINPOS_Y& TO PIXELS FULL_SCREENx&,FULL_SCREENy& EnvironWinPos$ = STR$(C2_WINPOS_Y&) + "|" + STR$(C2_WINPOS_X&) + "|" + STR$(FULL_SCREENx&) + _ "|" + STR$(FULL_SCREENy&) + "|" + CPROGID$ + "|" + STR$(CBHNDL) SetEnvironmentVariable "WINPOS",BYCOPY EnvironWinPos$ ' Initialization handler CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_MOVE DIALOG GET LOC CBHNDL TO WINPOS_X&,WINPOS_Y& DIALOG UNITS CBHNDL, WINPOS_X&,WINPOS_Y& TO PIXELS C2_WINPOS_X&,C2_WINPOS_Y& DIALOG GET SIZE CBHNDL TO WINPOS_X&,WINPOS_Y& DIALOG UNITS CBHNDL, WINPOS_X&,WINPOS_Y& TO PIXELS FULL_SCREENx&,FULL_SCREENy& EnvironWinPos$ = STR$(C2_WINPOS_Y&) + "|" + STR$(C2_WINPOS_X&) + "|" + STR$(FULL_SCREENx&) + _ "|" + STR$(FULL_SCREENy&) + "|" + CPROGID$ + "|" + STR$(CBHNDL) SetEnvironmentVariable "WINPOS",BYCOPY EnvironWinPos$ CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CBCTL CASE %ID_LABEL CASE %ID_TEXT CASE %ID_BUTTON IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN MSGBX "%ID_BUTTON=" + FORMAT$(%ID_BUTTON), _ %MB_TASKMODAL,"Centered in parent" END IF END SELECT END SELECT END FUNCTION FUNCTION PBMAIN DIALOG NEW 0, "Another centered msgbox", 145, 81, 176, 107, _ %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR _ %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_WINDOWEDGE OR %WS_EX_CONTROLPARENT OR _ %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LABEL, hDlg, %ID_LABEL, "Field", 10, 25, 35, 10 CONTROL ADD TEXTBOX, hDlg, %ID_TEXT, "", 50, 25, 90, 10 CONTROL ADD BUTTON, hDlg, %ID_BUTTON, "Click Me!", 70, 70, 45, 15 DIALOG SHOW MODAL hDlg, CALL hDlgProc END FUNCTION