Accueil > Forum > > > > class-classing ?
class-classing ?
jeudi 18 août 2005 à 11:59:00 |
class-classing ?

Clem
|
Bonjour,
je développe actuellement un petit programme en C (raisons personnelles
pour ce
choix), et jai besoin de rajouter une option sur la contrôle de base
"static", j'ai tout de suite pensé au sub-classing, mais il ne pointe
que vers un seul contrôle à la fois, j'ai donc recherché sur
RegisterClassEx/UnregisterClass/GetClassInfoEx pour modifier la classe
elle même, et pointer vers ma fonction, jusque la pas de problèmes,
seulement comme je n'ai pas envie de recoder tout le static pour une
petite fonctionnalité en plus, je pensais que dans ma fonction je
pourrais faire mon code, et puis apeller la vraie fonction si la
commande ne correspond pas a ma fonctionnalité rajoutée. Bon un code
vaut mieux qu'un long discours, même s'il n'est pas commenté il est
d'une simplicité enfantine :
enhanced_ctrls.c
#include "enhanced_ctrls.h"
ENHANCEDCTRL EnhancedCtrls[];
LRESULT CALLBACK EnhancedStatic_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
//WM_NCCREATE (129) first, and last WM_NCDESTROY (130)
int i;
for (i=0; EnhancedCtrls[i].NewWndProc==EnhancedStatic_WndProc; i++) break;
//EnhancedCtrls[i].OldWndProc(hWnd,
Msg, wParam, lParam); //ça m'aurait étonné, mais j'ai quand même
essayer...la WndProc des static serait elle virtuelle ?
return CallWindowProc(EnhancedCtrls[i].OldWndProc, hWnd, Msg, wParam, lParam);
//return DefWindowProc(hWnd, Msg, wParam, lParam);
}
ENHANCEDCTRL EnhancedCtrls[]={
{EnhancedStatic_WndProc, NULL, "static", "static"},
{NULL, NULL, NULL, NULL}
};
BOOL InitEnhancedCtrls() {
WNDCLASSEX WndClassEx1, WndClassEx2;
HINSTANCE hInstance=GetModuleHandle(0);
memset(&WndClassEx2, '\0', sizeof(WndClassEx2));
WndClassEx2.cbSize=sizeof(WndClassEx2);
WndClassEx2.style=CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
WndClassEx2.hInstance=hInstance;
WndClassEx2.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
int i;
for (i=0; EnhancedCtrls[i].NewWndProc; i++) {
GetClassInfoEx(hInstance, EnhancedCtrls[i].OldName, &WndClassEx1);
EnhancedCtrls[i].OldWndProc=WndClassEx1.lpfnWndProc;
WndClassEx2.lpszClassName=EnhancedCtrls[i].NewName;
WndClassEx2.lpfnWndProc=EnhancedCtrls[i].NewWndProc;
if (!UnregisterClass(EnhancedCtrls[i].OldName, hInstance)) return FALSE;
if (!RegisterClassEx(&WndClassEx2)) return FALSE;
}
}
enhanced_ctrls.h
#include "windows.h"
typedef struct {
WNDPROC NewWndProc; //la WndProc qui remplacera
WNDPROC OldWndProc; //la WndProc ancienne, appelée depuis la nouvelle eventuellement
char * OldName; //l'ancien nom de la classe
char * NewName; //le nouveau nom, le nom ne semble
pas poser de problèmes l'erreur renvoyée par RegistrerClassEx
} ENHANCEDCTRL;
BOOL InitEnhancedCtrls();
comme vous vous en doutez, si je poste ici c'est que mon idée ne marche pas...
le problème est que CallWindowProc ne semble pas apeller malgré tout
l'ancienne WndProc, vu que ma nouvelle fonction reçoit un message
"WM_NCCREATE", puis juste après "WM_NCDESTROY".
Un coup de débuger m'a permis de savoir que l'adresse de la fonction
était...01460582h, impossible de débuger plus loin (kernel et donc
protégé ? j'en sais trop rien je n'ai pas l'habitude de travailler en
adresses sous windows au dela de mon code source...) mais dans ce cas,
pourquoi CallWindowProc ne fait (presque) rien ?
voilà c'était ma question du moment, si quelqu'un a la réponse, il serait gentil de venir la poster ici
je préfère être sur avant de devoir me mettre au travail de recoder
entièrement le fonctionnement d'un static... merci d'avance^^
|
|
jeudi 18 août 2005 à 12:21:19 |
Re : class-classing ?

BruNews
|
pourquoi boucle et structure ?
oldProc = SetWindowLong(....) "oldProc =" 1 seule fois et seulement SetWindowLong(...., newProc) pour les autres, chaque STATIC a la même windProc.
Tu peux différencier si besoin chaque static par son ID par GetWindowLong() avec GWL_ID dans la newProc.
ciao... BruNews, MVP VC++
|
|
jeudi 18 août 2005 à 12:52:58 |
Re : class-classing ?

Clem
|
merci de répondre, mais ça aurait été trop simple :(
tout d'abord, la structure et la boucle c'est parce que plus tard je
risque d'avoir plusieurs contrôles de base à modifier, donc je n'aurais
qu'a rajouter ça dans la liste de struct, sans avoir à copier coller
10x tout le bordel pour intercepter.
SetWindowLong oui ça aurait été possible mais comme je l'ai dis le
sub-classing je préfère taper 200 lignes de codes pour refaire un
static à ma version, plutôt que de l'utiliser. en fait je voudrait que
l'interception ce fasse de manière transparente, le subclassing
implique un SetWindowLong à chaque static créé, ce qui complique tout
d'abord parce que certaines de mes fenêtres seront dans une dll externe
au programme, donc il va falloir rajouter un paramètre a la dll
contenant l'adresse de la nouvelle WndProc, et ensuite il se retrouve
surtout que chez les static, il arrive souvent qu'elles aient l'id
IDC_STATIC (-1), et je vois donc mal comment je pourrait récupérer
l'handle de la static sachant que la fenêtre mère aura été créé en
DialogBox par ressources...
la seule solution que j'envisage et donc soit de créér de nouveaux
contrôles faits maisons, soit de réussir à intercepter les messages des
contrôles de la class, pas d'un seul contrôle à la fois...oui je sais
je suis compliqué^^
@++
Clém
|
|
Cette discussion est classée dans : static, hinstance, wndproc, enhancedctrls, wndclassex2
Répondre à ce message
Sujets en rapport avec ce message
bmp dans static [ par Arnaud16022 ]
bonjourvoila je veux mettre un bmp dans un static.dans le fichier rc ya:SniperImg BITMAP "C:/sniper.bmp"et dans le main ya (en simplifie)#include LRES
pointeur static sur fonction :) [ par luhtor ]
Certain reconnaitront surement le tutoriel en question. J'ai rajouté quelques trucs au gestionnaire d'exception, mais je bloque sur le point suivant:J
rendre un bouton ou un static text inactif ou actif a l'initialisation [ par ninouch ]
voilà j'ai initialiser mon static text et mes boutons à enabled lors de la creation de ma boite de dialogue. mais je veux pouvoir les rendre de nouve
HELP!! comment rafraichir [ par kuruma ]
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static string chemin; static int count=0; static bool se
Où passent mes tabulations... [ par Nebula ]
Bonjour, En utilisant des richedits dans une fenêtre créée avec CreateWindowEx et dont les messages sont traités avec IsDialogMessage, je me suis ape
Boite de dialogue non créée [ par melkiorlenecrarque ]
Bonjour,voici le code foireux!! c'est le code de base que j'utilse pour créer des programmes à base de boite de dialogue, il marchait tres bien avant
ma fenetre ne s'affiche pas [ par graall ]
Bonjour,j'un pb avec un code :#include LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); HWND hWnd; const HBRUSH hBackground = CreateSol
Affichage d'une image ds un static en mfc [ par xXTomTomXx ]
Salut a tous,je suis en train de créer un projet dans lequel j'ai besoin d'afficher une image dans un cadre.J'ai choisis d'utiliser un static comme ca
Sauver les pixels!! :s [ par Gendal67 ]
Bonjour à tous!Je suis en cous de création d'une application qui doit "dessiner" toute seule dans une fenêtre (tracer des fracales pour ceux qui conna
répeter une action /fonction ?? [ par hansmeier ]
//******************************************************* #include "stdafx.h" int APIENTRY WinMain(HINSTANCE hInstance,
Livres en rapport
|
Derniers Blogs
[TOOLS] NDEPEND 3 DANS VISUAL STUDIO, WAAAAAAAOU!!![TOOLS] NDEPEND 3 DANS VISUAL STUDIO, WAAAAAAAOU!!! par JeremyJeanson
NDepend passé en version 3. Comme pour toute version majeur, la version 3 a son lots de nouveautés : performances, fonctionnalités accrues . etc . Mais dans tout cela il y a la fonctionnalité qui dénote. Le petit truc qui fait que NDepend me fait dire Waa...
Cliquez pour lire la suite de l'article par JeremyJeanson [WF4] GROSSES MéPRISES EN PERSPECTIVE SUR LE KIT DE MIGRATION WF3->WF4[WF4] GROSSES MéPRISES EN PERSPECTIVE SUR LE KIT DE MIGRATION WF3->WF4 par JeremyJeanson
Comme un certain nombre de fanatiques des flux RSS, je suis avec grand intérêt les articles de la team WCF/WF et forcément l'annonce d'hier concernant un kit de migration WF3->WF4 m'a fait chaud au c½ur ;) (pour rappel, mon post au sujet de la migratio...
Cliquez pour lire la suite de l'article par JeremyJeanson RéUNION DU CLUB MOSS PARISRéUNION DU CLUB MOSS PARIS par VANNESTE Xavier
Bonjour à tous la réunion du club moss aura lieu le 15 mars 2010 à 14 heures:
14:00 - 14:05 Paris, EROL GIRAUDY + Gaetan BOUVERET + Nicolas Georgeault intro Présentateur : Pierre Erol GIRAUDY14:05 - 14:30 Paris, Worflow - visio Services - We...
Cliquez pour lire la suite de l'article par VANNESTE Xavier [WF4] ARGUMENT, QUI ES TU?[WF4] ARGUMENT, QUI ES TU? par JeremyJeanson
Quand je parle de Workflows ou d'activités (au passage, il s'agit de la même chose dans WF4 ;) ), je fais souvent la comparaison avec une méthode classique : Une activité peut avoir un retour, comme une méthode. Une activité peut avoir des arguments d'ent...
Cliquez pour lire la suite de l'article par JeremyJeanson [FAST] FORMATIONS GRATUITES EN E-LEARNING[FAST] FORMATIONS GRATUITES EN E-LEARNING par pierre
Bonjour, Quelques formations gratuites sur FAST: Developer Configuring Search UIs Presentation 37 minutes La...
Cliquez pour lire la suite de l'article par pierre
Logiciels
Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor Xlite (v 3.0 build 41150)XLITE (V 3.0 BUILD 41150)c'est un logiciel qui permet de téléphoner par Internet à l'aide d'un compte SIP pratique pour le... Cliquez pour télécharger Xlite Academy System (10.9.3.0)ACADEMY SYSTEM (10.9.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Pacmin (1.1.0)PACMIN (1.1.0)Adaptation du célèbre jeu d'arcade. Incarnez une équipe de fantômes ou de pacmans et détruisez vo... Cliquez pour télécharger Pacmin italc (1.0.9)ITALC (1.0.9)italc permet de voir ce que font les ordinateurs de votre réseau (attention : juste pour petit ré... Cliquez pour télécharger italc
|