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
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|