*-------------------------------------------------------------------------------------------------------------------------------------------------------- * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- *< FOXBIN2PRG: Version="1.21" SourceFile="ctl32_statusbar.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * * DEFINE CLASS ctl32_statusbar AS container *< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" /> *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder *< OBJECTDATA: ObjPath="lblname" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="tmrUpdater" UniqueID="" Timestamp="" /> #INCLUDE "ctl32.h" * *m: ctl32_addpanels && Adds Panels objects to StatusBar container *m: ctl32_adjustprogressbar *m: ctl32_bindevents && Binds events. *m: ctl32_create *m: ctl32_declaredlls && DLL declarations. *m: ctl32_destroy *m: ctl32_formactivate && Binded to Form.Activate, for top level forms, it creates statusbar after form is visible *m: ctl32_formdestroy *m: ctl32_getborder && Returns the width of the especified border: 1 = Horizontal, 2 = Vertical, 3 = Separator *m: ctl32_getdate *m: ctl32_resize && Bound to Form.Resize *m: ctl32_resizepanels && Recalculates panel widths based on content *m: ctl32_setlocalestrings && Sets Locale strings for PanelCaps, PanelOvr, PanelNum *m: ctl32_settheme *m: ctl32_unbindevents *m: ctl32_width_access *m: ctl32_wm_notify && Handles mouse clicks in statusbar window *m: ctlcaption_access *m: ctlcaption_assign *m: ctlclick *m: ctldblclick *m: ctlhwnd_access *m: ctlicon_assign *m: ctlmessage_access *m: ctlmessage_assign *m: ctlos *m: ctlrightclick *m: ctltheme *m: ctlthemes_assign *m: eventhandler_form_resize *m: eventhandler_form_themes *m: eventhandler_form_visible *m: eventhandler_screen_themes *m: eventhandler_screen_wm_size *m: eventhandler_vfp_wm_themechanged *m: getstringsize *m: newtooltip *m: showprogressbarcaption_assign *p: builderx *p: ctl32_controlhwnd && CreateWindowEx return value. *p: ctl32_creating *p: ctl32_dblclick *p: ctl32_dwexstyle && CreateWindowEx parameter. *p: ctl32_dwstyle && CreateWindowEx parameter. *p: ctl32_formtype && 0 = Standard Form, 1 = Top Level Form, 2 = _Screen *p: ctl32_height *p: ctl32_hinstance && CreateWindowEx parameter. *p: ctl32_hmenu && CreateWindowEx parameter. *p: ctl32_hosthwnd && Hwnd of Host window that contains the statusbar window. (And the proxy window when not in a standard Form) *p: ctl32_lpclassname && CreateWindowEx parameter. *p: ctl32_lpparam && CreateWindowEx parameter. *p: ctl32_lpwindowname && CreateWindowEx parameter. *p: ctl32_name && Name of the control class *p: ctl32_oldcaps *p: ctl32_olddate *p: ctl32_oldmessage *p: ctl32_oldnum *p: ctl32_oldovr *p: ctl32_oldproc *p: ctl32_oldwindowstate *p: ctl32_panelcount && Indicates how many special panels are in the statusbar *p: ctl32_proxyhwnd && Hwnd of proxy window that contains statusbar window when not in standard form *p: ctl32_version *p: ctl32_vfpstatusbarhwnd *p: ctl32_width *p: ctlabout *p: ctlcaption *p: ctlhwnd && Specifies the Window handle of the Control. *p: ctlicon && Use PanelMessage.Icon instead *p: ctlmessage && Use PanelMessage.Caption instead *p: ctlpanelcount && Indicates how many custom panels are available. *p: ctlthemes *p: ctlversion *p: nbutton *p: npanel *p: nxcoord *p: nycoord *p: showprogressbarcaption *a: ctl32_panelborders[3,0] *a: ctl32_panels[1,0] *a: ctlpanels[1,0] *p: _memberdata && XML Metadata for customizable properties * HIDDEN ctl32_controlhwnd,ctl32_dwexstyle,ctl32_dwstyle,ctl32_height,ctl32_hinstance,ctl32_hmenu,ctl32_hosthwnd,ctl32_lpclassname,ctl32_lpparam,ctl32_lpwindowname,ctl32_name,ctl32_oldwindowstate,ctl32_panelborders,ctl32_proxyhwnd,ctl32_version,ctl32_vfpstatusbarhwnd,ctl32_width * Anchor = 10 BackColor = 140,200,200 BorderWidth = 1 builderx = (home() + "wizards\ctl32_statusbar_builder.app") ctl32_controlhwnd = 0 ctl32_dblclick = 0 ctl32_dwexstyle = 0 ctl32_dwstyle = 0 ctl32_formtype = 0 ctl32_height = 0 ctl32_hinstance = 0 ctl32_hmenu = 0 ctl32_hosthwnd = 0 ctl32_lpclassname = 0 ctl32_lpparam = 0 ctl32_lpwindowname = 0 ctl32_name = ctl32_StatusBar ctl32_oldcaps = .F. ctl32_olddate = 0 ctl32_oldmessage = 0 ctl32_oldproc = 0 ctl32_oldwindowstate = 0 ctl32_panelcount = 7 ctl32_proxyhwnd = 0 ctl32_version = 3.0 (2006-05-05) ctl32_vfpstatusbarhwnd = 0 ctl32_width = 0 ctlabout = ctl32_statusbar by Carlos Alloatti. ctlcaption = ctlhwnd = 0 ctlicon = ctlmessage = ctlpanelcount = 5 ctlthemes = .T. ctlversion = 20061010 ForeColor = 0,0,0 Height = 24 Name = "ctl32_statusbar" nbutton = 0 npanel = 0 nxcoord = 0 nycoord = 0 showprogressbarcaption = .F. Visible = .F. Width = 360 * ADD OBJECT 'lblname' AS label WITH ; AutoSize = .T., ; BackStyle = 0, ; Caption = "ctl32_StatusBar", ; FontName = "Tahoma", ; FontSize = 8, ; ForeColor = 0,0,128, ; Left = 6, ; Name = "lblname", ; Top = 4 *< END OBJECT: BaseClass="label" /> ADD OBJECT 'tmrUpdater' AS timer WITH ; Enabled = .F., ; Height = 23, ; Interval = 50, ; Left = -25, ; Name = "tmrUpdater", ; Top = 0, ; Width = 23 *< END OBJECT: BaseClass="timer" /> PROCEDURE ctl32_addpanels && Adds Panels objects to StatusBar container *!* StatusBar Panel 0 is the Message Panel *!* StatusBar Panel 1 is the ProgressBar Panel *!* StatusBar Panel 2 is Custom Panel 1 *!* StatusBar Panel 3 is Custom Panel 2 *!* ... *!* StatusBar Panel n is Custom Panel n -1 *!* StatusBar Panel .ctlPanelCount + 5 is PanelOvr *!* StatusBar Panel 6 is PanelNum *!* StatusBar Panel 7 is PanelCaps *!* StatusBar Panel 8 is PanelDate *!* StatusBar Panel 9 is Last Panel for sizing *!* This.ctlPanels(1) = Panel1 -> StatusBar Panel 2 (index 0 based in windows statusbar control) *!* This.ctlPanels(2) = Panel2 -> StatusBar Panel 3 (index 0 based) *!* This.ctlPanels(3) = Panel3 -> StatusBar Panel 4 (index 0 based) Local lnx As Number, ; lnLeftPanelCount As Number, ; lnRightPanelCount As Number, ; lnTotPanelCount As Number With This *!* lnLeftPanelCount is the number of fixed panels to the left of the custom panels *!* lnRightPanelCount is the number of fixed panels to the right of the custom panels m.lnLeftPanelCount = 2 m.lnRightPanelCount = 5 m.lnTotPanelCount = .ctlPanelCount + m.lnLeftPanelCount + m.lnRightPanelCount *!* Resize array properties to hold references to all Panel objects Dimension .ctl32_Panels(m.lnTotPanelCount) Dimension .ctlPanels(.ctlPanelCount) *!* Store defined names of Panels in this array Local Array laPanelNames(m.lnTotPanelCount) m.laPanelNames(1) = [PanelMessage] m.laPanelNames(2) = [PanelProgressBar] *!* 2006-06-27 Changed to ALLTRIM(STR //Doru Constantin// For m.lnx = m.lnLeftPanelCount + 1 To m.lnLeftPanelCount + .ctlPanelCount m.laPanelNames(m.lnx) = [Panel] + Alltrim(Str(m.lnx - m.lnLeftPanelCount)) Endfor m.laPanelNames(m.lnLeftPanelCount + .ctlPanelCount + 1) = [PanelOvr] m.laPanelNames(m.lnLeftPanelCount + .ctlPanelCount + 2) = [PanelNum] m.laPanelNames(m.lnLeftPanelCount + .ctlPanelCount + 3) = [PanelCaps] m.laPanelNames(m.lnLeftPanelCount + .ctlPanelCount + 4) = [PanelDate] m.laPanelNames(m.lnLeftPanelCount + .ctlPanelCount + 5) = [PanelLast] *!* Create left Panels For m.lnx = 1 To m.lnLeftPanelCount .Newobject(m.laPanelNames(m.lnx), [ctl32_StatusBar_Panel], This.ClassLibrary) .ctl32_Panels(m.lnx) = Evaluate([.] + m.laPanelNames(m.lnx)) .ctl32_Panels(m.lnx).Index = m.lnx - 1 && Compensate for 0 based index Endfor *!* set this so alignment works in this Panel .PanelMessage.AutoSize = FALSE *!* Create custom Panels For m.lnx = m.lnLeftPanelCount + 1 To m.lnLeftPanelCount + .ctlPanelCount .Newobject(m.laPanelNames(m.lnx), [ctl32_StatusBar_Panel], This.ClassLibrary) .ctl32_Panels(m.lnx) = Evaluate([.] + m.laPanelNames(m.lnx)) .ctl32_Panels(m.lnx).Index = m.lnx - 1 .ctlPanels(m.lnx - 2) = .ctl32_Panels(m.lnx) Endfor *!* Create right Panels For m.lnx = m.lnLeftPanelCount + .ctlPanelCount + 1 To m.lnTotPanelCount .Newobject(m.laPanelNames(m.lnx), [ctl32_StatusBar_Panel], This.ClassLibrary) .ctl32_Panels(m.lnx) = Evaluate([.] + m.laPanelNames(m.lnx)) .ctl32_Panels(m.lnx).Index = m.lnx - 1 Endfor Endwith ENDPROC PROCEDURE ctl32_adjustprogressbar Local lcRect As Character, ; lnTop As Number, ; lnBottom As Number, ; lnTopMargin As Number, ; lnBottomMargin As Number Local lnColorBtnFace As Number *!* Set ProgressBar Top and Height, get Height of StatusBar window *!* 2006-06-27 Changed to use structs class m.lcRect = This.ctl32_Rect._Struct GetClientRect(.ctl32_ControlHwnd, @m.lcRect) This.ctl32_Rect._Struct = m.lcRect m.lnTop = This.ctl32_Rect._Top m.lnBottom = This.ctl32_Rect._Bottom *!* Just in case we need to make adjustments to this values later If This.ctlTheme() Then m.lnTopMargin = This.ctl32_getborder(CON_SBBORDER_VERTICAL) + 3 m.lnBottomMargin = This.ctl32_getborder(CON_SBBORDER_VERTICAL) Else m.lnTopMargin = This.ctl32_getborder(CON_SBBORDER_VERTICAL) + 2 m.lnBottomMargin = This.ctl32_getborder(CON_SBBORDER_VERTICAL) Endif This.ProgressBar.Top = m.lnTop + m.lnTopMargin This.ProgressBar.Height = m.lnBottom - m.lnTop - m.lnTopMargin - m.lnBottomMargin *!* Send color update message to correct bugs with theme changes If This.ProgressBar.ctlHWnd > 0 Then SendMessageN(This.ProgressBar.ctlHWnd, WM_SYSCOLORCHANGE , 0, 0) m.lnColorBtnFace = GetSysColor(COLOR_BTNFACE) SendMessageN(This.ProgressBar.ctlHWnd, PBM_SETBKCOLOR, 0, m.lnColorBtnFace) Endif ENDPROC HIDDEN PROCEDURE ctl32_bindevents && Binds events. *!* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp9/html/f988d7c6-f382-40dd-a51a-b5ab73eb08c7.asp *!* Windows Theme change WM_THEMECHANGED *!* statusbar in screen, no bottom toolbar docked: handled by Resize event in ctl32_resize *!* statusbar in screen, bottom toolbar docked: Bind WM_THEMECHANGED *!* statusbar in form or tlf: Bind WM_THEMECHANGED, to fix colors *!* _Screen.Themes Change *!* statusbar in screen, no bottom toolbar docked: handled by Resize event in ctl32_resize *!* statusbar in screen, bottom toolbar docked: Bind _Screen.Themes to ctl32_SetTheme *!* statusbar in form or tlf, Bind _Screen.Themes to ctl32_SetTheme *!* Form.Themes Change *!* statusbar in screen, nothing to do *!* statusbar in form or tlf: Bind Form.Themes to ctl32_SetTheme If This.ctlOS() >= CON_OS_WINXP And Version(CON_VER_NUM) >= 900 Then Bindevent(_vfp.HWnd, WM_THEMECHANGED, This, [EventHandler_VFP_WM_THEMECHANGED], 1) Endif Bindevent(_Screen, [Themes], This, [EventHandler_Screen_Themes], 1) If This.ctl32_FormType <> CON_FORMTYPE_SCREEN Bindevent(Thisform, [Themes], This, [EventHandler_Form_Themes], 1) Endif *!* Check for undocking of bottom toolbars, _Screen.Resize event does not fire *!* when toolbar docked at bottom of screen is undocked. If This.ctl32_FormType = CON_FORMTYPE_SCREEN Then Bindevent(This.ctl32_HostHWnd, WM_SIZE, This, [EventHandler_Screen_WM_SIZE], 1) Endif *!* Monitor _Screen or Form resizes Bindevent(Thisform, [Resize], This, [EventHandler_Form_Resize], 1) Bindevent(This.ctl32_ProxyHWnd, WM_NOTIFY, This, [ctl32_WM_Notify], 1) *!* When ProgressBar Visible or Width changes, we should resize panels Bindevent(This.ProgressBar, [ctlVisible], This, [ctl32_ResizePanels], 1) Bindevent(This.ProgressBar, [Width], This, [ctl32_ResizePanels], 1) *!* If we are in a TLF, we are responsible for releasing the toolbar we added (are we?) If This.ctl32_FormType = CON_FORMTYPE_DEFAULT Then Bindevent(Thisform, [Destroy], This, [ctl32_FormDestroy], 0) Endif *!* When host is a Standard Form and the form is resized in its Init event, *!* the Resize event of the form does not fire, so we bind to Visible *!* property of the form to cover all the bases like: *!* Do Form xxx Noshow *!* 2006-06-27 //Andrew Nickless// If This.ctl32_FormType = CON_FORMTYPE_DEFAULT Then Bindevent(Thisform, [Visible], This, [EventHandler_Form_Visible], 1) Endif ENDPROC PROCEDURE ctl32_create *!* Prevent recursive calling? If This.ctl32_Creating = TRUE Then Return Endif Local lnx As Number, ; lnSize As Number, ; lcClass As Character, ; llOldLockScreen As Logical, ; lnBottom As Number, ; lcRect As Character *!* 2006-06-27 Removed window creation parameters as class properties and set them as local vars Local ; dwExStyle As Integer, ; lpClassName As Character, ; lpWindowName As Character, ; dwStyle As Integer, ; hWndParent As Integer, ; hMenu As Integer, ; hInstance As Integer, ; lpParam As Integer With This *!* We enter Initialization Stage .ctl32_Creating = TRUE m.llOldLockScreen = Thisform.LockScreen .ctl32_OldWindowState = -1 && Init to a fake value, used by ctl32_Resize *!* Init indicators values, to trigger update of indicators in tmrUpdater .ctl32_OldOvr = Not Insmode() .ctl32_OldNum = Not Numlock() .ctl32_OldCaps = Not Capslock() *!* Lock Form/Screen updates until we are done: If .ctl32_FormType = CON_FORMTYPE_SCREEN Then LockWindowUpdate(_vfp.HWnd) Else Thisform.LockScreen = TRUE Endif *!* We need the native Status Bar visible, otherwise _vfp.StatusBar gives us nothing! If Set([Status Bar]) = [OFF] Then Set Status Bar On Endif *!* Set ctl32_StatusBar Height, this is used by proxy window .ctl32_Height = 24 *!* When StatusBar is contained in a TLF or _Screen, we need a proxy window If .ctl32_FormType <> CON_FORMTYPE_DEFAULT && TLF or Screen *!* prepare to add aux toolbar, that creates the required bottom window to hold proxy window *!* in a TLF, and gives us a way to get the hwnd of the host window If Not Pemstatus(Thisform, [StatusBar_ToolBar], CON_PEMSTAT_DEFINED) Then Thisform.AddProperty([StatusBar_ToolBar]) Else Thisform.StatusBar_ToolBar = Null Endif *!* add auxiliary toolbar, this toolbar docks itself to bottom of Form/Screen *!* If in _Screen we just use it to get Hwnd of Host window Thisform.StatusBar_ToolBar = Newobject([ctl32_StatusBar_ToolBar], This.ClassLibrary) *!* 2006-06-27 Removed window creation parameters as class properties and set them as local vars *!* Setup parameters for proxy window: m.dwExStyle = WS_EX_NOPARENTNOTIFY m.lpWindowName = [StatusBar_proxy_window] + Sys(2015) m.dwStyle = Bitor(WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS, WS_CLIPCHILDREN) .ctl32_HostHWnd = GetParent(Thisform.StatusBar_ToolBar.HWnd) && Neat Trick! m.hMenu = 0 m.hInstance = GetWindowLong(_vfp.HWnd, GWL_HINSTANCE) m.lpParam = 0 *!* Find class name to use for proxy window from host VFP window (www.news2news.com) m.lcClass = Replicate(Chr(0), 254) m.lnSize = RealGetWindowClass (.ctl32_HostHWnd, @m.lcClass , Len(m.lcClass)) m.lcClass = Strtran(Substr(m.lcClass, 1, m.lnSize), Chr(0), []) m.lpClassName = m.lcClass *!* If statusbar is on screen, remove auxiliary ToolBar, VFP native StatusBar keeps host window alive *!* Also, if left, it makes the bottom window taller. We dont want that. *!* In a TLF, we need this ToolBar to keep host window alive. Added bonus: maximized child Forms *!* dont overlap StatusBar If .ctl32_FormType = CON_FORMTYPE_SCREEN Then Thisform.StatusBar_ToolBar.Dock(TOOL_NOTDOCKED) Thisform.StatusBar_ToolBar = Null Endif *!* Now that aux toolbar is out of the way, get HWnd of native statusbar to hide it *!* if we are on _Screen If .ctl32_FormType = CON_FORMTYPE_SCREEN m.lcRect = This.ctl32_Rect._Struct GetClientRect(.ctl32_HostHWnd, @m.lcRect) This.ctl32_Rect._Struct = m.lcRect m.lnBottom = This.ctl32_Rect._Bottom .ctl32_vfpStatusBarHWnd = ChildWindowFromPoint(.ctl32_HostHWnd, 0, m.lnBottom) _ShowWindow(.ctl32_vfpStatusBarHWnd, SW_HIDE) Endif *!* CREATE proxy window now: .ctl32_ProxyHWnd = CreateWindowEx( ; m.dwExStyle, ; m.lpClassName, ; m.lpWindowName, ; m.dwStyle, ; 0, ; 0, ; .ctl32_Width, ; .ctl32_Height,; .ctl32_HostHWnd,; m.hMenu, ; m.hInstance, ; m.lpParam) *!* Only for debugging purposes If .ctl32_ProxyHWnd = 0 And Version(CON_VER_TYPE) <> CON_VER_TYPE_RUNTIME LockWindowUpdate(0) Thisform.LockScreen = m.llOldLockScreen Messagebox([Error Creating window ] + m.lpClassName, 0 + 16, .ctl32_Name) Endif *!* When StatusBar is contained in a standard Form, there is no need for a proxy window Else .ctl32_HostHWnd = Thisform.HWnd .ctl32_ProxyHWnd = Thisform.HWnd Endif *!* setup parameters for StatusBar control window: m.dwExStyle = 0 m.lpClassName = STATUSCLASSNAMEA m.lpWindowName = m.lpClassName + Sys(2015) m.dwStyle = Bitor(WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS, SBARS_TOOLTIPS, CCS_BOTTOM) If Thisform.BorderStyle = CON_BS_SIZABLE Then m.dwStyle = Bitor(m.dwStyle, SBARS_SIZEGRIP) Endif m.hMenu = 0 m.hInstance = GetWindowLong(_vfp.HWnd, GWL_HINSTANCE) m.lpParam = 0 *!* 2006-06-27 Removed window creation parameters as class properties and set them as local vars *!* Create StatusBar control window: .ctl32_ControlHwnd = CreateWindowEx( ; m.dwExStyle, ; m.lpClassName, ; m.lpWindowName, ; m.dwStyle, ; 0, ; 0, ; 0, ; 0, ; .ctl32_ProxyHWnd, ; m.hMenu, ; m.hInstance, ; m.lpParam) *!* Only for debugging purposes If .ctl32_ControlHwnd = 0 And Version(CON_VER_TYPE) <> CON_VER_TYPE_RUNTIME LockWindowUpdate(0) Thisform.LockScreen = FALSE Messagebox([Error Creating window ] + m.lpClassName, 0 + 16, .ctl32_Name) Endif *!* Send various messages to StatusBar: *!* Set simple to FALSE: SendMessageN(.ctl32_ControlHwnd, SB_SIMPLE , 0, 0) *!* Set minimum Height: SendMessageN(.ctl32_ControlHwnd, SB_SETMINHEIGHT, 22, 0) *!* Set locale strings for OVR, NUM, CAPS .ctl32_SetLocaleStrings() *!* Set Height and Vertical position of ProgressBar .ctl32_AdjustProgressBar() *!* Todo, refresh Panels captions and icons just in case we are recreating StatusBar *!* after an OS Theme change For m.lnx = 1 To .ctlPanelCount + .ctl32_PanelCount .ctl32_Panels(m.lnx).ctl32_UpdateAll() Endfor *!* We finish Initialization State .ctl32_Creating = FALSE Endwith && This *!* We call the ProgressBar init method now, that was not run when it was added to statusbar *!* because we passed a parameter of -1. Check ProgressBar class Init *!* We do this now that we have a handle to the statusbar control This.ProgressBar.Init(This.ctl32_ControlHwnd) With This *!* This has to be done here to update panels: .ctl32_resize() *!* Set colors of statusbar, it fails to set right by itself, *!* sometimes, when XP theme changed to classic If This.ctlOS() >= CON_OS_WINXP && And isThemeActive() = 0 Then SendMessageN(.ctl32_ControlHwnd, WM_SYSCOLORCHANGE , 0, 0) Endif *!* Send Theme message to control: .ctl32_SetTheme() *!* 2006-06-27 Moved this before ctl32_BindEvents *!* Unlock Form/Screen updates: LockWindowUpdate(0) Thisform.LockScreen = m.llOldLockScreen *!* Now we bind to various events: .ctl32_BindEvents() *!* Enable updater timer: .tmrUpdater.Enabled = TRUE Endwith && This ENDPROC HIDDEN PROCEDURE ctl32_declaredlls && DLL declarations. *!* http://blogs.msdn.com/calvin_hsia/archive/2006/04/24/582479.aspx *!* http://blogs.msdn.com/calvin_hsia/archive/2006/04/27/585305.aspx *!* win32api: kernel32.dll, gdi32.dll, user32.dll, mpr.dll, advapi32.dll *!* 2006-06-27 Found a bug in VFP: if you declare an API function with an alias and *!* later declare the same API function without an alias, the first aliased declare *!* dissapears Local Array laDeclaredDlls(1,3) Local lnLen As Number m.lnLen = Adlls(m.laDeclaredDlls) If Ascan(m.laDeclaredDlls, [CallWindowProc], 1, m.lnLen , 2, 15) = 0 Declare Integer CallWindowProc In win32api ; integer lpPrevWndFunc,; integer HWnd,; integer msg,; integer wParam,; integer Lparam Endif If Ascan(m.laDeclaredDlls, [ChildWindowFromPoint], 1, m.lnLen , 2, 15) = 0 Declare Integer ChildWindowFromPoint In win32api ; integer hWndParent,; integer px,; integer py Endif If Ascan(m.laDeclaredDlls, [CreateWindowEx], 1, m.lnLen , 2, 15) = 0 Declare Integer CreateWindowEx In win32api ; integer dwExStyle,; string lpClassName,; string lpWindowName,; integer dwStyle,; integer x,; integer Y,; integer nWidth,; integer nHeight,; integer hWndParent,; integer hMenu,; integer hInstance,; integer lpParam Endif If Ascan(m.laDeclaredDlls, [DestroyWindow], 1, m.lnLen , 2, 15) = 0 Declare Integer DestroyWindow In win32api ; integer HWnd Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [FindWindowEx], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer FindWindowEx In win32api ; *!* INTEGER hWnd1, ; *!* INTEGER hWnd2, ; *!* STRING @ lpsz1, ; *!* STRING @ lpsz2 *!* Endif If Ascan(m.laDeclaredDlls, [GetClientRect], 1, m.lnLen , 2, 15) = 0 Declare Integer GetClientRect In win32api ; integer HWnd,; string @ lcRect Endif If Ascan(m.laDeclaredDlls, [GetDateFormat], 1, m.lnLen , 2, 15) = 0 Declare Integer GetDateFormat In win32api As GetDateFormat; integer Locale,; integer dwFlags,; string @lpDate,; integer lpFormat,; string @lpDateStr,; integer cchDate Endif If Ascan(m.laDeclaredDlls, [GetDC], 1, m.lnLen , 2, 15) = 0 Declare Integer GetDC In win32api ; integer HWnd Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [GetDeviceCaps], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer GetDeviceCaps In win32api ; *!* Integer hdc, ; *!* Integer nIndex *!* Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [GetDoubleClickTime], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer GetDoubleClickTime In win32api *!* Endif If Ascan(m.laDeclaredDlls, [GetLocaleInfo], 1, m.lnLen , 2, 15) = 0 Declare Integer GetLocaleInfo In win32api ; integer Locale, ; integer LCType, ; string lpLCData, ; integer cchData Endif If Ascan(m.laDeclaredDlls, [GetParent], 1, m.lnLen , 2, 15) = 0 Declare Integer GetParent In win32api ; integer HWnd Endif If Ascan(m.laDeclaredDlls, [GetSysColor], 1, m.lnLen , 2, 15) = 0 Declare Integer GetSysColor In win32api ; integer nIndex Endif If Ascan(m.laDeclaredDlls, [GetTextExtentPoint32], 1, m.lnLen , 2, 15) = 0 Declare Integer GetTextExtentPoint32 In win32api ; integer hdc, ; string lpsz, ; integer cbString, ; string @ lpSize Endif If Ascan(m.laDeclaredDlls, [GetWindowLong], 1, m.lnLen , 2, 15) = 0 Declare Integer GetWindowLong In win32api ; integer HWnd, ; integer nIndex Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [GetWindowRect], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer GetWindowRect In win32api ; *!* INTEGER HWnd, ; *!* STRING @ lcRect *!* Endif If This.ctlOS() >= CON_OS_WINXP Then If Ascan(m.laDeclaredDlls, [IsThemeActive], 1, m.lnLen , 2, 15) = 0 Declare Integer IsThemeActive In uxtheme.Dll Endif Endif If Ascan(m.laDeclaredDlls, [IsWindow], 1, m.lnLen , 2, 15 ) = 0 Declare Integer IsWindow In win32api ; integer HWnd Endif If Ascan(m.laDeclaredDlls, [LockWindowUpdate], 1, m.lnLen , 2, 15 ) = 0 Declare Integer LockWindowUpdate In win32api ; integer hwndLock Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [PostMessage], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer PostMessage In win32api ; *!* INTEGER HWnd,; *!* INTEGER Msg,; *!* INTEGER wParam,; *!* INTEGER Lparam *!* Endif If Ascan(m.laDeclaredDlls, [RealGetWindowClass], 1, m.lnLen , 2, 15) = 0 Declare Integer RealGetWindowClass In win32api ; integer HWnd,; string @ pszType,; integer cchType Endif *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [RedrawWindow], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer RedrawWindow In win32api ; *!* INTEGER HWnd,; *!* STRING @ lprcUpdate,; *!* INTEGER hrgnUpdate,; *!* INTEGER fuRedraw *!* Endif If Ascan(m.laDeclaredDlls, [ReleaseDC], 1, m.lnLen , 2, 15) = 0 Declare Integer ReleaseDC In win32api ; integer HWnd, ; integer hdc Endif If Ascan(m.laDeclaredDlls, [SelectObject], 1, m.lnLen , 2, 15) = 0 Declare Integer SelectObject In win32api ; integer hdc, ; integer hObject Endif *!* 2006-06-27 Added first declaration with no alias If Ascan(m.laDeclaredDlls, [SendMessage], 1, m.lnLen , 2, 15) = 0 Declare Integer SendMessageA In win32api ; integer HWnd,; integer Msg,; integer wParam,; integer Lparam Endif If Ascan(m.laDeclaredDlls, [SendMessageN], 1, m.lnLen , 2, 15) = 0 Declare Integer SendMessage In win32api As SendMessageN ; integer HWnd,; integer Msg,; integer wParam,; integer Lparam Endif If Ascan(m.laDeclaredDlls, [SendMessageC], 1, m.lnLen , 2, 15) = 0 Declare Integer SendMessage In win32api As SendMessageC ; integer HWnd,; integer Msg,; integer wParam,; string @ Lparam Endif If Ascan(m.laDeclaredDlls, [SetWindowLong], 1, m.lnLen , 2, 15) = 0 Declare Integer SetWindowLong In win32api ; integer HWnd,; integer nIndex,; integer dwNewLong Endif If Ascan(m.laDeclaredDlls, [SetWindowPos], 1, m.lnLen , 2, 15) = 0 Declare Integer SetWindowPos In win32api ; integer HWnd,; integer hWndInsertAfter,; integer x,; integer Y,; integer cx,; integer cy,; integer wFlags Endif If This.ctlOS() >= CON_OS_WINXP Then If Ascan(m.laDeclaredDlls, [SetWindowTheme], 1, m.lnLen , 2, 15) = 0 Declare Integer SetWindowTheme In UxTheme ; integer HWnd,; string pszSubAppName,; string pszSubIdList Endif Endif *#beautify keyword_nochange *!* 2006-06-27 Added first declare with no alias, changed alias from ShowWindowAPI to _ShowWindow If Ascan(m.laDeclaredDlls, [ShowWindow], 1, m.lnLen , 2, 15) = 0 Declare Integer ShowWindow In win32api As ShowWindow ; Integer HWnd,; Integer nCmdShow Endif If Ascan(m.laDeclaredDlls, [_ShowWindow], 1, m.lnLen , 2, 15) = 0 Declare Integer ShowWindow In win32api As _ShowWindow ; Integer HWnd,; Integer nCmdShow Endif *#beautify *!* 2006-06-27 Not used, commented *!* If Ascan(m.laDeclaredDlls, [SystemParametersInfo], 1, m.lnLen , 2, 15) = 0 *!* Declare Integer SystemParametersInfo In win32api ; *!* INTEGER uAction,; *!* INTEGER uParam,; *!* STRING @lpvParam,; *!* INTEGER fuWinIni *!* Endif ENDPROC HIDDEN PROCEDURE ctl32_destroy With This .tmrUpdater.Enabled = FALSE *!* Destroy StatusBar window If .ctl32_ControlHwnd > 0 Then DestroyWindow(.ctl32_ControlHwnd) Endif *!* Destroy StatusBar proxy window If .ctl32_ProxyHWnd > 0 Then DestroyWindow(.ctl32_ProxyHWnd) Endif .ctl32_ProxyHWnd = 0 .ctl32_ControlHwnd = 0 Endwith ENDPROC PROTECTED PROCEDURE ctl32_formactivate && Binded to Form.Activate, for top level forms, it creates statusbar after form is visible *!* This only gets called via a BindeEvent to parent TLF activate event *!* so the StatusBar is created after the form is visible Unbindevent(Thisform, [Activate], This, [ctl32_FormActivate]) This.ctl32_Create() ENDPROC PROCEDURE ctl32_formdestroy *!* BindEvent(ThisForm, [Destroy], This, [ctl32_FormDestroy], 0) If Pemstatus(Thisform, [StatusBar_ToolBar], CON_PEMSTAT_DEFINED) Then Thisform.StatusBar_ToolBar = Null Removeproperty(Thisform, [StatusBar_ToolBar]) Endif ENDPROC HIDDEN PROCEDURE ctl32_getborder && Returns the width of the especified border: 1 = Horizontal, 2 = Vertical, 3 = Separator *!* 2006-06-27 Changed to use ctl32_Rect.StrToInt *!* Returns width in pixels of borders of a statusbar control *!* 1 = Horizontal *!* 2 = Vertical *!* 3 = Separator Lparameters tnWhichBorder Local lcBorders As Character, ; lnBorder As Number m.lcBorders = Replicate(Chr(0), 12) With This SendMessageC(.ctl32_ControlHwnd, SB_GETBORDERS, 0, @ m.lcBorders) Do Case Case tnWhichBorder = 1 m.lnBorder = CToBin(Substr(m.lcBorders, 1, 4), [4RS]) && horizontal Case tnWhichBorder = 2 m.lnBorder = CToBin(Substr(m.lcBorders, 5, 4), [4RS]) && vertical Otherwise m.lnBorder = CToBin(Substr(m.lcBorders, 9, 4), [4RS]) && separator Endcase Endwith Return m.lnBorder ENDPROC PROCEDURE ctl32_getdate *!* Returns curent date formated string *!* 1 Short Date *!* 2 Long Date *!* Other: empty string Lparameters tnDateFormat Local lpDateString As Character, ; lnLenDateString As Number, ; lnCharsRet As Number m.lpDateString = [] If Between(m.tnDateFormat, 1, 2) Then m.lpDateString = Space(255) && Address of buffer information. m.lnLenDateString = Len(m.lpDateString) && Size of buffer, LpLCData. m.lnCharsRet = GetDateFormat(0x400, m.tnDateFormat , 0, 0, @m.lpDateString, m.lnLenDateString) m.lpDateString = Left(m.lpDateString, m.lnCharsRet - 1) Endif Return m.lpDateString ENDPROC HIDDEN PROCEDURE ctl32_resize && Bound to Form.Resize *!* If ctl32_FormType <> CON_FORMTYPE_DEFAULT, we have a proxy window that contains the statusbar window *!* This is done so the statusbar width equals the Host Width, and *!* to show/hide the sizing grip of the statusbar, otherwise it does not display correctly *!* What we do is set this proxy Window to Maximized or Normal state so statusbar hides/shows sizing grip *!* by itself, depending on its parent proxy window WindowState If This.ctl32_ControlHwnd = 0 Or This.ctl32_Creating = TRUE Then Return Endif *!* Check if a Theme change event destroyed our statusbar, if so, recreate If IsWindow(This.ctl32_ControlHwnd) = 0 And This.ctl32_FormType = CON_FORMTYPE_SCREEN Then This.ctl32_Create() Return Endif *!* Check if window is still valid (it gets destroyed by OS Theme change, which triggers resize it seems) If IsWindow(This.ctl32_ControlHwnd) = 0 Return Endif Local ; lcRect As Character, ; lnyCoord As Number With This *!* If container form is _Screen or TLF, deal with proxy window If .ctl32_FormType <> CON_FORMTYPE_DEFAULT *!* IF WindowState has changed, set proxy window: If .ctl32_OldWindowState <> Thisform.WindowState _ShowWindow(.ctl32_ProxyHWnd, SW_HIDE) If Thisform.WindowState = WINDOWSTATE_MAXIMIZED _ShowWindow(.ctl32_ProxyHWnd, SW_MAXIMIZE) Else _ShowWindow(.ctl32_ProxyHWnd, SW_RESTORE) Endif .ctl32_OldWindowState = Thisform.WindowState _ShowWindow(.ctl32_ProxyHWnd, SW_SHOWNA) Endif *!* Now we have to find Height of bottom window holding Statusbar proxy and maybe other *!* toolbars, so we can position the proxy window at the bottom *!* Also we resize proxy window to width of container form *!* Find Height of client rectangle of Host window: *!* 2006-06-27 Using ctl32_Rect now m.lcRect = This.ctl32_Rect._Struct GetClientRect(.ctl32_HostHWnd, @m.lcRect) This.ctl32_Rect._Struct = m.lcRect m.lnyCoord = This.ctl32_Rect._Height - .ctl32_Height *!* Resize/move statusbar proxy window SetWindowPos(.ctl32_ProxyHWnd, ; 0, ; 0, ; m.lnyCoord, ; .ctl32_Width, ; .ctl32_Height, ; 0) Endif *!* Send resize message to ctl32_StatusBar SendMessageN(.ctl32_ControlHwnd, WM_SIZE, 0, 0) *!* Now resize panels .ctl32_ResizePanels() Endwith ENDPROC PROCEDURE ctl32_resizepanels && Recalculates panel widths based on content *!* Bindevent(This.ProgressBar, [Visible], This, [ctl32_ResizePanels], 1) *!* Bindevent(This.ProgressBar, [Width], This, [ctl32_ResizePanels], 1) *!* Also called from ctl32_Create, ctl32_Resize *!* Panel 0 is the Message Panel *!* Panel 1 is the ProgressBar Panel *!* Panel n to .ctlPanelCount is Custom Panel n to .ctlPanelCount *!* Panel .ctlPanelCount + 3 is PanelOvr *!* Panel .ctlPanelCount + 4 is PanelNum *!* Panel .ctlPanelCount + 5 is PanelCaps *!* Panel .ctlPanelCount + 6 is PanelDate *!* Panel .ctlPanelCount + 7 is Last Panel for sizing grip *!* Panels array of StatusBar is 0 based *!* we have 1 based arrays in VFP If This.ctl32_ControlHwnd = 0 Then Return Endif Local ; lnx As Number, ; lnLeft As Number, ; lnTop As Number, ; lnMargin As Number, ; lnPBMargin As Number, ; lnLastMargin As Number, ; lcRights As Character, ; lnLastRight As Number, ; lnTotalWidths As Number, ; lcRect As Character, ; lnLeft As Number With This *!* Calculate margin for caption and icons in panels: If This.ctlTheme() Then m.lnMargin = Int(.ctl32_getborder(CON_SBBORDER_SEPARATOR) * 3) m.lnPBMargin = Int(.ctl32_getborder(CON_SBBORDER_SEPARATOR) * 4) Else m.lnMargin = Int(.ctl32_getborder(CON_SBBORDER_SEPARATOR) * 2.2) m.lnPBMargin = Int(.ctl32_getborder(CON_SBBORDER_SEPARATOR) * 2) - 1 Endif If .PanelDate.Visible = FALSE Or .PanelDate.Format = 0 m.lnLastMargin = Sysmetric(SYSMETRIC_VSCROLLBARWIDTH) + .ctl32_getborder(CON_SBBORDER_SEPARATOR) * 2 + 1 Else m.lnLastMargin = Sysmetric(SYSMETRIC_VSCROLLBARWIDTH) Endif If Thisform.WindowState = WINDOWSTATE_MAXIMIZED Or Thisform.BorderStyle <> CON_BS_SIZABLE Then m.lnLastMargin = 0 Endif *!* Calculate Widths of panels from right to left, first panel gets what's left of total width *!* .ctlPanelCount is the number of custom Panels, ctl32_PanelCount is the number of stock Panels (7) .ctl32_Panels(.ctlPanelCount + .ctl32_PanelCount).ctl32_Width = m.lnLastMargin For m.lnx = .ctlPanelCount + .ctl32_PanelCount - 1 To 3 Step -1 With .ctl32_Panels(m.lnx) If .Visible Then If .AutoSize Then Do Case Case (Empty(.ctlIcon) And Empty(.ctlCaption)) .ctl32_Width = 0 Case Not Empty(.ctlIcon) And Empty(.ctlCaption) .ctl32_Width = 16 + Int(m.lnMargin * 1.5) Case Empty(.ctlIcon) And Not Empty(.ctlCaption) .ctl32_Width = This.GetStringSize(.ctlCaption, [W]) + Int(m.lnMargin * 1.5) Case Not Empty(.ctlIcon) And Not Empty(.ctlCaption) .ctl32_Width = 18 + m.lnMargin + This.GetStringSize(.ctlCaption, [W]) + m.lnMargin Endcase Else .ctl32_Width = .Width Endif Else .ctl32_Width = 0 Endif Endwith Endfor *!* Calculate Width of ProgressBar Panel: If .ctl32_Panels(2).AutoSize = FALSE Or .ProgressBar.ctlVisible = TRUE Then If This.ctlTheme() .ctl32_Panels(2).ctl32_Width = .ProgressBar.Width + m.lnPBMargin Else .ctl32_Panels(2).ctl32_Width = .ProgressBar.Width + m.lnPBMargin + 1 Endif Else .ctl32_Panels(2).ctl32_Width = 0 Endif *!* Now we are going to calculate the x axis value of the right border of each Panel: *!* For now we assign StatusBar Width to Right property of last panel .ctl32_Panels(.ctlPanelCount + .ctl32_PanelCount).ctl32_Right = .ctl32_Width For m.lnx = .ctlPanelCount + .ctl32_PanelCount - 1 To 1 Step -1 .ctl32_Panels(m.lnx).ctl32_Right = Max(.ctl32_Panels(m.lnx + 1).ctl32_Right - .ctl32_Panels(m.lnx + 1).ctl32_Width, 0) Endfor *!* Now assign -1 to Right property of last panel so it stretches *!* Send 0xFFFFFF instead of -1 or PanelDate is blank .ctl32_Panels(.ctlPanelCount + .ctl32_PanelCount).ctl32_Right = 0xFFFFFF *!* Do Same Thing to PanelDate so right border does not show If .ctl32_Panels(.ctlPanelCount + .ctl32_PanelCount - 1).Visible = TRUE Then .ctl32_Panels(.ctlPanelCount + .ctl32_PanelCount - 1).ctl32_Right = 0xFFFFFF Endif *!* Now we check if all Panels have a zero Width, then we hide all separators: m.lnTotalWidths = 0 For m.lnx = 1 To .ctlPanelCount + .ctl32_PanelCount m.lnTotalWidths = m.lnTotalWidths + .ctl32_Panels(m.lnx).ctl32_Width Endfor If m.lnTotalWidths <= m.lnLastMargin Then .SetAll([ctl32_Right], 0xFFFFFF, [ctl32_StatusBar_Panel]) Endif *!* Now we build a string of the calculated x axis right borders: m.lcRights = [] For m.lnx = 1 To .ctlPanelCount + .ctl32_PanelCount m.lcRights = m.lcRights + BinToC(.ctl32_Panels(m.lnx).ctl32_Right, [4RS]) Endfor *!* We finally send the info to the StatusBar: SendMessageC(.ctl32_ControlHwnd, SB_SETPARTS, .ctlPanelCount + .ctl32_PanelCount, @ m.lcRights) If .ProgressBar.ctlVisible Then *!* Set ProgressBar Left, retrieve rectangle of second panel (index 1) (0 based array in StatusBar) m.lcRect = This.ctl32_Rect._Struct SendMessageC(.ctl32_ControlHwnd, SB_GETRECT, 1, @ m.lcRect) This.ctl32_Rect._Struct = m.lcRect m.lnLeft = This.ctl32_Rect._Left .ProgressBar.Left = m.lnLeft + .ctl32_getborder(CON_SBBORDER_SEPARATOR) / 2 Endif Endwith ENDPROC HIDDEN PROCEDURE ctl32_setlocalestrings && Sets Locale strings for PanelCaps, PanelOvr, PanelNum *!* http://www.loc.gov/standards/iso639-2/langcodes.html *!* This sets the indicator panels captions according to Windows user set locale Local lcLocale As Character, ; lnCharsRet As Number, ; lcIndicators As Character m.lcLocale = Space(254) m.lnCharsRet = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, @m.lcLocale, Len(m.lcLocale)) m.lcLocale = Left(m.lcLocale, m.lnCharsRet -1) Do Case Case m.lcLocale == [cs] && Czech // Vratislav Belský // m.lcIndicators = [PRE|NUM|CAPS] Case m.lcLocale == [de] && GERMAN m.lcIndicators = [OVR|NUM|CAPS] Case m.lcLocale == [en] && English m.lcIndicators = [OVR|NUM|CAPS] Case m.lcLocale == [es] && Spanish m.lcIndicators = [SOB|NUM|MAY] Case m.lcLocale == [fr] && FRENCH m.lcIndicators = [OVR|NUM|CAPS] Case m.lcLocale == [it] && Italian // Emanuele Cerlini // m.lcIndicators = [SSC|NUM|MAI] Case m.lcLocale == [ru] && RUSSIAN m.lcIndicators = [OVR|NUM|CAPS] Otherwise m.lcIndicators = [OVR|NUM|CAPS] && OTHER Endcase With This .PanelOvr.ctlCaption = Getwordnum(m.lcIndicators, 1, [|]) .PanelNum.ctlCaption = Getwordnum(m.lcIndicators, 2, [|]) .PanelCaps.ctlCaption = Getwordnum(m.lcIndicators, 3, [|]) Endwith ENDPROC HIDDEN PROCEDURE ctl32_settheme *!* If statusbar whas not preserved by a docked toolbar during a _Screen.Themes change, just return If IsWindow(This.ctl32_ControlHwnd) = 0 And This.ctl32_FormType = CON_FORMTYPE_SCREEN Then Return Endif With This If This.ctlOS() >= CON_OS_WINXP && at least XP If This.ctlTheme() = TRUE Then SetWindowTheme(.ctl32_ControlHwnd, Null, Null) Else SetWindowTheme(.ctl32_ControlHwnd, Null, []) Endif SendMessageN(.ctl32_ControlHwnd, WM_SYSCOLORCHANGE , 0, 0) Endif .ProgressBar.ctlThemes = This.ctlThemes .ctl32_AdjustProgressBar() .ctl32_ResizePanels() Endwith ENDPROC HIDDEN PROCEDURE ctl32_unbindevents If This.ctl32_ControlHwnd = 0 Or This.ctl32_Creating = TRUE Then Return Endif *!* Unbindevent(Thisform, [Resize], This, [ctl32_Resize]) *!* If This.ctl32_FormType = CON_FORMTYPE_SCREEN Then *!* Unbindevent(_Screen.HWnd, WM_THEMECHANGED) *!* Endif *!* Unbindevent(This.ProgressBar, [Visible], This, [ctl32_ResizePanels]) *!* Unbindevent(This.ProgressBar, [Width], This, [ctl32_ResizePanels]) ENDPROC HIDDEN PROCEDURE ctl32_width_access *!* RETURN desired Width for StatusBar proxy Window *!* Width from _Screen is no good, space taken by toolbars on both *!* sides is subtracted from total Width, so we use _vfp HWnd *!* Modified 20060513 Local lnHWnd As Number, ; lnWidth As Number, ; lcRect As Character With This If .ctl32_FormType = CON_FORMTYPE_SCREEN m.lnHWnd = _vfp.HWnd Else m.lnHWnd = Thisform.HWnd Endif m.lcRect = This.ctl32_Rect._Struct GetClientRect(m.lnHWnd, @m.lcRect) This.ctl32_Rect._Struct = m.lcRect m.lnWidth = This.ctl32_Rect._Width Endwith *!* Width is off by one pixel m.lnWidth = m.lnWidth + 1 Return m.lnWidth ENDPROC HIDDEN PROCEDURE ctl32_wm_notify && Handles mouse clicks in statusbar window *!* 2006-06-27 Now it uses _nmmouse class to handle structure *!* Bindevent(.ctl32_ProxyHWnd, WM_NOTIFY, This, [ctl32_WM_Notify], 1) *!* Handles mouse clicks in statubar window *!* msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/status/status.asp *!* The WM_NOTIFY lParam parameter is a pointer to a nmmouse Structure Lparameters tnHWnd As Integer, tnMsg As Integer, tnwParam As Integer, tnLparam As Integer Local ; lnResult As Number, ; lnCode As Number, ; lndwItemSpec As Number, ; lnPointX As Number, ; lnPointY As Number If m.tnMsg = WM_NOTIFY And m.tnwParam = 0 Then With This *!* Read string of data Local loNmmouse As _nmmouse Of ctl32_structs.vcx m.loNmmouse = Newobject([_nmmouse], [ctl32_structs.vcx]) m.loNmmouse._Struct = Sys(2600, m.tnLparam, m.loNmmouse._StructLen) *!* This determines button pressed and click/double click m.lnCode = m.loNmmouse._code *!* This determines panel clicked m.lndwItemSpec = m.loNmmouse._dwItemSpec *!* This are mouse click coordinates .nXCoord = m.loNmmouse._X .nYCoord = m.loNmmouse._Y *!* Determine Panel clicked *!* PanelMessage will be -1, progressbar panel 0, first custom panel 1.... *!* right panels will be 101, 102, 103, 104 *!* no panel clicked is -2 *!* m.lndwItemSpec = m.lndwItemSpec Do Case Case Between(m.lndwItemSpec, 0 , .ctlPanelCount + 1) .nPanel = m.lndwItemSpec - 1 && Panel Clicked Case m.lndwItemSpec > .ctlPanelCount .nPanel = m.lndwItemSpec + 99 - .ctlPanelCount Otherwise .nPanel = m.lndwItemSpec Endcase Endwith *!* Determine mouse button pressed and check for double clicks *!* suppress second click event after double click Do Case Case m.lnCode = -2 And This.ctl32_DblClick = 1 && Left Click This.ctl32_DblClick = 0 Case m.lnCode = -5 And This.ctl32_DblClick = 1 && Right Click This.ctl32_DblClick = 0 Case m.lnCode = -2 And This.ctl32_DblClick = 0 && Left Click This.nButton = 1 Raiseevent(This, [ctlClick]) Case m.lnCode = -5 And This.ctl32_DblClick = 0 && Right Click This.nButton = 2 Raiseevent(This, [ctlRightClick]) Case m.lnCode = -3 && Double Left Click This.nButton = 1 This.ctl32_DblClick = 1 Raiseevent(This, [ctlDblClick]) Case m.lnCode = -6 && Double Right Click This.nButton = 2 This.ctl32_DblClick = 1 Raiseevent(This, [ctlDblClick]) Endcase Endif m.loNmmouse = Null *!* 2006-06-27 Now the old window procedure is saved in the Init of the class m.lnResult = CallWindowProc(This.ctl32_OldProc, m.tnHWnd, m.tnMsg, m.tnwParam, m.tnLparam) Return m.lnResult ENDPROC PROCEDURE ctlcaption_access Return This.PanelMessage.ctlCaption ENDPROC PROCEDURE ctlcaption_assign Lparameters vNewVal This.PanelMessage.ctlCaption = m.vNewVal ENDPROC PROCEDURE ctlclick ENDPROC PROCEDURE ctldblclick ENDPROC HIDDEN PROCEDURE ctlhwnd_access Return This.ctl32_ControlHwnd ENDPROC HIDDEN PROCEDURE ctlicon_assign *!* 2006-06-27 Added check for parameter type Lparameters vNewVal If Type("m.vNewVal") <> T_CHARACTER Then m.vNewVal = [] Endif With This .ctlIcon = m.vNewVal .PanelMessage.ctlIcon = m.vNewVal Endwith ENDPROC PROCEDURE ctlmessage_access Return This.PanelMessage.ctlCaption ENDPROC HIDDEN PROCEDURE ctlmessage_assign Lparameters vNewVal This.PanelMessage.ctlCaption = m.vNewVal ENDPROC PROCEDURE ctlos *!* Returns a numeric value representing the operating system version *!* Check ctl32.h for possible values *!* ie CON_OS_WINXPSP2 = 5010200 Return Val(Os(3)) * 1000000 + Val(Os(4)) * 10000 + Val(Os(8)) * 100 + Val(Os(9)) ENDPROC PROCEDURE ctlrightclick ENDPROC PROCEDURE ctltheme Return ; This.ctlOS() >= CON_OS_WINXP ; And IsThemeActive() = 1 ; And _Screen.Themes ; And Thisform.Themes ; And This.ctlThemes ENDPROC PROCEDURE ctlthemes_assign Lparameters vNewVal If Type("m.vNewVal") = T_NUMERIC Then If m.vNewVal = 0 Then m.vNewVal = FALSE Else m.vNewVal = TRUE Endif Endif If Type("m.vNewVal") <> T_LOGICAL Return Endif This.ctlThemes = m.vNewVal This.ctl32_SetTheme() ENDPROC PROCEDURE Destroy *!* 2006-06-27 Swaped order of this method calls This.ctl32_unbindevents() This.ctl32_destroy() Local lnx As Number *!* Aux toolbar in _Screen, clear object reference, remove property If Pemstatus(_Screen, [StatusBar_ToolBar], CON_PEMSTAT_DEFINED) Then _Screen.StatusBar_ToolBar = Null Removeproperty(_Screen, [StatusBar_ToolBar]) Endif *!* Clear objects references - see ctl32_AddPanels With This For m.lnx = 1 To .ctlPanelCount .ctlPanels(m.lnx) = Null Endfor For m.lnx = 1 To .ctlPanelCount + .ctl32_PanelCount .ctl32_Panels(m.lnx) = Null Endfor *!* Changed api alias from ShowWindowApi to _ShowWindow *!* Display native vfp statusbar If .ctl32_FormType = CON_FORMTYPE_SCREEN _ShowWindow(.ctl32_vfpStatusBarHWnd, SW_SHOWNA) Endif Endwith ENDPROC PROCEDURE eventhandler_form_resize This.ctl32_resize() ENDPROC PROCEDURE eventhandler_form_themes This.ctl32_SetTheme() ENDPROC PROCEDURE eventhandler_form_visible This.ctl32_resize() ENDPROC PROCEDURE eventhandler_screen_themes This.ctl32_SetTheme() ENDPROC HIDDEN PROCEDURE eventhandler_screen_wm_size *!* BindEvent(.ctl32_HostHWnd, WM_SIZE, This, [ctl32_WM_Size], 1) Lparameters tnHWnd As Integer, tnMsg As Integer, tnwParam As Integer, tnLparam As Integer Local lnResult As Number With This If m.tnMsg = WM_SIZE Then If .ctl32_FormType = CON_FORMTYPE_SCREEN Then .ctl32_resize() Endif Endif *!* 2006-06-27 Now the old window procedure is saved in the Init of the class *!* Just do what Calvin does, whatever it means m.lnResult = CallWindowProc(.ctl32_OldProc, m.tnHWnd, m.tnMsg, m.tnwParam, m.tnLparam) Endwith Return m.lnResult ENDPROC HIDDEN PROCEDURE eventhandler_vfp_wm_themechanged *!* BINDEVENT(_VFP.HWnd, WM_THEMECHANGED, This, [ctl32_WM_ThemeChanged], 1) Lparameters tnHWnd As Integer, tnMsg As Integer, tnwParam As Integer, tnLparam As Integer Local lnResult As Number With This If m.tnMsg = WM_THEMECHANGED Then .ctl32_SetTheme() Endif *!* Just do what Calvin does, whatever it means m.lnResult = CallWindowProc(.ctl32_OldProc, m.tnHWnd, m.tnMsg, m.tnwParam, m.tnLparam) Endwith Return m.lnResult ENDPROC PROCEDURE getstringsize *!* 2006-06-27 Now it uses StrToInt of _rect class *!* GetStringSize *!* msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8smq.asp *!* www.news2news.com/vfp/?function=687 *!* vbnet.mvps.org/index.html?code/listapi/listrightalign.htm *!* typedef struct tagSIZE { *!* LONG cx; *!* LONG cy; *!* } SIZE, *PSIZE; *!* Returns Width or Height of a string with font = font of the StatusBar *!* tcReturnWidthOrHeight can be 'W' or 'H' or no parameter, defaults to 'W' Lparameters tcString As Character, tcReturnWidthOrHeight As Character If Pcount() = 1 Then m.tcReturnWidthOrHeight = [W] Endif Local lnSize As Number, ; lcSize As Character, ; lnhFont As Number, ; lnhFontOld As Number m.lcSize = Space(8) With This m.lnHDC = GetDC(.ctlHWnd) m.lnhFont = SendMessageN(.ctlHWnd, WM_GETFONT, 0, 0) m.lnhFontOld = SelectObject(m.lnHDC, m.lnhFont) GetTextExtentPoint32(m.lnHDC, m.tcString, Len(m.tcString), @ m.lcSize) If m.tcReturnWidthOrHeight <> [W] Then m.lnSize = CToBin(Substr(m.lcSize, 5, 4), [4RS]) Else m.lnSize = CToBin(Substr(m.lcSize, 1, 4), [4RS]) Endif Endwith SelectObject(m.lnHDC, m.lnhFontOld) ReleaseDC(This.ctlHWnd, m.lnHDC) Return m.lnSize ENDPROC PROCEDURE Init *!* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/status/status.asp *!* ctl32_StatusBar *!* Created by Carlos Alloatti - calloatti@gmail.com Lparameters tnPanelCount *!* Check if a numeric parameter was received, that should be PanelCount If Pcount() > 0 And Vartype(m.tnPanelCount) = [N] Then This.ctlPanelCount = m.tnPanelCount Endif *!* 2006-06-27 Added Version(2) checking If Type([ThisForm]) <> T_OBJECT And Version(CON_VER_TYPE) <> CON_VER_TYPE_RUNTIME Then Messagebox([USAGE: _Screen.Newobject("oStatusBar", "ctl32_statusbar", "ctl32_statusbar.vcx, null, nPanelCount")], 16) Return Endif If This.Parent.BaseClass <> [Form] And Version(CON_VER_TYPE) <> CON_VER_TYPE_RUNTIME Then Messagebox([Container has to be a Form Object], 16) Return Endif With This *!* Set up some properties .Visible = FALSE *!* Comented on 2006-05-07 // Giancarlo Piccinato // *!* .Anchor = 0 .Top = -100 .Left = 0 .Width = Thisform.Width .Height = 24 *!* Initialize date .ctl32_OldDate = Dtos(Date(1900, 1, 1)) .Newobject([ctl32_balloontip1],[ctl32_balloontip], [ctl32_balloontip.vcx], Null) *!* Add progressbar object, pass -1 as parameter to prevent init code from progressbar to run .Newobject([ProgressBar],[ctl32_progressbar], [ctl32_progressbar.vcx], Null, -1) .ProgressBar.Width = 93 .ProgressBar.ctlMaximum = 100 .ProgressBar.Height = 17 .ProgressBar.ctlSizeAdjust = TRUE .ProgressBar.ctlStyle = 2 .ProgressBar.ctlSmooth = TRUE .ProgressBar.ctlBarcolor = -1 .ProgressBar.ctlFormat = [<>] .ProgressBar.ctlVisible = FALSE *!* 2006-06-27 Use _Rect object of ctl32_structs.vcx *!* Define Rect Object to be used by various methods .AddProperty([ctl32_Rect], FALSE) .ctl32_Rect = Newobject([_Rect], [ctl32_structs.vcx]) *!* Declare all dlls used by class: .ctl32_DeclareDlls() *!* 2006-06-27 Save old windows procedure, to be used by binded window messages *!* Save VFP window Procedure .ctl32_OldProc = GetWindowLong(_vfp.HWnd, GWL_WNDPROC) *!* Add Panel objects: .ctl32_addpanels() *!* Determine the type of container the StaturBar is in *!* CON_FORMTYPE_DEFAULT 0 *!* CON_FORMTYPE_TOPLEVEL 1 *!* CON_FORMTYPE_SCREEN 2 .ctl32_FormType = CON_FORMTYPE_DEFAULT *!* If container is a TLF, must have ShowWindow = 2 If .Parent.ShowWindow = CON_SHOWWIN_ASTOPLEVELFORM Then .ctl32_FormType = CON_FORMTYPE_TOPLEVEL Endif *!* If ThisForm.Name equals the _Screen.Name, then container is _Screen *!* _Screen can be hidden or not, not relevant to statusbar If .Parent.Name = _Screen.Name Then .ctl32_FormType = CON_FORMTYPE_SCREEN Endif *!* To create the StatusBar in a TLF, we should wait until the Form is visible or make it visible, *!* so we can add the bottom toolbar that will create a window placeholder for *!* the StatusBar. To do that, the TLF Activate event is binded to ctl32_FormActivate *!* In the first Form.Activate event, this delegate code will be called, it will call ctl32_Create *!* and then Unbind itself.This way, we do not disturb the order of form events when form loads If .ctl32_FormType = CON_FORMTYPE_TOPLEVEL Bindevent(Thisform, [Activate], This, [ctl32_FormActivate], 1) Else .ctl32_Create() Endif Endwith ENDPROC PROCEDURE newtooltip IF this.tag#"ROA - Financiar Contabilitate" With this.ctl32_balloontip1 .ctlVisible = .T. .ctlPositionStyle = 6 .ctlHideDelay = 5000 .ctlCapsLockStyle = 0 .ctlIcon = "roastart.ico" .ctlTitle = "Criteriile de filtrare" .ctlText = this.tag .ctlVisible = .T. Endwith ENDIF ENDPROC PROCEDURE showprogressbarcaption_assign Lparameters vNewVal This.ShowProgressBarCaption = m.vNewVal .ctl32_OldMessage = Sys(2015) This.ctlMessage = This.ctlMessage ENDPROC PROCEDURE lblname.Init Return FALSE ENDPROC PROCEDURE tmrUpdater.Timer DoEvents Local lcMessage, lcPadLeft, lcPadRight, lnx With This.Parent Do Case Case .PanelMessage.Alignment = 1 && Right m.lcPadLeft = Chr(9) + Chr(9) + Space(1) m.lcPadRight = Space(1) Case .PanelMessage.Alignment = 2 && Center m.lcPadLeft = Chr(9) m.lcPadRight = Space(0) Otherwise && Left m.lcPadLeft = Space(1) m.lcPadRight = Space(0) Endcase If .ShowProgressBarCaption = TRUE And .ProgressBar.ctlVisible = TRUE Then m.lcMessage = m.lcPadLeft + .ProgressBar.ctlCaption + m.lcPadRight SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelMessage.Index, m.lcMessage) Else *!* 2006-06-27 //Anton If Not(.ctl32_OldMessage == _vfp.StatusBar) And Empty(.PanelMessage.ctlCaption) Then .ctl32_OldMessage = _vfp.StatusBar m.lcMessage = m.lcPadLeft + _vfp.StatusBar + m.lcPadRight SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelMessage.Index, m.lcMessage) Endif If Insmode() <> .ctl32_OldOvr Then If Insmode() Then SendMessageC(.ctlHWnd, SB_SETTEXTA, .PanelOvr.Index, Space(20)) Else SendMessageC(.ctlHWnd, SB_SETTEXTA, .PanelOvr.Index, .PanelOvr.ctlCaption + Space(5)) Endif .ctl32_OldOvr = Insmode() Endif Endif If Numlock() <> .ctl32_OldNum Then If Numlock() Then SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelNum.Index, .PanelNum.ctlCaption + Space(5)) Else SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelNum.Index, Space(20)) Endif .ctl32_OldNum = Numlock() Endif If Capslock() <> .ctl32_OldCaps Then If Capslock() Then SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelCaps.Index, .PanelCaps.ctlCaption + Space(5)) *SendMessageC(.ctlHWnd,SB_SETTEXTA, Bitor(.PanelCaps.Index, SBT_OWNERDRAW), Space(4)) Else SendMessageC(.ctlHWnd,SB_SETTEXTA, .PanelCaps.Index, Space(20)) Endif .ctl32_OldCaps = Capslock() Endif If .ctl32_OldDate <> Dtos(Date()) And .PanelDate.Format <> 0 Then .ctl32_OldDate = Dtos(Date()) .PanelDate.ctlCaption = .ctl32_GetDate(.PanelDate.Format) .PanelDate.ctlToolTipText = .ctl32_GetDate(2) Endif Endwith ENDPROC ENDDEFINE DEFINE CLASS ctl32_statusbar_panel AS custom *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> #INCLUDE "ctl32.h" * *m: alignment_assign *m: autosize_assign *m: ctl32_updateall && Called when creating the statusbar to update all data of Panels *m: ctlcaption_assign *m: ctlicon_assign *m: ctlos *m: ctltooltiptext_assign *m: format_assign *m: visible_assign *p: alignment && Specifies the alignment of text associated with a control. *p: autosize && Specifies if a control is automatically resized to fit its contents. *p: ctl32_oicon *p: ctl32_right && Right x value position for Panel *p: ctl32_width *p: ctlcaption *p: ctlicon && Specifies the icon displayed for a Form at run time when the Form is minimized. *p: ctltooltiptext && Specifies the text that appears as a ToolTip for a control. *p: format && Specifies the input and output formatting of a control's Value property. *p: index *p: visible && Specifies if an object is visible or hidden. * * alignment = 0 autosize = .T. ctl32_oicon = ctl32_right = -1 ctl32_width = 0 ctlcaption = ctlicon = ctltooltiptext = format = 0 Height = 16 index = 0 Name = "ctl32_statusbar_panel" visible = .T. Width = 120 * PROCEDURE alignment_assign Lparameters vNewVal This.Alignment = m.vNewVal This.ctlCaption = This.ctlCaption If This.Index = 0 This.Parent.ctl32_OldMessage = Sys(2015) Endif ENDPROC PROCEDURE autosize_assign Lparameters vNewVal *!* Index 0 is first Panel, PanelMessage, that should always have Autosize = FALSE If This.Index = 0 Then This.AutoSize = FALSE Return Endif This.AutoSize = m.vNewVal *!* Reset caption to get rid of center/right codes if autosize is TRUE This.ctlCaption = This.ctlCaption ENDPROC PROCEDURE ctl32_updateall && Called when creating the statusbar to update all data of Panels With This .ctlCaption = .ctlCaption .Format = .Format .ctlIcon = .ctlIcon .ctlToolTipText = .ctlToolTipText .Visible = .Visible Endwith ENDPROC PROCEDURE ctlcaption_assign Lparameters vNewVal *!* 2006-06-27 Added Transform() This.ctlCaption = Transform(m.vNewVal) Local lcPadLeft, lcPadRight, lcCaption m.lcCaption = m.vNewVal With This *!* we add spaces so text does not fit and tooltips show Do Case Case .Alignment = 1 And .AutoSize = FALSE && Right m.lcPadLeft = Chr(9) + Chr(9) m.lcPadRight = Space(1) Case .Alignment = 2 And .AutoSize = FALSE && Center m.lcPadLeft = Chr(9) m.lcPadRight = Space(0) Otherwise && Left m.lcPadLeft = Space(0) m.lcPadRight = Space(64) *!* Add one space to left if this is PanelMessage and *!* Alignment is left, so it separates the text a little from border If .Index = 0 m.lcPadLeft = m.lcPadLeft + Space(1) Endif Endcase *!* If changing indicator panels Caption, let tmrUpdater update captions: If .Name = [PanelOvr] Then .Parent.ctl32_OldOvr = Not Insmode() Endif If .Name = [PanelNum] Then .Parent.ctl32_OldNum = Not Numlock() Endif If .Name = [PanelCaps] Then .Parent.ctl32_OldCaps = Not Capslock() Endif m.lcCaption = m.lcPadLeft + m.lcCaption + m.lcPadRight + Chr(0) *!* Do not set Panel Caption for ProgressBar: If .Index <> 1 Then SendMessageC(.Parent.ctlHWnd, SB_SETTEXTA, .Index , m.lcCaption) Endif *!* If setting Caption for Message Panel If .Index = 0 .Parent.ctl32_OldMessage = Sys(2015) Endif If .Index <> 0 And .Parent.ctl32_Creating = FALSE Then .Parent.Ctl32_ResizePanels() Endif Endwith ENDPROC PROCEDURE ctlicon_assign Lparameters vNewVal This.ctlIcon = m.vNewVal With This *!* 2006-07-17 Now takes icon handle too //Anton Do Case Case Vartype(m.vNewVal) = "N" .ctl32_oIcon = Null SendMessageN(.Parent.ctlHWnd, SB_SETICON, .Index, m.vNewVal) Case File(.ctlIcon) .ctl32_oIcon = LoadPicture(.ctlIcon) SendMessageN(.Parent.ctlHWnd, SB_SETICON, .Index, .ctl32_oIcon.handle) Otherwise .ctl32_oIcon = Null SendMessageN(.Parent.ctlHWnd, SB_SETICON, .Index, 0) Endcase If .Index <> 0 And .Parent.ctl32_Creating = FALSE Then .Parent.Ctl32_ResizePanels() Endif Endwith ENDPROC PROCEDURE ctlos *!* Returns a numeric value representing the operating system version *!* Check ctl32.h for possible values *!* ie CON_OS_WINXPSP2 = 5010200 Return Val(Os(3)) * 1000000 + Val(Os(4)) * 10000 + Val(Os(8)) * 100 + Val(Os(9)) ENDPROC PROCEDURE ctltooltiptext_assign Lparameters vNewVal This.ctlToolTipText = m.vNewVal If Len(m.vNewVal) > 0 Then m.vNewVal = Space(1) + This.ctlToolTipText + Space(1) Endif SendMessageC(This.Parent.ctlHWnd,SB_SETTIPTEXTA, This.Index, m.vNewVal) ENDPROC PROCEDURE format_assign *!* Property only valid for PanelDate Lparameters vNewVal This.Format = m.vNewVal If This.Name = [PanelDate] Then This.ctlCaption = This.Parent.ctl32_GetDate(This.Format) Endif ENDPROC PROCEDURE visible_assign Lparameters vNewVal If Type([m.vNewVal]) = [N] Then If m.vNewVal = 0 Then m.vNewVal = FALSE Else m.vNewVal = TRUE Endif Endif If Type([m.vNewVal]) <> [L] Then Messagebox([Parameter must be Logical: ] + Program(), 16) Return Endif This.Visible = m.vNewVal If This.Parent.ctl32_Creating = FALSE Then This.Parent.Ctl32_ResizePanels() Endif ENDPROC ENDDEFINE DEFINE CLASS ctl32_statusbar_toolbar AS toolbar *< CLASSDATA: Baseclass="toolbar" Timestamp="" Scale="Pixels" Uniqueid="" /> *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder *< OBJECTDATA: ObjPath="ctlHeightShape" UniqueID="" Timestamp="" /> #INCLUDE "ctl32.h" * *m: ctl32_registerfunctions *m: ctlos * * Caption = "ctl32_statusbar_toolbar" Height = 19 Left = 0 Name = "ctl32_statusbar_toolbar" ShowWindow = 1 Top = 51 Visible = .F. Width = 32010 * ADD OBJECT 'ctlHeightShape' AS shape WITH ; Height = 13, ; Left = 5, ; Name = "ctlHeightShape", ; Top = 3, ; Width = 32000 *< END OBJECT: BaseClass="shape" /> PROCEDURE ctl32_registerfunctions *!* http://blogs.msdn.com/calvin_hsia/archive/2006/04/24/582479.aspx *!* http://blogs.msdn.com/calvin_hsia/archive/2006/04/27/585305.aspx *!* win32api: kernel32.dll, gdi32.dll, user32.dll, mpr.dll, advapi32.dll *!* 2006-06-27 Found a bug in VFP: if you declare an API function with an alias and *!* later declare the same API function without an alias, the first aliased declare *!* dissapears local array laDeclaredDlls(1,3) local lnLen as number m.lnLen = adlls(m.laDeclaredDlls) *#beautify keyword_nochange *!* 2006-06-27 Added first declare with no alias, changed alias from ShowWindowAPI to _ShowWindow If Ascan(m.laDeclaredDlls, [ShowWindow], 1, m.lnLen , 2, 15) = 0 Declare Integer ShowWindow In win32api As ShowWindow ; Integer HWnd,; Integer nCmdShow Endif If Ascan(m.laDeclaredDlls, [_ShowWindow], 1, m.lnLen , 2, 15) = 0 Declare Integer ShowWindow In win32api As _ShowWindow ; Integer HWnd,; Integer nCmdShow Endif *#beautify ENDPROC PROCEDURE ctlos *!* Returns a numeric value representing the operating system version *!* Check ctl32.h for possible values *!* ie CON_OS_WINXPSP2 = 5010200 Return Val(Os(3)) * 1000000 + Val(Os(4)) * 10000 + Val(Os(8)) * 100 + Val(Os(9)) ENDPROC PROCEDURE Init This.ctl32_RegisterFunctions() *!* Hide the toolbar trhu API so its still there but invisible With This .Dock(TOOL_BOTTOM, 0, 0) .Visible = TRUE _ShowWindow(.HWnd, SW_HIDE) Endwith ENDPROC PROCEDURE ctlHeightShape.Click This.Parent.Dock(3, 0, 0) ENDPROC PROCEDURE ctlHeightShape.Init If This.Parent.ctlOS() >= CON_OS_WINVISTA && Vista This.Height = 13 Else This.Height = 17 Endif ENDPROC ENDDEFINE