ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Mettre un objet Fox par dessus un ActiveX   



L'auteur

Christophe Chenavier
France France
Membre Simple
# 0000000023
enregistré le 14/10/2004
http://www.corwin.fr
58 ans
CHENAVIER Christophe
80440 BOVES
de la société Corwin
Fiche personnelle


Note des membres
pas de note

Contributions > 02 - SCX : Formulaires

Mettre un objet Fox par dessus un ActiveX
# 0000000254
ajouté le 04/11/2005 07:52:37 et modifié le 04/11/2005
consulté 8942 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0

Zoomer sur l'image

Télécharger le ZIP (4.90 Ko)
Description

Le problème avec les ActiveX, c'est qu'ils restent toujours au premier plan, empêchant de faire apparaître un objet Fox par dessus. La fonction LockObject présentée ici permet de désactiver l'ActiveX tout en le conservant à l'écran.
L'astuce utilisée ici, a été de faire une copie de la partie d'écran contenant l'ActiveX à désactiver, de cacher ce dernier (Visible à .F.) puis de recopier la capture d'écran à la place de l'ActiveX. Visuellement, on a l'impression que l'ActiveX est encore à l'écran !

Code source :
*!* Objet : Désactivation des ActiveX pour permettre d'afficher un objet Fox par dessus
*!* Auteur : C.Chenavier
*!* Version : 1.01 - 19/02/2005



#DEFINE SRCCOPY   0x00CC0020

#DEFINE GW_HWNDLAST         1
#DEFINE GW_CHILD            5

*---------------------------------------------------------------- LockObject

FUNCTION LockObject

LPARAMETERS oObjetOLE, lAutomaticUnlockOff

LOCAL nLibs, oForm, nWinHandle, nTop, nLeft, nWidth, nHeight
LOCAL hDC, hMemDC, hMemBmp
LOCAL ARRAY aLibs(1,3)

M.nLibs = ADLLS(aLibs)
IF M.nLibs = 0 OR ASCAN(aLibs,"GetWindowDC",1,0,1,7) = 0
   DECLARE INTEGER GetWindowDC IN user32 INTEGER hwnd
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"CreateCompatibleDC",1,0,1,7) = 0
   DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"CreateCompatibleBitmap",1,0,1,7) = 0
   DECLARE INTEGER CreateCompatibleBitmap IN gdi32 INTEGER hdc, INTEGER nWidth, INTEGER nHeight
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"SelectObject",1,0,1,7) = 0
   DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"BitBlt",1,0,1,7) = 0
   DECLARE INTEGER BitBlt IN gdi32 INTEGER hDestDC, INTEGER x, INTEGER y,;
           INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC,;
           INTEGER xSrc, INTEGER ySrc, INTEGER dwRop
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"DeleteObject",1,0,1,7) = 0
   DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"DeleteDC",1,0,1,7) = 0
   DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"ReleaseDC",1,0,1,7) = 0
   DECLARE INTEGER ReleaseDC IN user32 INTEGER hwndINTEGER hdc
ENDIF
IF M.nLibs = 0 OR ASCAN(aLibs,"GetWindow",1,0,1,7) = 0
   DECLARE INTEGER GetWindow IN User32 INTEGER hwndINTEGER wFlag
ENDIF

oForm = GetForm(oObjetOLE)
M.nWinHandle = oForm.Hwnd
M.nTop = OBJTOCLIENT(oObjetOLE, 1)
M.nLeft = OBJTOCLIENT(oObjetOLE, 2)
M.nWidth = oObjetOLE.Width + 1
M.nHeight = oObjetOLE.Height + 1

IF oForm.ShowWindow <> 2
   M.nTop = M.nTop + SYSMETRIC(9) + SYSMETRIC(13)    && Hauteur de la barre de titre + Hauteur de la frame
   M.nLeft = M.nLeft + SYSMETRIC(12)                 && Largeur de la frame
ELSE
   * La propriété hWnd de oForm ne contient pas le bon handle !
   M.nWinHandle = GetWindow(M.nWinHandle, GW_CHILD)
   M.nWinHandle = GetWindow(M.nWinHandle, GW_HWNDLAST)
ENDIF

M.hDC = GetWindowDC(M.nWinHandle)
M.hMemDC = CreateCompatibleDC(M.hDC)
M.hMemBmp = CreateCompatibleBitmap(M.hDC, M.nWidth, M.nHeight)
SelectObject(M.hMemDC , M.hMemBmp)
= BitBlt(M.hMemDC, 0, 0, M.nWidth, M.nHeight, ;
         M.hDC, M.nLeft, M.nTop, SRCCOPY)

oObjetOLE.Visible=.F.
IF NOT M.lAutomaticUnlockOff
   ADDPROPERTY(oObjetOLE, "LO_CmdButton"SYS(2015))
   oObjetOLE.Parent.AddObject(oObjetOLE.LO_CmdButton, "LockObj_InvButton", oObjetOLE)
ENDIF

DOEVENTS FORCE

= BitBlt(M.hDC, M.nLeft, M.nTop, M.nWidth, M.nHeight, ;
         M.hMemDC, 0, 0, SRCCOPY)

ReleaseDC(M.nWinHandle, M.hDC)
DeleteObject(M.hMemBmp)
DeleteDC(M.hMemDC)

RETURN


*---------------------------------------------------------------- UnLockObject

FUNCTION UnlockObject

LPARAMETERS oObjetOLE

oObjetOLE.Visible = .T.
IF TYPE("oObjetOLE.LO_CmdButton") = 'C'
   oObjetOLE.Parent.RemoveObject(oObjetOLE.LO_CmdButton)
   REMOVEPROPERTY(oObjetOLE, "LO_CmdButton")
ENDIF

RETURN


*---------------------------------------------------------------- GetForm

FUNCTION GetForm

LPARAMETERS oObjet

DO WHILE oObjet.BaseClass <> "Form"
   oObjet = oObjet.Parent
ENDDO

RETURN oObjet




DEFINE CLASS LockObj_InvButton AS COMMANDBUTTON

       Style = 1         && Invisible
       Visible = .T.
       lClick = .F.

       oObjetOLE = NULL


       PROCEDURE Init
           LPARAMETERS oObjetOLE

           THIS.Top = oObjetOLE.Top
           THIS.Left = oObjetOLE.Left
           THIS.Height = oObjetOLE.Height
           THIS.Width = oObjetOLE.Width

           THIS.oObjetOLE = oObjetOLE
           THIS.ZOrder(1)
       ENDPROC


       PROCEDURE Click
            THIS.lClick = .T.
            UnlockObject(THIS.oObjetOLE)
       ENDPROC

       PROCEDURE Destroy
            IF THIS.lClick
               THIS.oObjetOLE.SetFocus
            ENDIF
       ENDPROC
ENDDEFINE
Commentaires
le 25/07/2007, Black Sabbath a écrit :
VFP9 SP1 + XP SP2 : c'est ok, le bouton vient bien au-dessus du TV mais le dessin du TV disparait dès que la souris passe au-dessus du bouton !!!
Commenbt faire pour éviter ce pb ?
BlackSabbath@no.spam.in.hell

le 25/07/2007, Christophe Chenavier a écrit :
Il faut désactiver la gestion des thèmes : SYS(2700,0)

le 25/07/2007, Black Sabbath a écrit :
OK, merci
... mais comment faire pour pouvoir dessiner sur l'image : genre dans le lockButton.click rajouter ThisForm.Line(ThisForm.Tree1.Left+10,ThisForm.Tree1.Top+10,ThisForm.Tree1.Left+20,ThisForm.Tree1.Top+20)
...
Merci

le 25/07/2007, Christophe Chenavier a écrit :
Pour dessiner sur l'image, il faut le faire dans le contexte graphique de la capture.
Mais cela sort du champ d'action de la fonction LockObject.
Bon courage...


Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3