begin process at 2012 05 30 17:56:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

SousClassement d'un controle ne marche pas !


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

SousClassement d'un controle ne marche pas !

vendredi 27 octobre 2006 à 19:24:27 | SousClassement d'un controle ne marche pas !

yann_lo_san

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.

 

vendredi 27 octobre 2006 à 19:38:59 | Re : SousClassement d'un controle ne marche pas !

vecchio56

Administrateur CodeS-SourceS
Comment est-tu sûr que SubClassProc n'est pas appelée?

_____________________________________
Un éditeur de ressources gratuit pour Windows

vendredi 27 octobre 2006 à 19:45:39 | Re : SousClassement d'un controle ne marche pas !

yann_lo_san

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.

vendredi 27 octobre 2006 à 19:54:51 | Re : SousClassement d'un controle ne marche pas !

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

vendredi 27 octobre 2006 à 19:59:13 | Re : SousClassement d'un controle ne marche pas !

yann_lo_san

Là est bien le problème ! si je ne caste pas, erreur de compil...
si je caste, warning seulement mais rien ne s'affiche.

vendredi 27 octobre 2006 à 20:03:52 | Re : SousClassement d'un controle ne marche pas !

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

vendredi 27 octobre 2006 à 20:04:38 | Re : SousClassement d'un controle ne marche pas !

yann_lo_san

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...

vendredi 27 octobre 2006 à 20:07:51 | Re : SousClassement d'un controle ne marche pas !

yann_lo_san

OK je vais essayer ça, et reprendre depuis le début, y'a quelquechose qui m'echappe certainement.
Merci pour ton interet, vecchio56.

vendredi 27 octobre 2006 à 21:15:10 | Re : SousClassement d'un controle ne marche pas !

aardman

Membre Club
Réponse acceptée !
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.
vendredi 27 octobre 2006 à 21:30:53 | Re : SousClassement d'un controle ne marche pas !

yann_lo_san

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.



Cette discussion est classée dans : controle, hwnd, msg, wndproc, hwndstatic


Répondre à ce message

Sujets en rapport avec ce message

ressources et API !!!! [ par Xs ] salut !voila, pour me simplifier la tache, j'utlise les ressources pour creer une boite de dialog (sous VC++ 6).mais j'obtiens, lors de la compilation thread sur WndProc [ par kidpigeyre ] G une fonction WndProc chargé de réaliser tout mon programme (application GUI) (avec fenetre windows) et jmerai pouvoir faire un thread de cette fonct Probleme d affichage [ par Scythale ] Lorsque j'execute ce programme voici ce que dit mon compilateur(borland C++): you have accidentely use the old dummy version of OwlMain.Je n'arrive pa erreur(vc++6) [ par greg4 ] Linking...LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/fen.exe : fatal error LNK1120: 1 unresolved externalsError execut api :: SetWindowLong(hWnd, GWL_WNDPROC, Twiny::WndProc); probleme:( [ par JackosKing ] Voilà je voulais utilisé cette fonction comme on me l'avait conseillé, mais j'ai une erreure:E:\TinyShell\Twiny.cpp(56) : error C2664: 'SetWindowLongA ShowWindow [ par Nebula ] Salut à tous !Mon problème est simple, j'utilise le code suivant dans ma WndProc : switch (uMsg) { case WM_ACTIVATE: if (HIWORD(wParam) != 0) S Dll + LoadLibrary [ par Manson ] Salut,voila, j'ai fais une dll dont le code est le suivant :void __declspec(dllexport)show_msg(HWND hWnd, char *msg){ MessageBox(hWnd, msg, "Dll Powa Colorier un static : HEeeeeeeelp !!! [ par sprintjeffC ] salut @ tousje me mets a la programmation windows en C/C++ (pas VC++ merci ... quitte à faire du microsoft je préfère VB ;-). Je démarrai pas mal et t Prob WIN32 [ par AngeloVivaldi ] bonjour, voici un code ke g tapé pour mon apprentissage de la prog Graphique :#include LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, L Mélange entre C++ et Win32 [ par vecchio56 ] J'ai décidé d'encapsuler mes fenêtres dans des classes, mais je me trouve confronté à un problème: en gros je n'arrive pas à changer de WndProc en uti


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,159 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales