Sous classement foireux

HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 12 févr. 2006 à 16:19
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 15 févr. 2006 à 19:42
Mon sous classement n'a pas l'air de fonctionner correctement, je
voudrais receptionner le message WM_MOVING lors du déplacement de ma
fenêtre.

Voila le code :



//Déclaré dans la zone "public" de ma classe TForm1.

static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);



//Handle de l'ancienne procédure de traitement des messages, déclaré en global.

long int hWndProc;



//Déclaré à l'initialisation de ma Form.

hWndProc = SetWindowLong(Application->Handle, GWL_WNDPROC, (LONG)WindowProc);



LRESULT CALLBACK TForm1::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch (uMsg)

{

case WM_MOVING :


return 0;

default :


return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

}



Je ne reçoit jamais le WM_MOVING quand je déplace ma fenêtre, voici le
log du paramètre uMsg une fois le sous classement activé :

70, 71, 70, 70, 28, 127, 127, 127

2 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
12 févr. 2006 à 17:38
Salut,
Tu ne devrais pas appeler DefWindowProc dans ta procedure,
mais appeler la WndProc suivante (c'est a dire: appeler hWndProc
avec CallWindowProc()).
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
15 févr. 2006 à 19:42
Merci aardman pour ta réponse, j'ai modifié le code mais j'ai encore un problème, voici le nouveau code :

//Déclaration dans la section Private de la class TForm1.
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static WNDPROC WndProc;

//Code à l'initialisation de ma Form.
WndProc = (WNDPROC)SetWindowLong(Application->Handle, GWL_WNDPROC, (LONG)WindowProc);

//La nouvelle fonction de traitement des messages de la fenêtre.
LRESULT CALLBACK TForm1::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Form1->RichEdit1->Text = Form1->RichEdit1->Text + uMsg + "\r\n";
switch (uMsg)
{
case WM_MOVING :
return 0;
default :
return CallWindowProc(WndProc, hwnd, uMsg, wParam, lParam);
}
}

J'obtiens les erreurs suivantes :
[C++ Error] Unit1.cpp(277): E2034 Cannot convert 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(277): E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *,unsigned int,unsigned int,long)')

C'est peut être une erreur du a la porté des variables, je suis pas très a l'aise avec cette notion.
Quand on déclare une variable dans la section private d'une class comme c'est le cas ici, elle est visible uniquement dans cette class, et quand on déclare une variable dans la section public de cette class, elle est visible à l'exterieur de la class, je me trompe ?
Quand à la notion "static" ça veux dire que la variable ne peut être modifiée, on passe en fait une copie de la variable ? j'aimerai des explications parce que je suis paumé...
0
Rejoignez-nous