SousClassement d'un controle ne marche pas ! [Résolu]

Signaler
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Comment est-tu sûr que SubClassProc n'est pas appelée?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Là est bien le problème ! si je ne caste pas, erreur de compil...
si je caste, warning seulement mais rien ne s'affiche.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
OK je vais essayer ça, et reprendre depuis le début, y'a quelquechose qui m'echappe certainement.
Merci pour ton interet, vecchio56.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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.