wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» CreateWindowFromHWND
Conversation : CreateWindowFromHWND
21-04-2009 07:07:50  CreateWindowFromHWND #1
tilleul (Nouveau membre)
Inscrit le : 21-04-2009
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,

Je suis débutant sur wxWidget mais il m'intéresse fortement et je suis très motivé.
(et il m'en fallu du courage jusqu'à présent :) )
Mais j'avoue être un peu perdu devant la masse d'information et la doc officiel pas pratique a parcourir.
Que je vous explique le contexte, l'objectif, les différents problème(s) rencontrés et mes interrogations.

- Je développe sous visual studio 2008 pro.
- Je doit développer un plug'in, sous forme de .dll(spéciale), pour une application.
- Cette .dll doit utiliser des composants wxWidget.
- Je compile les lib wxWidget en static release.
- je n'utilise pas le point d'entrée de la .dll (dllMain) pour initialiser wxWidget (wxApp).
(c'est comme ça, :) c'est le plug'in qui veut ça, ce n'est pas un choix personnel)
- après avoir "bataillé" des heures pour linker/compiler correctement tout cela, ça fonctionne.
:) Youpi ! (j'ai allumer trois cierges, et je prépare un voyage pour lourdes d'ici Mai.)
- Comme je suis grand débutant, je commence par les différents tutoriels présent sur ce site et l'officiel. d'ailleurs un grand merci a cette communauté.
- je reproduis le tutoriel simple fenêtre (wxFrame) et ma foie ça fonctionne. :)

Coté application, comment cela se passe :
- Au lancement, L'application charge la .dll en tant que plug'in (un peu comme Photoshop et ses filtres)
- je vais dans le menu plug'in, et je clique sur ce fameux bouton qui "appel" ma .dll et ma simple fenêtre s'affiche. magnifique. :)

Questions :
J'aimerais rendre cette fenêtre "enfant" de l'application comment dois-je m'y prendre ?
Est ce possible avec le composant wxFrame ?
Peut-être wxWindow ? Si vous pouviez m'expliquer la différence entre ces deux d'ailleurs ?
j'ai cherché et trouvé ceci : CreateWindowFromHWND (ce post date de 2003)
http:/lists.wxwidgets.org/pipermail/wx- … 32773.html
qui me semble correspondre a que je désire faire. Qu'en est il a l'heure actuel ?
j'aimerais également  que ma fenêtre puisse ce "docker" avec le parent.
est-ce possible ? si oui que dois je utiliser comme composant ?
j'ai cru comprendre qu'il fallait utilisé wxAUI ?
Voilà :), vous avez pu vous en rendre compte c'est le grand "b**del" dans ma tête :)
Je suis perdu et votre aide me serez d'un grand secours.

Merci
tilleul.
21-04-2009 08:53:07  Re: CreateWindowFromHWND #2
cfdev (Membre)
Lieu: Alpes de Haut Provence
Inscrit le : 08-11-2007
Messages: 127
Snippets: 4
Tutoriels: 0
Site web
Hors ligne
lut,

tilleul:
J'aimerais rendre cette fenêtre "enfant" de l'application comment dois-je m'y prendre ?
Est ce possible avec le composant wxFrame ?
Pour une fenêtre enfant avec un wxFrame tu peux utiliser la wxMDIChildFrame.


tilleul:
j'aimerais également  que ma fenêtre puisse ce "docker" avec le parent.
est-ce possible ? si oui que dois je utiliser comme composant ?
j'ai cru comprendre qu'il fallait utilisé wxAUI ?
En effet la class wxAUI permet de faire des dockers.

bon courage ;)
++

GNU Linux Power !
Slacker
21-04-2009 09:32:46  Re: CreateWindowFromHWND #3
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut tilleul, et bienvenue sur wxDev.fr

En ce qui concerne CreateWindowFromHWND: cette fonction ne permet pas de créer une fenêtre avec comme parent celle dont tu lui passe le HWND, mais elle permet "d'associer" une classe wxWindow à une fenêtre existante dont tu lui donnes le HWND.

Pour la différence entre wxWindow et wxFrame : wxWindow est une classe "de base" de quasiment toutes les classes GUI (fenêtres, contrôles, ...)
wxFrame, quand à elle, représente une fenêtre à proprement parler. Elle dérive d'ailleurs (entre autres) de wxWindow.

Une petite remarque au passage : Si l'application de base (celle qui doit charger les plugins) utilise wxWidgets, il faut impérativement que tu utilises une version "dynamique" des libs, sous peine de crash lors de l'utilisation des plugins.
Par contre, je ne peux rien affirmer pour le cas d'une application Win32 classique, utilisant un ou plusieurs plugins wxWidgets (pour un seul, les libs dynamiques doivent marcher sans problème, mais pour plusieurs, c'est à voir).

Je ferais quelques essais quand je trouverais le temps.

Tiens-nous au courant.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
21-04-2009 09:39:52  Re: CreateWindowFromHWND #4
cfdev (Membre)
Lieu: Alpes de Haut Provence
Inscrit le : 08-11-2007
Messages: 127
Snippets: 4
Tutoriels: 0
Site web
Hors ligne
xav:
Une petite remarque au passage : Si l'application de base (celle qui doit charger les plugins) utilise wxWidgets, il faut impérativement que tu utilises une version "dynamique" des libs, sous peine de crash lors de l'utilisation des plugins.
ha, intéressant ça! A se rappeler.

GNU Linux Power !
Slacker
21-04-2009 10:16:13  Re: CreateWindowFromHWND #5
tilleul (Nouveau membre)
Inscrit le : 21-04-2009
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour et merci a vous deux pour vos prompt réponses. :)

Xaviou:
En ce qui concerne CreateWindowFromHWND: cette fonction ne permet pas de créer une fenêtre avec comme parent celle dont tu lui passe le HWND, mais elle permet "d'associer" une classe wxWindow à une fenêtre existante dont tu lui donnes le HWND.
Oui, j'ai vu que je m'étais mal exprimer et c'est exactement ce que je veux faire, merci. :)
j'aurais du partir sur un exemple concret afin de ne pas vous induire en erreur.

Donc tu me conseillerai d'utiliser plutôt wxWindow a wxFrame dans mon cas ?
Comme sur la mailing-list, (voir lien plus haut)
j'ai vu également ce bout de code mais je ne trouve pas les infos dans la doc.
wxWindow *win = new wxWindow;
win->SetHWND((WXHWND)hwnd);
//win->SubclassWin(WXHWND)hwnd);
parent->AddChild(win);

j'ai beau regarder dans la doc je ne trouve rien sur CreateWindowFromHWND ?
D'ailleurs au passage je lis la doc a partir de ce site :
http:/docs.wxwidgets.org/stable/wx_contents.html

Vous en connaissez une meilleur ? avec possibilité de recherche.

Xaviou:
il faut impérativement que tu utilises une version "dynamique" des lib
Ben en fait, je suis très peu familier avec ces histoires de lib, c'est une expérience très récente pour moi et très douloureuse :)
Que veux-tu dire par version dynamique ?

Merci encore a vous deux.
bonne journée
21-04-2009 13:51:25  Re: CreateWindowFromHWND #6
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Tout d'abord, en ce qui concerne les différences statique/dynamique :

Tu as dit dans ton premier post, que tu avais compilé wxWidgets en "release statique".
Le 'statique" indique en fait que les libs sont incorporées à l'exécutable qui les utilise.
C'est pour cette raison qu'un simple exe qui affiche une fenêtre avec les libs statiques pèse plus de 2Mo.

A l'inverse, quand on utilise des libs dynamiques, celles-ci se présentent sous la forme de fichiers dll.
Ça peut paraître un peu pénible, du coup, d'avoir à fournir à la fois l'application et les dll wxWidgets dont elle a besoin.
Par contre, si par exemple ton application est une suite d'outils (et donc, se compose de plusieurs exécutables) tu n'auras à fournir qu'une seule version des dll qui sera utilisée par tous les exécutables.

Dans le cas des plugins, il y a un autre phénomène qui entre en compte.
Lorsque tu charges une dll wxWidgets depuis une application wxWidgets, la dll est "enregistrée" dans une liste globale de libs.
Or, si tu linkes en statique, tu auras deux listes distinctes : une pour l'exécutable et une pour le plugin. Et quand tu essayes de mélanger les deux (en plaçant par exemple un contrôle de la dll sur la fenêtre de l'exécutable), tu obtiens un joli crash.
Dans ton cas, si j'ai bien compris, tu veux créer une dll utilisant wxWidgets pour créer un plugin d'une application qui serait en pure API win32.
A mon avis, si tu n'as qu'un seul plugin à faire, tu peux rester en statique, mais si tu dois créer plusieurs dll utilisant wxWidgets, il vaut mieux tout de suite passer en dynamique.

Pour l'histoire de la fenêtre, je pense effectivement qu'il vaut mieux passer par wxWindow si la fenêtre existe déjà (par exemple, créée en API Win32).
Après, c'est toi qui vois : je ne sais pas comment est créée cette fenêtre, mais je pense que si tu as la possibilité, tu devais la créer directement avec wxWidgets.

Pour ce qui est du bout de code, je pense plutôt qu'il s'agit de ce que la personne aimerait pouvoir faire, et non de ce qu'elle peut faire.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
21-04-2009 15:43:22  Re: CreateWindowFromHWND #7
tilleul (Nouveau membre)
Inscrit le : 21-04-2009
Messages: 3
Snippets: 0
Tutoriels: 0
Hors ligne
Merci, réponse très claire encore une fois :)

ma .dll est un peu spéciale (pas de dllMain) mais effectivement, c'est donc bien une "release statique" les fonctions sont incorporées dans la .dll, elle fait près de 1.2 Mo et j'ai inclu les 2 lib de base.
( n'hésitait pas a me reprendre si je fais un abus de langage :) je suis pas tout a fait familier avec tous ces termes. )

le passage en dynamique n'est pas envisageable/possible, mais de ce que j'en sais l'appli est en pure Win32.
Xaviou:
A mon avis, si tu n'as qu'un seul plugin à faire, tu peux rester en statique, mais si tu dois créer plusieurs .dll utilisant wxWidgets, il vaut mieux tout de suite passer en dynamique.
Si une personne fait également un plug'in qui utilise wxWidget en statique release et que l'appli est en pure WIN32, est ce que nos deux .dll feront crasher l'appli ?
Là ça poserait un réel problème.

Merci Xaviou
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» CreateWindowFromHWND