Annuler la prise de focus d'une Form 'surgissante' [Résolu]

cs_Smalo 36 Messages postés lundi 3 janvier 2005Date d'inscription 11 décembre 2006 Dernière intervention - 24 août 2006 à 21:10 - Dernière réponse : Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention
- 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....
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 25 août 2006 à 21:30
3
Merci
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 );
    }
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Lutinore
Nikoui 794 Messages postés vendredi 24 septembre 2004Date d'inscription 19 août 2008 Dernière intervention - 25 août 2006 à 11:06
0
Merci
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...)
Commenter la réponse de Nikoui
cs_Smalo 36 Messages postés lundi 3 janvier 2005Date d'inscription 11 décembre 2006 Dernière intervention - 25 août 2006 à 11:35
0
Merci
à 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..
Commenter la réponse de cs_Smalo
Nikoui 794 Messages postés vendredi 24 septembre 2004Date d'inscription 19 août 2008 Dernière intervention - 25 août 2006 à 14:14
0
Merci
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...)
Commenter la réponse de Nikoui
cs_Smalo 36 Messages postés lundi 3 janvier 2005Date d'inscription 11 décembre 2006 Dernière intervention - 25 août 2006 à 15:30
0
Merci
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..




 
Commenter la réponse de cs_Smalo
cs_Smalo 36 Messages postés lundi 3 janvier 2005Date d'inscription 11 décembre 2006 Dernière intervention - 28 août 2006 à 12:05
0
Merci
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!
Commenter la réponse de cs_Smalo
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 28 août 2006 à 12:48
0
Merci
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++.
Commenter la réponse de Lutinore

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.