SousClassement d'un controle ne marche pas !

Résolu
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 27 oct. 2006 à 19:24
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 27 oct. 2006 à 21:30
Voilà, impossible de sousClasser un controle static
J'oublie peut etre quelque chose ?
Erreurs : CAST WNDPROC ou Nouvelle WndProc zappée
Si vous avez des infos, je suis preneur !

La partie du code buggé :

HWND hWndStatic;
WNDPROC oldProc;
// Création d'un controle static
hWndStatic = CreateWindow("STATIC" ,"staticControl",
                    WS_CHILD|WS_VISIBLE|SS_OWNERDRAW,
                    Xpos, Ypos, cxTaille, cyTaille,
                    hWndParent, NULL, hInstModule, NULL);
// Sous-classe le static
oldProc = (WNDPROC)SetWindowLongPtr(hWndStatic, GWL_WNDPROC, (LONG_PTR)SubClassProc);



// La nouvelle WNDPROC


LRESULT CALLBACK SubClassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
     // MSG a traiter ici
     if( msg == WM_DRAWITEM )
    {
       // dessine ici
       return TRUE; 
    } 



    // Msg non traités ici

    return(CallWindowProc(oldProc, hWnd, msg, wParam, lParam)); 
}



// A la fin, romp le sous-classement et detruit le static

SetWindowLongPtr(hWndStatic, GWL_WNDPROC, (LONG_PTR)m_oldProc);
if( m_hWndStatic ) DestroyWindow(m_hWndStatic);




Merci d'avance pour votre aide.


 

9 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 19:54
Je n'ai pas compris: erreur de compilation ou pas?
Je pense que ton SetWindowLong et correct (tu ne dois pas caster en DWORD, sinon ca ne marchera pas si jamais tu le portes un jour en 64-bit)

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 20:03
Le warning est normal.
Par contre, mets autre chose dans SubClassProc pour tester. Par exemple, une solution bien bourrin:

LRESULT CALLBACK SubClassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    ExitProcess(0);
    return 0;
}
_____________________________________
Un éditeur de ressources gratuit pour Windows
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 oct. 2006 à 21:15
Salut,

Je vois que dans ton sous classement tu tentes d'intercepter
WM_DRAWITEM. A moins que ton static ai une/plusieurs fenêtres filles,
ca n'a pas vraiment d'interet. Si tu met le style SS_OWNERDRAW à un
static, c'est la
fenetre parente du static qui recoit les WM_DRAWITEM, pas le static lui
même.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 oct. 2006 à 19:38
Comment est-tu sûr que SubClassProc n'est pas appelée?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 oct. 2006 à 19:45
Et bien quant je caste le WNDPROC en (DWORD) pour lever cette erreur, rien ne s'affiche.
ps : j'ai fait un test de tout le code sans le subClassing (avec WM_DRAWITEM dans la main_WNDPROC) et le static s'affiche bien.
Donc a mon avis, je ne récupère pas la bonne adresse. Mais je sais pas comment.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 oct. 2006 à 19:59
Là est bien le problème ! si je ne caste pas, erreur de compil...
si je caste, warning seulement mais rien ne s'affiche.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 oct. 2006 à 20:04
Je viens de voir qu'il faut vérifier si STRICT est défini, si non on utilise FARPROC,  [int (*FARPROC)(void)]   mais pour moi ça change rien...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 oct. 2006 à 20:07
OK je vais essayer ça, et reprendre depuis le début, y'a quelquechose qui m'echappe certainement.
Merci pour ton interet, vecchio56.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 oct. 2006 à 21:30
Et oui aardman, je viens aussi de trouver que ma subClassProc ne recevait que WM_NCPAINTet WM_PAINT, voilà le pourquoi du comment.
Mais oui ça à un interet si tu veux faire une classe complete qui fait
un graphique à barres par exemple.
c'est ce que je fais. le client n'a à s'occuper de rien,
donner son hwnd fenetre et le rect ou dessiner.
La classe s'occupe de créer le static aux coords données et de dessiner ce qu'elle veut.
Mais y'a surement d'autres façons de faire et pour ça, je vous fais confiance.
0
Rejoignez-nous