CENTER statement
Purpose: CENTER displays the control centered on screen, on a window or in a position relative to the vertical and/or horizontal midpoint of a window. In calculating the vertical component of CENTER, the area of the system TaskBar is taken into account.
Syntax 1: CENTER(HndlWnd AS HWND) Parameters:
|
Syntax 2: CENTER(HndlWnd AS HWND [, XYhwnd AS HWND]) Parameters:
|
Syntax 3: CENTER(HndlWnd AS HWND [, X_hwnd AS HWND] [, Y_hwnd AS HWND]) Parameters:
|
Remarks:
Most times, we want to center a form on the screen,
GUI "Center1" SUB FORMLOAD LOCAL Form1 AS CONTROL Form1 = BCX_FORM("Form1", 10, 10, 150, 80) CENTER(Form1) 'Center Form1 On Screen CALL SHOW(Form1) END SUB BEGIN EVENTS END EVENTS
but sometimes we want to center one form on another form,
GUI "Form1_On_Form2" SUB FORMLOAD LOCAL Form1 AS CONTROL LOCAL Form2 AS CONTROL Form1 = BCX_FORM("Form1", 10, 10, 120, 120) Form2 = BCX_FORM("Form2", 100, 100, 200, 200) CENTER(Form1, Form2) 'Center Form1 On Form2 CALL SHOW(Form2) CALL SHOW(Form1) END SUB BEGIN EVENTS END EVENTS
or place a button in the center of a form.
GUI "Test" SUB FORMLOAD DIM Form AS CONTROL DIM Butt AS CONTROL Form = BCX_FORM("Test") Butt = BCX_BUTTON("Button", Form, 123, 0, 0) CENTER(Butt, Form) 'CENTER Button on Form SHOW(Form) END SUB BEGIN EVENTS END EVENTS
And sometimes we want to use our current Y position with a new X position,
GUI "Test_New_Center" SUB FORMLOAD LOCAL Form1 AS CONTROL LOCAL Form2 AS CONTROL Form1 = BCX_FORM("Form1", 100, 10, 80, 80) Form2 = BCX_FORM("Form2", 385, 165, 80, 80) CENTER(Form1, Form2, Form1) CALL SHOW(Form1) CALL SHOW(Form2) END SUB BEGIN EVENTS END EVENTS
and sometimes (albeit rarely), we may want to center between two forms.
GUI "BetweenTwo" SUB FORMLOAD LOCAL Form1 AS CONTROL LOCAL Form2 AS CONTROL LOCAL Form3 AS CONTROL Form1 = BCX_FORM("Form1", 100, 10, 80, 80) Form2 = BCX_FORM("Form2", 385, 165, 80, 80) Form3 = BCX_FORM("Form3", 10, 200) CENTER(Form3,Form1,Form2) 'Center Form3 On Form1(x) AND Form2(y) CALL SHOW(Form1) CALL SHOW(Form2) CALL SHOW(Form3) END SUB BEGIN EVENTS END EVENTS
Although it does not use the CENTER function, this example which snap-centers a window along the four edges of the display, may be useful.
GUI "Form Centering Demo" ENUM ID_Button END ENUM> SUB FORMLOAD GLOBAL Form1 AS HWND GLOBAL Butt1 AS HWND Form1 = BCX_FORM ("New Ways To Center Your Form", 0, 0, 180, 65) Butt1 = BCX_BUTTON("Start Demonstration", Form1, ID_Button, 50, 25, 60, 14) CENTER(Form1) SHOW (Form1) END SUB BEGIN EVENTS SELECT CASE CBMSG CASE WM_COMMAND SELECT CASE CBCTL CASE ID_Button RunDemo() END SELECT END SELECT END EVENTS SUB RunDemo EnableWindow(Butt1,FALSE) FOR INTEGER i = 1 TO 3 CENTER_RIGHT (Form1) : UpdateWindow(Form1) : SLEEP(500) CENTER_TOP (Form1) : UpdateWindow(Form1) : SLEEP(500) CENTER_LEFT (Form1) : UpdateWindow(Form1) : SLEEP(500) CENTER_BOTTOM(Form1) : UpdateWindow(Form1) : SLEEP(500) CENTER (Form1) : UpdateWindow(Form1) : SLEEP(500) NEXT EnableWindow(Butt1,TRUE) END SUB SUB CENTER_TOP (HndlWnd AS HWND) DIM Rect AS RECT, MiddleX, w GetWindowRect(HndlWnd,&Rect) w = Rect.right-Rect.left MiddleX = (GetSystemMetrics(SM_CXSCREEN)*0.5) - (w*0.5) SetWindowPos(HndlWnd,0,MiddleX,0,0,0,SWP_NOSIZE) END SUB SUB CENTER_BOTTOM (HndlWnd AS HWND) DIM Rect AS RECT, MiddleX, BottomY, w, h GetWindowRect(HndlWnd,&Rect) w = Rect.right-Rect.left h = Rect.bottom-Rect.top MiddleX = (GetSystemMetrics(SM_CXSCREEN)*0.5) - (w * 0.5) BottomY = GetSystemMetrics(SM_CYSCREEN) - (h + 31) SetWindowPos(HndlWnd,0,MiddleX,BottomY,0,0,SWP_NOSIZE) END SUB SUB CENTER_LEFT (HndlWnd AS HWND) DIM Rect AS RECT, MiddleY, w, h GetWindowRect(HndlWnd,&Rect) h = Rect.bottom-Rect.top MiddleY = (GetSystemMetrics(SM_CYSCREEN)*0.5) - (h * 0.5) SetWindowPos(HndlWnd,0,0,MiddleY,0,0,SWP_NOSIZE) END SUB SUB CENTER_RIGHT (HndlWnd AS HWND) DIM Rect AS RECT, MiddleY, x,h GetWindowRect(HndlWnd,&Rect) h = Rect.bottom-Rect.top x = GetSystemMetrics(SM_CXSCREEN) - (Rect.right-Rect.left) MiddleY = (GetSystemMetrics(SM_CYSCREEN)*0.5) - (h * 0.5) SetWindowPos(HndlWnd,0,x,MiddleY,0,0,SWP_NOSIZE) END SUB
The default initial location, on invocation of a MSGBOX, is at the center of the monitor. The following code shows how to center a MSGBOX on a form.
GUI "Form1",PIXELS CONST Btn1_Style = WS_CHILD|WS_VISIBLE|WS_TABSTOP CONST Btn1_ExtStyle = WS_EX_STATICEDGE ENUM ID_Btn1 END ENUM GLOBAL Form1 AS HWND GLOBAL hBtn1 AS CONTROL GLOBAL CmDlgHook AS HHOOK SUB FORMLOAD() Form1 = BCX_FORM("Form1", 200, 200, 400, 300) hBtn1 = BCX_BUTTON("Button",Form1,ID_Btn1, 30, 110, 130, 50, Btn1_Style, Btn1_ExtStyle) SHOW(Form1) END SUB BEGIN EVENTS SELECT CASE CBMSG CASE WM_COMMAND SELECT CASE CBCTL CASE ID_Btn1 MSGBOX "This is MSGBOX default position at the center of the monitor." CALL SetOurHook MSGBOX "This is MSGBOX hooked to the center of Form1." END SELECT END SELECT END EVENTS SUB SetOurHook Hook=SetWindowsHookEx(WH_CBT, MBProc,(HINSTANCE)NULL,GetCurrentThreadId()) END SUB FUNCTION MBProc (Msg, wParam AS WPARAM, lParam AS LPARAM) AS LRESULT CALLBACK GLOBAL Hook AS HHOOK '**************************************************************************** ' CALL this HOOK once before each MSGBOX statement to CENTER IT IN A FORM '**************************************************************************** IF Msg = HCBT_ACTIVATE THEN CENTER((HWND)wParam,Form1,Form1) SetWindowPos((HWND)wParam, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE OR SWP_NOMOVE) UnhookWindowsHookEx(Hook) END IF FUNCTION = 0 END FUNCTION