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
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Forum
ALGORITHMESALGORITHMES par whayoub
Cliquez pour lire la suite par whayoub
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|