Hwnd, GetParent et SetParent sous Access

lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004 - 5 août 2004 à 11:44
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008 - 6 août 2004 à 12:30
je rencontre quelques difficultés avec les hwnd en VBA Access. Cela ne s'applique pas uniquement qu'aux formulaires mais c'est dans ce contexte que j'ai ces problèmes.

- Me.hwnd fonctionne.

- MonHwnd = CreateWindowEx(....) fonctionne aussi (avec passage de Me.hwnd comme parent par exemple).

- un GetParent (Me.hwnd) fonctionne aussi.

X mais un GetParent (MonHwnd) donne 0 :

XX Alors que le parent est bien spécifié à Me.hwnd dans la création de la fenêtre.

XX si je ferme un formulaire à partir duquel j'ai créé et affiché une fenêtre (hwnd parent = Me.hwnd et affichage en TopMost), cette fenêtre s'efface également.

X autre souci. Même si je fais SetParent MonHwnd, Me.hwnd, le Getparent(MonHwnd) reste deséspérement à 0.

J'y perds mon latin...

5 réponses

cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008
5 août 2004 à 12:24
salut,
je ne pense pas que bcp de personnes puissent t'aider sans morceau de code, les API dans ce cas de figure, sont relativements complexes à utiliser. je pense que plein de paramètres peuvent rentrer en compte.
(Enfin c'est mon avis ...)

Bonne prog, poele_a_frire@hotmail.com
liquide
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
5 août 2004 à 14:35
OK, voici les instructions :

Dans un module :

'*********************

Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Public Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild as Long, ByVal hWndNewParent As Long) As Long
Public Declare Function GetParent Lib "user32" (ByVal hWnd as Long) As Long

'*********************
'Constantes
'*********************

Public Const WS_EX_STATICEDGE = &H20000
Public Const WS_EX_TRANSPARENT = &H20&
Public Const WS_EX_CLIENTEDGE = &H200
Public Const WS_EX_TOPMOST = &H8&

Public Const WS_POPUP = &H80000000
Public Const WS_CHILD = &H40000000 'incompatible avec WS_POPUP
Public Const WS_BORDER = &H800000
Public Const WS_DLGFRAME = &H400000
Public Const WS_THICKFRAME = &H4000
Public Const WS_CAPTION = &HC00000 'WS_BORDER OR WS_DLGFRAME

Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOP = 0
Public Const HWND_TOPMOST = -1
Public Const HWND_BOTTOM = 1

Public Const SW_NORMAL = 1
Public Const SW_HIDE = 0

'*********************
Dans un formulaire (avec un bouton Commande0)
'*********************

Dim mhwnd As Long

Private Sub Commande0_Click()

'on crée la fenêtre et on l'affiche
mhwnd = CreateWindowEx(WS_EX_TOPMOST, "STATIC", "Titre", WS_BORDER, 0, 0, 150, 100, Me.hwnd, 0, 0, 0)
SetWindowPos mhwnd, -1, 0, 0, 0, 0, &H1
ShowWindow mhwnd, SW_NORMAL

'le hwnd du formulaire [OK]
msgbox (me.hwnd)

'le hwnd du parent du formulaire (Access) [OK]
msgbox getParent(me.hwnd)

'le hwnd de la fenêtre créée [OK]
msgbox (mhwnd)

'le hwnd du parent de la fenêtre ... 0 !
msgbox getParent(mhwnd)

'on essaie de passer en force en affectant le formulaire comme parent de la fenêtre
SetParent mhwnd, me.hwnd

'le hwnd du parent de la fenêtre ...et toujours à 0 !
msgbox getParent(mhwnd)


End Sub

Private Sub Form_Unload(Cancel As Integer)
DestroyWindow mhwnd
End Sub

'*********************
0
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008
5 août 2004 à 21:23
salut

A tout hazard (sous 95 98) pour le hinstance du createwindowex , mets App.Hintance
mais je doute que ca resolve ton pb

dans l'aide, il marque ca "Static controls take no input and provide no output" .. mon anglais n'est pas tres bon voire très mauvais, mais cette phrase peut laisser a supposer que tu ne peux recuperer ni envoyer des données et .. ce qui laisse a supposer que tu ne peux plus rien faire une fois qu'il est créer, meme recuperer le handle parent.
alors il te faudra utiliser les lpclassname
car la je crois que tu as tout bien fait

dsl

Bonne prog, poele_a_frire@hotmail.com
liquide
0
lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 08:22
Le App.Instance n'est pas reconnu par Access. En le mettant à 0, çà passe.

Saurais-tu où je pourrais trouver des infos particulières sur des lpClassName (pas celles de base. Celle comme proposée par Renfield dans son infobulle, ToolInfo, est très intéressante mais s'applique a priori aux infobulles.)
0

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

Posez votre question
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008
6 août 2004 à 12:30
0
Rejoignez-nous