Annuler la prise de focus d'une Form 'surgissante'

Résolu
cs_Smalo Messages postés 36 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 11 décembre 2006 - 24 août 2006 à 21:10
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 28 août 2006 à 12:48
Bonjour,
Bon je me trouve devant une colle .. En fait j'ai une fenètre principale et je voudrais à la suite d'un évenement, (par exemple survol d'un label) afficher une autre Form mais je ne veux
pas que celle ci prenne le focus.. je voudrai qu'elle s'affiche comme si rien n'était.. j'ai tout essayé mais je ne trouve pas de méthode permettant d'inhiber la prise de focus de la Form 'surgissante'.
j'ai essayé ça :
form_Panneau.TopMost =

true; // ma form panneau est ma form surgissante
form_Panneau.Show();
this.Focus();

Seulement ça ne me convient pas car l'espace d'un court instant ma fenetre principale perd le focus
et du coup ça fait un petit 'flash' sur la barre de titre et le tour de ma fenettre principale.

Merci d'avance....

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
25 août 2006 à 21:30
Salut, encore une fois il faut passer par l'API Win32 :

public partial class Form1 : Form
{
    private const int SWP_NOACTIVATE = 0x0010;
    private const int SWP_SHOWWINDOW = 0x0040;


    [ System.Runtime.InteropServices.DllImport( "user32.dll", SetLastError = true ) ]
    private static extern bool SetWindowPos
    (
        IntPtr hWnd,
        IntPtr hWndInsertAfter,
        int x,
        int y,
        int cx,
        int cy,
        uint flags
    );


    public Form1( )
    {
        InitializeComponent( );


        Label lb = new Label( );
        lb.Location = new Point( 50, 50 );
        lb.BackColor = Color.AliceBlue;
        lb.MouseHover += delegate
        {
            Form f = new Form( );
            //f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            //f.ShowInTaskbar = false;
            Rectangle r = lb.RectangleToScreen( lb.ClientRectangle );


            SetWindowPos
            (
                f.Handle,
                IntPtr.Zero,
                r.Right + 10,
                r.Top - 10,
                150,
                100,
                SWP_NOACTIVATE | SWP_SHOWWINDOW
            );


            f.Visible = true; // Sinon 'Visible' reste false.
        };


        this.Controls.Add( lb );
    }
}
3
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
25 août 2006 à 11:06
Je n'ai pas testé, mais peut etre en mettant form_Panneau.Enabled = false avant le Show ? (mais même si ca marche, j'ai peur qu'en remettant Enabled à true, la form reprenne le focus...)
0
cs_Smalo Messages postés 36 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 11 décembre 2006
25 août 2006 à 11:35
à la limite j'ai meme pas besoin qu'elle soit enable.. mais bon ça marche pas avec un enable false elle prend toujours le focus..
pitin desfois je me demande si il ont pas oublié des fonctions dans ce framework pfff..
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
25 août 2006 à 14:14
Disons aussi que ce tu cherches a faire est un peu "tordu" : ouvrir une fenêtre mais empêcher l'utilisateur de s'en servir...

La aussi je n'ai pas testé, mais est qu'en mettant form_Panneau.Show(this); ca arrange les choses ?
Je ne sais pas ce que tu veux faire, mais peut être qu'en passant par des forms MDI ca marcherai mieux ? (la form "surgissante" étant une form fille, elle ne devrait pas provoquer de "flash" sur la form mère...)
0

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

Posez votre question
cs_Smalo Messages postés 36 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 11 décembre 2006
25 août 2006 à 15:30
j'ai toujours le chic de faire des trucs 'tordus' :p
en fait je veux afficher un panneau d'information... je pourrais le faire avec un userControl.. mais en fait je le fais avec une Form pour
profiter d'une ombre et de la tranparence... j'ai essayé de déclarer ma form principale mdi et et ensuite indiqué la form surgissante en form fille..
mais la form ne s'affiche pas..
j'ai fais ça :

form_PanneauBilan.Location = coordEcran;
form_PanneauBilan.MdiParent = Pack1.Form1.formCourante;
form_PanneauBilan.Show();

ps : le Show(this) .. ça ne change rien avec ou sans mdi..




 
0
cs_Smalo Messages postés 36 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 11 décembre 2006
28 août 2006 à 12:05
Je te remercie !! ça marche très bien!
Ps : Si tu connais des bons tutoriaux sur les possibilités que donne l'utilisation de l'API Win32
genre avec la liste des constantes et tout.. je suis prenneur..
Merci encore!
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 août 2006 à 12:48
La doc pour l'API Win32 c'est la MSDN mais il n y a pas vraiment de tutorial, avec le temps on finit par connaître les fonctions les plus utiles.. Les constantes tu les trouves dans les fichiers headers ( *.h ) du C/C++.
0
Rejoignez-nous