Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Child Form créé par serveur dll

6 réponses
Avatar
Guy Lafrenière
Bonjour,

Je crée une application MDI. Je sais qu'il faut fixer la propriété Child =
True pour qu'une form soit une form fille de la form MDI. Cela marche si la
form fille est incluse dans le même projet que la form MDI.

Dans mon application, certaines forms sont créées par des serveurs dll
appelés par mon application MDI. Je voudrais que ces forms soient aussi des
forms filles de la form MDI.

Comment faire?

Merci pour toute aide!

Guy Lafrenière

6 réponses

Avatar
Jacques93
Bonjour Guy Lafrenière,
Guy Lafrenière a écrit :
Bonjour,

Je crée une application MDI. Je sais qu'il faut fixer la propriété Child > True pour qu'une form soit une form fille de la form MDI. Cela marche si la
form fille est incluse dans le même projet que la form MDI.

Dans mon application, certaines forms sont créées par des serveurs dll
appelés par mon application MDI. Je voudrais que ces forms soient aussi des
forms filles de la form MDI.

Comment faire?

Merci pour toute aide!

Guy Lafrenière





Tu peux jeter un coup d'oeil sur ceci :

http://www.freevbcode.com/ShowCode.asp?ID•9

Je n'ai pas testé, mais ça semble correspondre à ce que tu demandes.
Est ce adaptable à ton projet ? Je ne saurais le dire.

--
Cordialement,

Jacques.
Avatar
Guy Lafrenière
Bonjour Jacques93,

Je te remercie d'avoir pris le temps de me répondre.

J'ai téléchargé le code dont tu parlais. Malheureusement ça ne convient pas.
C'est beaucoup trop compliqué pour ce que je veux faire.

Je pensais qu'il suffisait de jouer avec quelques propriétés (Parent, hWnd,
etc.) et le tour était joué.

À une prochaine fois!

Guy Lafrenière

----------------------------------------------------------------------------
--------

"Jacques93" a écrit dans le message de
news:
Bonjour Guy Lafrenière,
Guy Lafrenière a écrit :
> Bonjour,
>
> Je crée une application MDI. Je sais qu'il faut fixer la propriété Child


> > True pour qu'une form soit une form fille de la form MDI. Cela marche si
la
> form fille est incluse dans le même projet que la form MDI.
>
> Dans mon application, certaines forms sont créées par des serveurs dll
> appelés par mon application MDI. Je voudrais que ces forms soient aussi


des
> forms filles de la form MDI.
>
> Comment faire?
>
> Merci pour toute aide!
>
> Guy Lafrenière
>
>

Tu peux jeter un coup d'oeil sur ceci :

http://www.freevbcode.com/ShowCode.asp?ID•9

Je n'ai pas testé, mais ça semble correspondre à ce que tu demandes.
Est ce adaptable à ton projet ? Je ne saurais le dire.

--
Cordialement,

Jacques.


Avatar
Jacques93
Bonjour Guy Lafrenière,
Guy Lafrenière a écrit :
Bonjour Jacques93,

Je te remercie d'avoir pris le temps de me répondre.

J'ai téléchargé le code dont tu parlais. Malheureusement ça ne convient pas.
C'est beaucoup trop compliqué pour ce que je veux faire.

Je pensais qu'il suffisait de jouer avec quelques propriétés (Parent, hWnd,
etc.) et le tour était joué.

À une prochaine fois!

Guy Lafrenière




On peur faire quelque chose de minimal. Mais le fonctionnement sera
partiel. Dans un premier temps il faut récupérer le Handle de la zone
MDI de la fenêtre principale, avec les API :

FindWindow (Recherche de la fenêtre principale)

et

EnumChildWindow (Recherche de la zone MDI)

et ensuite rattacher la fenêtre de la dll à cette dernière, et la
positionner avec :

SetParent Handle_DLL, Handle_MDI
SetWindowPos ...

Pour Windows la fenêtre de la dll sera bien une fenêtre fille de la zone
MDI. Par contre tout cela est "invisible" pour VB. Conséquences :

La fenêtre de la dll n'apparaîtra pas dans le menu "Fenêtre",
Les déplacement de la fenêtre de la dll ne seront pas "vu" par VB,
donc en cas de déplacement hors zone les ascenceurs ne s'affichent
pas, et l'affichage peut être parfois erratique.

Pour avoir fait des essais, je peux t'assurer que ce n'est pas vraiment
simple de simuler ces fonctionnalités.

--
Cordialement,

Jacques.
Avatar
Guy Lafrenière
Bonjour Jacques93,

Je te remercie pour ta réponse.

Si mon serveur dll ouvre une fenêtre avec MyForm.Show vbModal, le problème
n'est pas trop grave puisque de toute façon l'utilisateur ne peut pas aller
ailleurs. J'aurais aimé que ces forms venant du serveur dll soient vraiment
comme des forms filles, c'est-à-dire placées à l'intérieur de la fenêtre
principale et apparaissant dans le menu Fenêtre.

À partir de ce que tu me dis, je crois bien que je devrai en faire mon
deuil.

Meilleure chance la prochaine fois!

Guy Lafrenière


----------------------------------------------------------------------------

"Jacques93" a écrit dans le message de
news:
Bonjour Guy Lafrenière,
Guy Lafrenière a écrit :
> Bonjour Jacques93,
>
> Je te remercie d'avoir pris le temps de me répondre.
>
> J'ai téléchargé le code dont tu parlais. Malheureusement ça ne convient


pas.
> C'est beaucoup trop compliqué pour ce que je veux faire.
>
> Je pensais qu'il suffisait de jouer avec quelques propriétés (Parent,


hWnd,
> etc.) et le tour était joué.
>
> À une prochaine fois!
>
> Guy Lafrenière
>

On peur faire quelque chose de minimal. Mais le fonctionnement sera
partiel. Dans un premier temps il faut récupérer le Handle de la zone
MDI de la fenêtre principale, avec les API :

FindWindow (Recherche de la fenêtre principale)

et

EnumChildWindow (Recherche de la zone MDI)

et ensuite rattacher la fenêtre de la dll à cette dernière, et la
positionner avec :

SetParent Handle_DLL, Handle_MDI
SetWindowPos ...

Pour Windows la fenêtre de la dll sera bien une fenêtre fille de la zone
MDI. Par contre tout cela est "invisible" pour VB. Conséquences :

La fenêtre de la dll n'apparaîtra pas dans le menu "Fenêtre",
Les déplacement de la fenêtre de la dll ne seront pas "vu" par VB,
donc en cas de déplacement hors zone les ascenceurs ne s'affichent
pas, et l'affichage peut être parfois erratique.

Pour avoir fait des essais, je peux t'assurer que ce n'est pas vraiment
simple de simuler ces fonctionnalités.

--
Cordialement,

Jacques.


Avatar
Picalausa François
Hello,

Personnellement, j'opetrais pour une approche différente...
Au lieu de créer les feuilles par un serveur dll (difficile à réaliser
proprement avec VB), je créerais des fenêtres dans l'application dont le
contenu serait informé par la dll (dans ce cas ci ocx, mais soit, un ocx est
une dll dont l'extension est changée).

Voici un exemple:
Projet de type Contrôle ActiveX nommé RemoteMDIContainerSample
Usercontrol nommé UserControl1 dont le code est:

-------------------------------------------------------------
Option Explicit

Private Sub UserControl_Paint()
UserControl.Cls
'Pour voir quelquechose, et en particulier l'espace occupé
UserControl.Cls
UserControl.CurrentX = 10
UserControl.CurrentY = 10
UserControl.Print "Dyn Ctl"
UserControl.Line (UserControl.ScaleWidth / 2, UserControl.ScaleHeight)-
_
(UserControl.ScaleWidth, UserControl.ScaleHeight / 2), _
vbRed
End Sub

Private Sub UserControl_Resize()
Call UserControl_Paint
End Sub
-------------------------------------------------------------

Projet de type Exe standard
Feuille MDI parente dont le code est:

-------------------------------------------------------------
Option Explicit

Private Sub MDIForm_Click()
'Demande une nouvelle feuille fille MDI contenant un usercontrol
'RemoteMDIContainerSample.UserControl1
Call SpawActiveX("RemoteMDIContainerSample.UserControl1")
End Sub

Public Sub SpawActiveX(clsid As String)
'Crée la nouvelle feuille dynamiquement (même pas peur)
Dim NewForm As Form1
Set NewForm = New Form1

'Indique à la feuille de créer un contrôle enfant du type indiqué
'et de s'en occuper
NewForm.AttachActiveX clsid

'Affiche la nouvelle feuille
NewForm.Show
End Sub
-------------------------------------------------------------

Feuille dont les propriétés design time sont:
Name = From1
MDIChild = True

et dont le code est:

-------------------------------------------------------------
Option Explicit

Public Sub AttachActiveX(clsid As String)
'S'assure qu'il n'y a pas de contrôle précédemment attaché
Call DetachActiveX

'Attache le nouveau contrôle et l'affiche
Call Me.Controls.Add(clsid, _
"TestCtl", Me)
Me.Controls("TestCtl").Visible = True

'Dimensionne correctement le contrôle
Call Form_Resize
End Sub

Public Sub DetachActiveX()
On Error Resume Next '<- trouver plus subtile
Call Me.Controls.Remove("TestCtl") 'Supprime le contrôle présent
End Sub

Private Sub Form_Resize()
On Error Resume Next '<- trouver plus subtile
Call Me.Controls("TestCtl").Move(0, 0, Me.ScaleWidth, Me.ScaleHeight)
End Sub
-------------------------------------------------------------

Je ne sais pas si cela peut répondre à tes besoins?

--
Picalausa François

"Guy Lafrenière" a écrit dans le message de news:

Si mon serveur dll ouvre une fenêtre avec MyForm.Show vbModal, le problème
n'est pas trop grave puisque de toute façon l'utilisateur ne peut pas
aller
ailleurs. J'aurais aimé que ces forms venant du serveur dll soient
vraiment
comme des forms filles, c'est-à-dire placées à l'intérieur de la fenêtre
principale et apparaissant dans le menu Fenêtre.


Avatar
Guy Lafrenière
Bonjour François,

Merci pour ta réponse mais c'est encore beaucoup trop compliqué. Je vais me
débrouiller avec des dll qui n'offrent pas de forms filles. Ce n'est pas un
drame dans le cas qui m'occupe.

Je ferme le dossier. Merci à tous!

Guy Lafrenière

---------------------------------------------------------------------------

"Picalausa François" a écrit dans le message de
news:
Hello,

Personnellement, j'opetrais pour une approche différente...
Au lieu de créer les feuilles par un serveur dll (difficile à réaliser
proprement avec VB), je créerais des fenêtres dans l'application dont le
contenu serait informé par la dll (dans ce cas ci ocx, mais soit, un ocx


est
une dll dont l'extension est changée).

Voici un exemple:
Projet de type Contrôle ActiveX nommé RemoteMDIContainerSample
Usercontrol nommé UserControl1 dont le code est:

-------------------------------------------------------------
Option Explicit

Private Sub UserControl_Paint()
UserControl.Cls
'Pour voir quelquechose, et en particulier l'espace occupé
UserControl.Cls
UserControl.CurrentX = 10
UserControl.CurrentY = 10
UserControl.Print "Dyn Ctl"
UserControl.Line (UserControl.ScaleWidth / 2,


UserControl.ScaleHeight)-
_
(UserControl.ScaleWidth, UserControl.ScaleHeight / 2), _
vbRed
End Sub

Private Sub UserControl_Resize()
Call UserControl_Paint
End Sub
-------------------------------------------------------------

Projet de type Exe standard
Feuille MDI parente dont le code est:

-------------------------------------------------------------
Option Explicit

Private Sub MDIForm_Click()
'Demande une nouvelle feuille fille MDI contenant un usercontrol
'RemoteMDIContainerSample.UserControl1
Call SpawActiveX("RemoteMDIContainerSample.UserControl1")
End Sub

Public Sub SpawActiveX(clsid As String)
'Crée la nouvelle feuille dynamiquement (même pas peur)
Dim NewForm As Form1
Set NewForm = New Form1

'Indique à la feuille de créer un contrôle enfant du type indiqué
'et de s'en occuper
NewForm.AttachActiveX clsid

'Affiche la nouvelle feuille
NewForm.Show
End Sub
-------------------------------------------------------------

Feuille dont les propriétés design time sont:
Name = From1
MDIChild = True

et dont le code est:

-------------------------------------------------------------
Option Explicit

Public Sub AttachActiveX(clsid As String)
'S'assure qu'il n'y a pas de contrôle précédemment attaché
Call DetachActiveX

'Attache le nouveau contrôle et l'affiche
Call Me.Controls.Add(clsid, _
"TestCtl", Me)
Me.Controls("TestCtl").Visible = True

'Dimensionne correctement le contrôle
Call Form_Resize
End Sub

Public Sub DetachActiveX()
On Error Resume Next '<- trouver plus subtile
Call Me.Controls.Remove("TestCtl") 'Supprime le contrôle présent
End Sub

Private Sub Form_Resize()
On Error Resume Next '<- trouver plus subtile
Call Me.Controls("TestCtl").Move(0, 0, Me.ScaleWidth, Me.ScaleHeight)
End Sub
-------------------------------------------------------------

Je ne sais pas si cela peut répondre à tes besoins?

--
Picalausa François

"Guy Lafrenière" a écrit dans le message de news:

> Si mon serveur dll ouvre une fenêtre avec MyForm.Show vbModal, le


problème
> n'est pas trop grave puisque de toute façon l'utilisateur ne peut pas
> aller
> ailleurs. J'aurais aimé que ces forms venant du serveur dll soient
> vraiment
> comme des forms filles, c'est-à-dire placées à l'intérieur de la fenêtre
> principale et apparaissant dans le menu Fenêtre.