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 :

WinAPI - récevoir message mis à un certain contrôle


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut WinAPI - récevoir message mis à un certain contrôle
    saluts,

    nous sommes débutants dans la langage C. nous sommes brésiliens, donc le notre français peut n'être pas très bon (mais nous essayons d'écrire avec clarité).
    comme est-ce que nous pouvons récevoir quelque message (comme WM_LBUTTONDOWN ou WM_MOUSEMOVE) qu'a été mis à quelque objet dans la boîte de dialogue (comme un BUTTON, un STATIC, etc). il y a la fonction WndProc pour les dialogues et fenêtres, mais comme le faire pour autres genres de contrôle?
    par exemple, si nous voulons faire un effet de "mouse move" dans un "button", ou une action de click dans un "editbox"?

    saluts,

  2. #2
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    D'abord bienvenue sur Developpez.net et félicitation pour votre français : Le jour ou j'écrirais aussi bien en portugais, je serais très fier.

    Pour répondre à la question posée, il y a plusieurs façons de faire. Notament en fonction de l'environement de développement utilisé.
    Dans tous les cas, il y a une façon très simple que Microsoft appelle "Windows subclassing" (voir le dernier exemple).

    Pour comprendre, il faut savoir que les contrôles (boutons, edits etc.) d'un dialogue sont également des fenêtres avec leur propre WinProc spécifique.

    Dans l'exemple qui suit, je remplace la WinProc de l'edit IDC_EDIT1 en récupérant l'adresse de l'ancienne WinProc.
    Ma WinProc traite alors uniquement les messages dont le comportement doit être modifié. Pour tous les autres messages, je transfère à l'ancienne WinProc.

    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
    WNDPROC OldEditProc;
    LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	if (message==WM_LBUTTONDOWN ) {
    		// Faire le travail
    		ShowWindow(hwnd, SW_HIDE);
    		return 0;
    	}
    	// Appeler la procédure originale pour les autres messages
    	return CallWindowProc(OldEditProc, hwnd, message, wParam, lParam);
    }
    INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		OldEditProc= (WNDPROC) SetWindowLong(GetDlgItem(hDlg, IDC_EDIT1), GWL_WNDPROC, (LONG)EditProc);
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    saluts,

    merci pour la réponse!
    nous avons essayé avec le code suivant:
    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
    WNDPROC OldProc;
    LRESULT APIENTRY EditProc(HWND, UINT, WPARAM, LPARAM);
    ...
    long _stdcall EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	if (message==WM_SETFOCUS) {
    		MessageBox(0, "", "", 0);
    		return 0;
    	}
    	return CallWindowProc(OldProc, hwnd, message, wParam, lParam);
    }
    
    long _stdcall zzz(HWND w, UINT x, WPARAM y, LPARAM z)
    { 
    	switch (x) {
    	case WM_INITDIALOG:
    	{
    		HWND edit = GetDlgItem(b, 4007);
    		OldProc = (WNDPROC)SetWindowLong(edit, GWL_WNDPROC, (LONG)EditProc);
    mais le problème est avec OldProc = (WNDPROC)SetWindowLong(edit, GWL_WNDPROC, (LONG)EditProc);: l'OldProc obtient, après la fonction SetWindowLong, le valeur 0. et, avec GetLastError, nous avons vu qu'il y a l'erreur 1400, "invalid window handle".
    qu'est-ce qu'il y a de faux avec le HWND "GetDlgItem(b, 4007)", dans lequel 4007 est l'ID d'un edit (dans un dialogue des ressources)?

    merci d'avance,

  4. #4
    Membre chevronné Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Par défaut
    Le problème vient probablement du handle de la dialog.

    Dans l'appel à la fonction SetWindowLong, vous utilisez une variable b qui provient visiblement d'ailleurs.
    Je suppose que zzz est la DlgProc du dialog, il faut donc remplacer b par w dans l'appel à SetWindowLong.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    Citation Envoyé par pascal.barbier Voir le message
    Le problème vient probablement du handle de la dialog.

    Dans l'appel à la fonction SetWindowLong, vous utilisez une variable b qui provient visiblement d'ailleurs.
    Je suppose que zzz est la DlgProc du dialog, il faut donc remplacer b par w dans l'appel à SetWindowLong.
    ça fonctionne. merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2008, 19h03
  2. Comment afficher un message pendant un certain temps ?
    Par potili2 dans le forum Débuter
    Réponses: 4
    Dernier message: 16/01/2008, 12h08
  3. Message d'alerte Les contrôles ActiveX
    Par Jean-Pierre49 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/12/2007, 10h43
  4. [C#/VB.Net]Afficher message lorsque souris survole contrôle
    Par guillaume16 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/03/2006, 12h44
  5. Intercepter les messages émis par WordApplication
    Par Claude Animo dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 11/07/2005, 21h23

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