Ebben az esetben nem fogsz szép áttekinthető kódot kapni.
Szokásos C-s kód lesz, a mutatóra mutató mutatókkal.

De szerintem nem nagyon fog menni ez a struktúrázás dolog.
Egyszerűbb, ha horgokat akasztasz az eredeti ablakkezelőkre, mondjuk így:
KÓD
static char* szProcStruct="ProcStruct";
long FAR PASCAL MyNewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
void NumEditOn(HWND hwnd,HINSTANCE hInst)
{
HANDLE hProcStruct;
PPROCSTRUCT pprocstruct;
if(hwnd)
{
if(GetProp(hwnd,szProcStruct)==NULL)
{
hProcStruct=LocalAlloc(LHND,sizeof(TPROCSTRUCT));
pprocstruct=(PPROCSTRUCT)LocalLock(hProcStruct);
(pprocstruct->NewWndProc)=MakeProcInstance((FARPROC)MyNewWndProc,hInst);
(pprocstruct->DefWndProc)=(FARPROC)SetWindowLong(hwnd,GWL_WNDPROC,
(LONG)(pprocstruct->NewWndProc));
LocalUnlock(hProcStruct);
SetProp(hwnd,szProcStruct,hProcStruct);
}
}
}
void NumEditOff(HWND hwnd)
{
HANDLE hProcStruct;
PPROCSTRUCT pprocstruct;
if(hwnd)
{
hProcStruct=RemoveProp(hwnd,szProcStruct);
if(hProcStruct)
{
pprocstruct=(PPROCSTRUCT)LocalLock(hProcStruct);
SetWindowLong(hwnd,GWL_WNDPROC,(LONG)(pprocstruct->DefWndProc));
FreeProcInstance(pprocstruct->NewWndProc);
LocalUnlock(hProcStruct);
LocalFree(hProcStruct);
}
}
}
long FAR PASCAL MyNewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
BOOL bNum=TRUE;
HANDLE hProcStruct;
FARPROC WndProc;
PPROCSTRUCT pprocstruct;
if(message==WM_CHAR)
{
char ch=(char)wParam;
switch(ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '.': bNum=TRUE;
break;
default: if(ch>31)
bNum=FALSE;
}
}
if((message==WM_CHAR)&&(wParam==13))
wParam=10;
if(bNum)
{
hProcStruct=GetProp(hwnd,szProcStruct);
pprocstruct=(PPROCSTRUCT)LocalLock(hProcStruct);
WndProc=pprocstruct->DefWndProc;
LocalUnlock(hProcStruct);
return CallWindowProc((WNDPROC)WndProc,hwnd,message,wParam,lParam);
}
return 0;
}
Ezzel nem hozol létre új ablakkezelőt, de megváltoztathatod a vezérlők vagy ablakok működését. Jelen esetben csak számokat, negatív előjelet és pontot fogadunk el a bevitel során.
A kiegészítést a NumEditOn kapcsolaj be, a NumEditOff pedig ki. A hwnd mindig az érintett vezérlő HWND-je, a hInst pedig a programpéldány azonosítója.
A horgokat manuálisan fel kell szabadítani, mielőtt kilépsz.
A fenti kód Borland C-ben készült.