Toolbox style photoshop

Résolu
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011 - 10 août 2007 à 08:51
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 16 août 2007 à 00:39
J'ai réalisé une toolbox pour mon appli du style de la boite a outils et autre ptite fenetre du même genre que l'ont peux appercevoir dans photoshop
Pour ceux qui ne serait pas au courant de ce a quoi cela ressemble il s'agit d'un pti formaulaire (non modal) ouvert par dessus l'appli mère. Ces pti form sont tjs par dessus l'appli mere lorsque celle ci a le focus et par contre elle ne sont plus par dessus le reste quand l'appli perd le focus.

(avant tout j'aimerais preciser que les test ont étés effectués sur des projet completement vide permettant d'éviter de mettre en cause tout autre partie de code)

(le code si apres a été fait sur le form parent et rien sur le form enfant (pour le moment))


Au debut j'ai simplement tenté d'utiliser les evenement "GotFocus" et "LostFocus" herité de la classe "Control" par le formulaire au travers de la ligne :
this.GotFocus += new System.EventHandler(frmMain_GostFocus)
et avec :
private void frmMain_GostFocus(object sender, EventArgs e)
{}
(idem pour LostFocus)
la ligne de rattachement de l'evenement se deroule sans pb mais l'evenement n'est jamais soit declenché soit correctment rattaché a la procedure resultat le code ne s'execute jamais
idem pour Lost focus et pour "Enter" et "Leave" du form que j'ai aussi testé

en vb.net j'ai testé ces evenement que ca soit avec le mot clé "handles" qui fait le rattachement de facon statique ou avec "addhandler" qui correspond a la methode dynamique ecrite ci dessus les 2 marche parfaitement.

bon étant uin poil contrarié j'ai decidé d'essayer un niveau plus bas avec :

private const int WM_ACTIVATEAPP 0x001C;
private void overrides WndProc(Message m){
switch(m.Msg)
   case WM_ACTIVATEAPP:
      if ((int)m.WParam == 0)
      {
         this.Text = "LostFocus";
      }
      else
      {
         this.Text = "GotFocus";
      }
   break;
}
base.WndProc(m);
}

ca marche bien juste avec 1 seul form des que je rajoute la toolbox avec le topmost le flag WM_ACTIVATEAPP se declenche TOUJOURS a la perte du focus de l'application mais au contraire au "gain" de focus de l'appli celui si ne se fait pas tjs des fois il me dit qu'il perd un focus sans jamais l'avoir recuperer cela se produit quand je focus par exemple le form enfant que je fait alt tab pour changer d'appli et que je reviens ou qqchs de similaire j'ai plus le shema exact en tete mais je n'ai actuellement pas reussi a capturer les events comme il fallait.

je suis a l'écoute de toutes suggestion

TeBeCo

12 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 août 2007 à 23:32
Je viens seulement de comprendre : ton problème c'est le TopMost, et je ne vois pas pourquoi tu l'utilises pour faire ce que tu veux (ou alors je n'ai pas compris ce que tu veux :-D)
Si ton but et d'avoir ton Form toolbox en "TopMost" seulement par rapport à ton appli et pas globalement, il te suffit de spécifier ton formulaire principal en tant que propriétaire de cette fenêtre toolbox : soit via la surcharge Show(IWin32Window), soit via la propriété Form.Owner.

"une chose qui m'aiderai serai que quelqu'un me dise si il sait comment faire pour voir si une fonction est rattaché a une evenement ou la liste des fonction auquel est rattaché un evenement."
=> Dans le cas présent, en debug, regarde le contenu de la propriété Events (héritée de Component).

/*
coq
MVP Visual C#
CoqBlog
*/
3
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 août 2007 à 23:52
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
14 août 2007 à 19:21
j'ai deja essayé avec le l'exemple fournit par msdn quand a l'autre ca ne correspond pas forcement au cas present ce n'est en rien des msg box ce sont des formulaire non modaux donc le cas expliqué ne s'applique pas forcement ici deja mais de plus aucun msg n'est envoyé a l'app mere me semble t'il je vais regardé je te tient au courant mais il me semble l'avoir deja fait :p
quoi qu'il en soit le problème de l'evenement qui se declenche pas en C# mais en vb.net me reste en travers de la gorge :s

TeBeCo
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
14 août 2007 à 19:46
Salut,

Etonnant pour la non levée d'event. Où effectue tu l'abonnement ?
Comment et où affiches tu les Form toolbox ?
Quels sont les styles qui leur sont appliqués ?

/*
coq
MVP Visual C#
CoqBlog
*/
0

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

Posez votre question
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
15 août 2007 à 22:29
où j'effectue l'abonement ? :

j'ai essayé de le faire automatiquement par l'IDE, a la main dans le form load, ou encore derriere un clik de bouton
j'ai jamais eu aucune erreur levé mais l'evenement n'a jamais été levé (ou alors jamais rattaché a ma fonction)

comment j'affiche la toolbox :
pour limiter les facteur potentiel de posé problème :
TypeDuForm toto = new TypeDuForm();
TypeDuForm.Show();
et rien d'autre pour le moment

quels style appliqué ?
je sais pas trop ce que tu entend par la mais la seul grosse chose que j'ai changé c'est de l'avoir mit en "FixedToolBox"

j'ai testé sur un autre pc chez moi ca fait pareil et qqun sur le chan irc de codes-sources a lui aussi rencontré le meme soucis
une chose qui m'aiderai serai que quelqu'un me dise si il sait comment faire pour voir si une fonction est rattaché a une evenement ou la liste des fonction auquel est rattaché un evenement.
ca me permettrai de voir si c'est la levé de l'event qui marche pas ou bien le rattachement qui marche pas
sachant que j'ai systematiquement essayé avec d'autre abonement d'evenement et ca a tjs marcher pour les autre

TeBeCo
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
15 août 2007 à 23:50
il me semblais avoir tenté avec le .Owner mais ca me mettais une erreur car tu peux pas faire de owner entre 2 form ou un truc du genre
enfin j'avais creusé cette piste me semble
pour l'autre idée je t'invite a en dire un poil plus histoire de voir comme s'y prendre car j'arrive pas a voir ou se ferais le changement une fois que j'aurais surchargé le .Show de la toolbox

TeBeCo
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
15 août 2007 à 23:51
d'ailleurs a tout hasard tu as deja testé chez toi les evenement GotFocus LostFocus Enter et Leave en C# sur un formulaire ?

TeBeCo
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 août 2007 à 23:53
Tu avais peut être essayer avec Form.Parent.
Pour Show je ne parlais pas de développer une nouvelle surcharge mais d'utiliser celle existante prennant en parmètre l'instance d'une classe implémentant IWin32Window.

/*
coq
MVP Visual C#
CoqBlog
*/
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
15 août 2007 à 23:55
je vais tester tout ca je te donne une reponse dans qq minute sur mon avancement

TeBeCo
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 00:00
Aucun problème avec LostFocus/GotFocus (sur un formulaire vide, après quand des contrôles pouvant "réellement" prendre le focus seront dessus, ça sera sans doute une autre histoire).
Pour Enter/Leave, c'est normal qu'ils ne fonctionnent pas, cf section "Remarque" de la doc de Control.Enter.

/*
coq
MVP Visual C#
CoqBlog
*/
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
16 août 2007 à 00:07
bon alors :
            frmTest Test = new frmTest();
            Test.Owner = this;
            Test.Show();
ou
            frmTest Test = new frmTest();
            Test.Show(this);

marche exactement comme je le souhaitais au tout debut donc je te remercie.
pour l'evenement j'ai l'ai bien retrouvé dans la liste chainée de la propriété Events de components (mot a par la liste chainé c'est vriament l'horreur leur truc pour trouvé l'evenement que tu veux surtout si yen a 70 :p)
donc je pense que l'evenement ne se declenche pas ou alors n'est pas passé a mon assembly

TeBeCo
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 août 2007 à 00:39
Il n'est sans doute pas levé car le formulaire n'est pas la cible de la notification WM_SETFOCUS, ce qui sera le cas si un contrôle pouvant recevoir le focus clavier se trouve sur le formulaire, car c'est lui qui prendra le focus. (le formulaire ne pouvant pas recevoir de focus clavier logiquement)
D'où l'existence d'Activate & co
Ne pas oublier que WinForm repose sur les APIs Win32, et est donc en partie soumis aux mêmes règles :-)

Pour la liste chaînée c'est sur que ce n'est pas forcément pratique, mais bon après tout on ne s'en sert pas tous les jours ;-)
Tu peux te faciliter un peu le boulot en utilisant certains membres private comme Find : this.Events.Find(Control.EventGotFocus)
Si tu penses être amené à t'en servir souvent, tu pourrais probablement développer un visualiseur dédié.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous