IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Focus or not focus


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Focus or not focus
    Bonjour,
    Je voudrais faire comme dans Excel, une fenêtre principale pour le menu et la barre d’outils et à l’intérieur une fenêtre enfant pour le classeur et quand on regarde les deux fenêtres d’Excel, elles ont l’air d’avoir toutes les deux le focus : les barres des titres des deux fenêtres sont en grisé sombre.
    De mon côté je crée une fenêtre principale et une fenêtre enfant, mais je n’arrive pas à avoir le focus sur la fenêtre enfant, la barre de titre de ma fenêtre principale est en grisé sombre tandis que celle de ma fenêtre enfant reste en grisé clair. D’ailleurs je ne reçois par exemple le message WM_KEYDOWN que lorsque j’appuie sur une touche du clavier tout en étant sur la fenêtre principale, lorsque je suis sur la fenêtre enfant je ne reçois plus de message malgré mon appui sur les touches du clavier.
    Où me suis-je donc planté SVP ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    int APIENTRY WinMain( HINSTANCE W_n0inst, HINSTANCE W_n0precinst, LPTSTR W_CmdLine, int W_cdeaffich) // entier signé (32 bits)
    {
    	n0instance = W_n0inst;
    // Enregistrement fenêtre principale
    	WNDCLASS winclassmain;
    	winclassmain.hInstance =  n0instance
    	winclassmain.lpszMenuName = Mainmenu; 
    	winclassmain.lpszClassName = nomwinclassmain; 
    	winclassmain.hIcon = NULL
    	winclassmain.hCursor = LoadCursor(NULL,IDC_ARROW);
      	winclassmain.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);  
    	winclassmain.style = CS_VREDRAW | CS_HREDRAW;
    	winclassmain.lpfnWndProc = (WNDPROC)processmainmess;
      	winclassmain.cbWndExtra = 0;  
    	winclassmain.cbClsExtra = 0 ;
    	if ( !RegisterClass( &winclassmain ) )
    	return( FALSE );
    //
    // Enregistrement fenêtre enfant
    	WNDCLASS winclassfille;
    	winclassudo.hInstance =  n0instance; 
    	winclassudo.lpszMenuName = NULL
    	winclassudo.lpszClassName = nomwinclassfille; 
    	winclassudo.hIcon = NULL; 
    	winclassudo.hCursor = LoadCursor(NULL,IDC_ARROW);
      	winclassudo.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
      	winclassudo.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
    	winclassudo.lpfnWndProc = (WNDPROC)processfillemess;
      	winclassudo.cbWndExtra = 0; 
    	winclassudo.cbClsExtra = 0;  
    	if ( !RegisterClass( &winclassfille ) )
    	return( FALSE );
    //
    	// création de la fenêtre principale
    	winmainkey = CreateWindow(nomwinclassmain, titrewinmain, WS_CAPTION | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, largeurmain, hauteurmain, NULL, NULL, n0instance, NULL); 
    	if ( !winmainkey ) return( FALSE );
    	ShowWindow( winmainkey, W_cdeaffich ); // 
    	UpdateWindow( winmainkey ); //
    //
    	while(GetMessage( &message, NULL, 0, 0))
    	{
    		TranslateMessage( &message ); 
    		DispatchMessage( &message ); 
    	}
    	return message.wParam;
    }
    LRESULT CALLBACK processmainmess( HWND winmainkey, UINT IDMsg, WPARAM wParam, LPARAM lParam )
    {
    	// datas
    	{
    		case WM_CREATE :
    // Initialisations
    			break;
    		case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case IDM_NEW:
    					winfillekey = CreateWindow(nomwinclassfille, NULL, WS_CHILD | WS_OVERLAPPEDWINDOW, 0, filletop, fillemaxsanstitre, fillemaxsanstitre+hauteurtitre, winmainkey, (HMENU)(INT)ID_fille, n0instance, NULL); 
    					if ( !winfillekey ) return( FALSE );
    					ShowWindow( winfillekey, SW_SHOWDEFAULT ); 
    					//UpdateWindow( winfillekey ); //
    					SetFocus(winfillekey); // avec ou sans c’est pareil
    				break;
    			}
    		case WM_CLOSE :
    			DestroyWindow( winmainkey );
    			break;
    		case WM_DESTROY :
    			PostQuitMessage(0);
    			break;
    		case WM_QUERYENDSESSION :
    			DestroyWindow( winmainkey );
    			break;
    		default :
    			return DefWindowProc( winmainkey, IDMsg, wParam, lParam );
    	};
    	return 0;
    }
    Par contre le double clic sur la fenêtre enfant fonctionne !
    A noter comme je l'ai indiqué en commentaire que je mette ou pas l'instruction SetFocus le résultat est le même

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Salut Arthur,

    pour ce genre d'appli, il me semble que ta fenêtre principale doit être de type MDI (Multiple Document Interface) et tu ne devrais plus avoir ce genre de problèmes (à confirmer par un expert).
    Je n'ai jamais créé ce type d'application mais d'après la doc msdn, il faut que tu passes "MDICLIENT" pour le paramètre lpClassName de la fonction CreateWindow (avec de préférence le style WS_CLIPCHILDREN pour éviter que la fenêtre parent ne repeigne par dessus la/les fenêtre(s) enfant(s)).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Focus or not
    Merci pour le tuyau, j'ai jeté un oeil sur ton lien msdn, ça m'a l'air effectivement assez complexe. Je vais prendre un peu de temps pour regarder ça à tête reposée. Si je ne m'en sors pas, j'avais pensé à une solution de dernier recours pour récupérer les messages WM_KEYDOWN dans la fenêtre enfant, mais jusqu'à présent je n'ai pas voulu l'utiliser car je ne la trouve pas très élégante, solution qui consisterait à faire un HOOK provisoire du clavier dans la callback de la fenêtre enfant.
    Cordialement,

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/07/2013, 21h42
  2. [focus] Passer le focus à l'élément suivant
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/05/2006, 22h02
  3. [Focus] changer le focus sur "entree"
    Par sylvain_2020 dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 16/12/2004, 19h07
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. focus en C
    Par killpilot dans le forum C
    Réponses: 8
    Dernier message: 19/04/2002, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo