Toolbox style photoshop [Résolu]

TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 10 août 2007 à 08:51 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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
Afficher la suite 

12 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 août 2007 à 23:32
+3
Utile
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
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 12 août 2007 à 23:52
Commenter la réponse de ShareVB
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 14 août 2007 à 19:21
0
Utile
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
Commenter la réponse de TeBeCo
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 14 août 2007 à 19:46
0
Utile
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
*/
Commenter la réponse de cs_coq
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 15 août 2007 à 22:29
0
Utile
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
Commenter la réponse de TeBeCo
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 15 août 2007 à 23:50
0
Utile
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
Commenter la réponse de TeBeCo
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 15 août 2007 à 23:51
0
Utile
d'ailleurs a tout hasard tu as deja testé chez toi les evenement GotFocus LostFocus Enter et Leave en C# sur un formulaire ?

TeBeCo
Commenter la réponse de TeBeCo
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 août 2007 à 23:53
0
Utile
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
*/
Commenter la réponse de cs_coq
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 15 août 2007 à 23:55
0
Utile
je vais tester tout ca je te donne une reponse dans qq minute sur mon avancement

TeBeCo
Commenter la réponse de TeBeCo
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 16 août 2007 à 00:00
0
Utile
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
*/
Commenter la réponse de cs_coq
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 16 août 2007 à 00:07
0
Utile
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
Commenter la réponse de TeBeCo
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 16 août 2007 à 00:39
0
Utile
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
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.