Jistě víte, že existuje objekt _Screen (hlavní okno aplikace). Jak by se vám líbila možnost doprogramovat tento objekt tak, abyste mohli reagovat třeba na změnu hlavního okna nebo na klinutí pravým tlačítkem myši na prázdnou plochu hlavního okna? Že to nejde?
Jde, ale ne úplně jednoduše. Tedy, není to zas tak složité, jenom to člověk nečeká. Celý nasledující program funguje i ve VFP 5.0 a 6.0,z verze 7.0 použijeme pouze možnost obrázků v menu.
Nejprve si definujeme menu, které budeme volat při kliknutí prvým tlačítkem myši.
DEFINE POPUP scrRightClick SHORTCUT MARGIN IN SCREEN *!* Klauzule PICTRES je pouze v VFP 7.0 DEFINE BAR 1 OF scrRightClick PROMPT "Ahoj" PICTRES _mfi_open DEFINE BAR 2 OF scrRightClick PROMPT "Nazdar" PICTRES _mfi_save ON SELECTION BAR 1 OF scrRightClick WAIT WIND PROMPT() ON SELECTION BAR 2 OF scrRightClick WAIT WIND PROMPT()
DEFINE CLASS ScreenHook AS CUSTOM oScr=_Screen oScrWidth= _Screen.Width oScrHeight= _Screen.Height PROCEDURE Init DECLARE INTEGER LockWindowUpdate IN WIN32API INTEGER nHandle1 DECLARE INTEGER GetDesktopWindow IN WIN32API ENDPROC PROCEDURE Destroy This.oScr=.NULL. ENDPROC PROCEDURE oScr.Resize LOCAL lnKoefW,lnKoefH,lii * THIS je zde _Screen !! * Předpokládáme, že je přidán jako oSH !!! - viz dále ukázka použití lnKoefW=This.Width/This.oSH.oScrWidth lnKoefH=This.Height/This.oSH.oScrHeight =LockWindowUpdate(GetDesktopWindow())&& Zamkne celý desktop FOR lii=1 TO This.FormCount WITH This.Forms(lii) IF TYPE(".BaseClass")="C" AND ; NOT (.BaseClass="FORM" AND .WindowState#0)&& Normal .LockScreen=.T. .Left=.Left*lnKoefW .Top=.Top*lnKoefH IF .BaseClass<>"TOOLBAR" .Height=.Height*lnKoefH .Width=.Width*lnKoefW ENDIF .LockScreen=.F. ENDIF ENDWITH NEXT =LockWindowUpdate(0)&& Odemkne celý desktop This.oSH.oScrWidth=This.Width This.oSH.oScrHeight=This.Height ENDPROC PROCEDURE oScr.RightClick ACTIVATE POPUP ScrRightClick AT MROW(),MCOL() ENDPROC ENDDEFINE
_Screen.AddObject("oSH","ScreenHook")
Poznámka: Tento program funguje i ve VFP 5 i 6. VFP 7.0 má problém (lépe řečeno Exception code C0000005), pokud existuje toolbar nebo okno, které je dokováno. Společnost Microsoft o tomto problému ví a hodlá ho odstranit v chystaném Service Packu.
A to je vše. Mějte se krásně
Milan Kosina, kosina@vol.cz