Přidání metod k _Screen

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()

A teď to hlavní - definujeme si objekt, který bude rozšiřovat možnosti _Screen. Za povšimnutí stojí tyto důležité skutečnosti:

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

A teď tuto třídu použijeme:
_Screen.AddObject("oSH","ScreenHook")

To je vše. A můžete zkoušet, zda vše funguje - spusťte libovolné formuláře například pomocí DO FORM test a můžete měnit velikost hlavního okna VFP a klikat pravým tlačítkem myši na prázdnou pracovní plochu.

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