C++ API Windows : sous classement de fenetre dans une classe

Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
- - Dernière réponse : s@ldon
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
- 26 sept. 2005 à 22:15
Bonjour, je cherche à créer un controle de type Edit en utilisant une
classe. Le probleme, c'est que je souhaite redéfinir la procedure
callback du controle...

J'ai ecrit cela, mais wpOrigEditProc =
(WNDPROC/SetWindowLong(hEdit,
GWL_WNDPROC, (LONG)EditProc); me change le controle en ascenseur
bizarre...



//edit.h

#ifndef CEDIT_H_

#define CEDIT_H_



#include <windows.h>



class CEdit

{

private:

HWND hEdit;

static LRESULT APIENTRY EditProc(HWND, UINT, WPARAM, LPARAM);

LRESULT Ret(HWND, UINT, WPARAM, LPARAM);

CEdit* c;

public:

WNDPROC wpOrigEditProc;

CEdit(HWND,HINSTANCE);

~CEdit();

};

#endif





//edit.cpp

#include "edit.h"



CEdit::CEdit(HWND hwnd,HINSTANCE hinst=0)

{

hEdit =CreateWindow("edit", "Texte non modifiable.\r\nVous ne pouvez \

que le lire.\r\nMais il garde la couleur du fond d'un contrôle d'édition actif.",


WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,


50, 50, 150, 150, hwnd, NULL, hinst, this);

/*wpOrigEditProc = (WNDPROC)*/SetWindowLong(hEdit,


GWL_WNDPROC, (LONG)EditProc);

c=this;

}



CEdit::~CEdit()

{

SetWindowLong(hEdit, GWL_WNDPROC, (LONG)wpOrigEditProc);

}



LRESULT CEdit::Ret(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

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

}



LRESULT APIENTRY CEdit::EditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

if (msg==WM_CREATE)

MessageBox(0,"a","e",0);

CEdit * pFen = (CEdit*) GetWindowLong(hwnd, GWL_USERDATA);

if(!pFen)

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

return pFen->Ret(hwnd, msg, wParam, lParam);

}





J'ai surement fait n'importe quoi, si quelqu'un pourrait m'éclairer sur la chose, que je puisse le programmer proprement...



Merci
Afficher la suite 

2 réponses

Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Dans EditProc, remplace return DefWindowProc() par return CallWindowProc(). Je te signale aussi que tu ne recevras jamais WM_CREATE dans EditProc car ce message est envoyé par CreateWindow() qui est appelé avant SetWindowLong()...

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
2
0
Merci
Si je fais cela, j'ai un autre probleme : le pointeur de la procedure
callback du controle edit (renvoyé par SetWindowLong) ne peut
etre utilisé dans une fonction statique... sauf si je le met en static
lui aussi, mais la, j'ai une erreur de linkage...

Je suis bloquééééééé
Commenter la réponse de s@ldon