Comment changer des objets de container dans un UserControl.

pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005 - 4 sept. 2005 à 14:17
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 5 sept. 2005 à 17:35
Bonjour a tous,



J'ai besoin d'écrire un ActiveX qu'on va appeler "MyX", qui est un
container pour d'autres contrôles. J'ai besoin de déplacer les objets
dessinés par le developpeur dans un container interne qui se trouve
dans MyX et qui peut être une Frame ou un voir même un autre ActiveX
(qui est encapsulé dans MyX) et que l'on peut appeler Ax2.



A part le fait que je doit utiliser le Subclassing pour gérer les
évènements dans l'environement de développement, l' instruction Set
Obj.container Frame1 ou Set Obj.container Ax2, ne fonctionnenent
pas et provoque une erreur.



Je ne peux pas utiliser SetParent non plus, car il y a des contrôles
tracés qui ne contienent pas de Handle et donc ne seront pas déplacés.



Voilà, si quelqu'un peut m'aider !!



Phil.

7 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
4 sept. 2005 à 17:12
salut.
(si j'ai bien compris...)
ton MyX est un Control. ce n'est pas parce qu'il en contient lui même qu'il peut s'approprier les contrôles aux alentours.
je crois que s'il y a un moyen de procéder, çà serait de mettre ton control en container=true, puis dans ton projet, lorsque tu déplaces qqc sur ce control, ou l'utilisateur par un dragdrop, etc...., envoyer l'info au MyX qui lui va récupérer le hWnd de l'objet déposé pour le rendre enfant d'un des container qu'il contient (Set Parent, GetParent)

çà me semble être la seule possibilité
PCPT
0
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005
5 sept. 2005 à 01:01
Salut pcpt,



Oui Myx est un control ActiveX, qui est bien sur déclaré comme
container. Mais ca ne suffit pas. Imaginons que tu veuilles écrire un
control qui gère des onglets par ex. Le controle principal est un
container, soit, mais j'ai besoin d'avoir, à l'intérieur de celui-ci
d'autres container, que je gère moi même pour répartir les contrôles
que l'utilisateur va dessiner, dans une catégorie ou une autre. Comme
je l'ai déjà dit, le SetParent ne peut pas fonctionner ou du moins
fonctionne mais pas pour tout, puisqu'il est impossible de changer de
container les controles n'ayant pas de Handle (Label, control
WindowsLess, etc..).



Sur une form normale, j'utiliserai bien vonlontiers la propriété
Container des objets pour les déplacer, mais cette méthode échoue dans
un ActiveX, même si je mets un controle Frame par ex, dans mon controle
Myx, que cette frame soit visible ou non, l'affectation Set
CtlUtil.container = Frame1 génère une erreur, alors que ça marche dans
une form normale.



J'ai bien essayé de créer, lors de la création de Myx, un autre control
dynamiquement, qui lui aussi est container, mais les objets déssinés
dessus, ne rentre pas dans sa collection controls, ils appartiennent à
la collection controls de MyX.

J'ai essayé également de créer un control "Back" dynamiquement dans la
collection Controls du Parent de MyX (La Form), la méthode .Add échoue,
alors qu'elle marche dans une form normale.



Voilà pour les explications, merci d'avance de vos réponses.

Phil-Rac.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 02:19
re,
bon, ce n'est bien sûr qu'un début, mais au moins, çà marche.

j'ai une Form1 (notepad / .frm), 1 usercontrol (notepad / UC.ctl) contenant 2 usercontrol (notepad / frame.ctl)

j'ai fait le test avec un TextBox, sans succès. par contre, çà fonctionne avec une Picture. donc essaie et toi moi au courant ;)


<HR>

Form1.frm

VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3060
ClientLeft = 60
ClientTop = 345
ClientWidth = 3585
LinkTopic = "Form1"
ScaleHeight = 3060
ScaleWidth = 3585
StartUpPosition = 3 'Windows Default
Begin VB.PictureBox Picture1
Height = 975
Left = 960
ScaleHeight = 915
ScaleWidth = 1395
TabIndex = 2
Top = 840
Width = 1455
End
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 195
Left = 960
TabIndex = 1
Top = 2760
Width = 1575
End
Begin Projet1.UC UC1
Height = 2415
Left = 120
TabIndex = 0
Top = 120
Width = 3375
_ExtentX = 5953
_ExtentY = 4260
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
Call UC1.SetObj(Picture1.hWnd)
End Sub


<HR>

UC.ctl

VERSION 5.00
Begin VB.UserControl UC
AutoRedraw = -1 'True
BackColor = &H00C0FFC0&
ClientHeight = 2445
ClientLeft = 0
ClientTop = 0
ClientWidth = 3450
ControlContainer= -1 'True
ScaleHeight = 2445
ScaleWidth = 3450
Begin Projet1.frame frame2
Height = 2175
Left = 1800
TabIndex = 1
Top = 120
Width = 1455
_ExtentX = 2566
_ExtentY = 3836
End
Begin Projet1.frame frame1
Height = 2175
Left = 120
TabIndex = 0
Top = 120
Width = 1455
_ExtentX = 2566
_ExtentY = 3836
End
End
Attribute VB_Name = "UC"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
'
'
Public Property Get hWnd() As Long
hWnd = UserControl.hWnd
End Property
'
'
Public Sub SetObj(ObjhWnd As Long)
Call SetParent(ObjhWnd, frame1.hWnd)
UserControl.Refresh
End Sub


<HR>

frame.ctl

VERSION 5.00
Begin VB.UserControl frame
AutoRedraw = -1 'True
BackColor = &H00FFC0C0&
ClientHeight = 1620
ClientLeft = 0
ClientTop = 0
ClientWidth = 1815
ControlContainer= -1 'True
ScaleHeight = 1620
ScaleWidth = 1815
End
Attribute VB_Name = "frame"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Public Property Get hWnd() As Long
hWnd = UserControl.hWnd
End Property

<HR>

PCPT
0
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005
5 sept. 2005 à 16:13
Merci PCPT,



Mais je le redis ENCORE UNE FOIS, je ne peut pas utiliser SetParent, a
moins que tu ai une solution pour déplacer des controles SANS Handle ?


Phil
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 16:35
ok... peut-être le but de ce test n'est pas clair?
dans cette PictureBox, met un Label !
essai AU MOINS UNE FOIS ce que j'ai fait

je n'ai pas mis une PictureBox pour rien. même un composant tel que le TxtBox, qui a un Handle, ne fonctionne pas.
essai de suivre ma logique ; de mettre un composant dans ce conteneur que tu peux "t'approprier" avec le SetParent.
et tiens moi au courant...
c'est une piste, pas LA solution. il me semble que çà t'avance toujours un peu plus qu'au départ. tu vois déjà que le composant peut utiliser son handle mais aussi le handle des objets qui le composent, et celui de certains objets de son propre parent.

(peut-être y arrivais-tu déjà, dans quel cas, désolé et bon courage)

PCPT
0
pracoupeau Messages postés 10 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 5 septembre 2005
5 sept. 2005 à 16:52
PCPT,



Je te remercie pour tes réponses rapide.



En fait la solution que tu me propose, je l'ai déjà mis en ouvre, mais
ca oblige l'utilisateur à tracer en premier mon control, puis pour
chaque catégorie, à tracer un autre activeX que sert de contener
(l'équivalent de ta PictureBox) dans ton test (Que j'ai testé bien
sur). C'est en fait, pour ceux qui connaissait, la démarche
qu'utilisait les SSTAB de Sheridan.



En Fait, j'aimerai pouvoir me passer de cette seconde étape.

Phil
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 17:35
évidemment, je vois bien la différence entre devoir créer 5pictures pour 5onglets de ton MyX, et SSTab existant, c'est donc forcément possible.
mais rien ne dit que le SStab n'aille pas taper dans une dll qui n'est pas un activeX....

l'intérêt de la solution que je t'ai proposé (et que tu connaissais), est que çà ouvre juste une piste de recherche. par là, j'entend que peut-être faut-il créer une Form dans ton contrôle, Form instanciée par onglet, et que çà soit alors ces Form qui capturent les objets correspondants par rapport au moment ou ils sont posés sur ton contrôl et à l'onglet visible.

pas évident tout çà
bonne continuation. n'hésite pas au besoin, à défaut de pouvoir t'aider, je peux toujours essayer
PCPT
0
Rejoignez-nous