Súgó - Keresés - Tagok - Naptár
Teljes változat: Program átírása Visual C-re
PC WORLD Segélyvonal > SZOFTVER > Programozás
csutomi
Szeretnék egy általam írt C programot átírni Visual C alá, de a 3. sornál mindig elakad. Tud valaki valami ajánlani? A problémás programrészlet a következő:

1 typedef struct
2 {
3 LRESULT CALLBACK void (*ablak) ();
4 } window;

A másik fordítónak (gcc.exe) nincsen vele semmi problémája.

Ui: csak a függvényre mutató mutató használható a programban, mert ezt lehet csak C-ben beletenni egy struktúrába.
arpsoft
Nem engedi meg az LRESULT CALLBACK deklarálását.

Ezeket majd neked kell kasztolni.
csutomi
Köszönöm a választ @arpsoft, sajnos elírtam azt a sort, helyesen így néz ki:

LRESULT CALLBACK (*ablak)();

A lényegen nem változtat, így sem működik.
Nem értettem potosan a válaszodat, erre goldoltál:
void (*ablak)();
és aztán majd a programban: ablak = (LRESULT CALLBACK) masik_fuggveny;
Mert így sem működik. Próbáltam már mindenféle képpen, egyáltalán kell az az LRESULT CALLBACK, mit gondolsz?
Egyébként a CreateWindow nevű windows utasításhoz kéne nekem.
arpsoft
A CreateWindow nem CALLBACK!
CALLBACK az a függvény, amit az oprendszer bejegyez magának, mint lp az ablak kezelő függvények. Innen tudja, hogy ha egy ablakban történik valami, akkor melyik függvény kapja az eseményt.
A CreateWindow azonban csak egy ablak objektumot hoz létre, és beregisztrálja hozzá a callback ablakkezelő függvényt.

Ebben az esetben nem kell a CALLBACK.
csutomi
Bocs, igazad van, csak az előző üzenetet fejből írtam és nem goldoltam át, hogy hogy van pontosan. blush.gif

Lényegében ablakot szeretnék létrehozni, de ahhoz, hogy úgy működjön, ahogy én szeretném, előtte regisztrálnom kell egy saját ablakosztályt, a regiszráláshoz kell a CALLBACK függvény, tehát:
WNDCLASSEX winclass;

Ennek az egyik tagja a winclass.lpfnWndProc, ez várja az általam létrehozott CALLBACK függvényt (illetve csak a címét, de mindegy), majd a regiszrálás:
RegisterClassEx(&winclass);

ui.: Legjobb lenne, ha elküldeném Neked az egészet eémailben, akkor értenéd, hogy pontosan mit szeretnék, és én sem írnám el minden sornál. Beidézném ide is, de inkább megkímélem a fórumot +324 sortól.
arpsoft
Ha jól sejtem, objektumokat akarsz struktúrákkal helyettesíteni?

Miért nem alakítod át a kódot C++-ra? Sokkal egyszerűbben tudnál vele dolgozni.
csutomi
Igen, valóban ezt szeretném.
Azért nem írom át C++-ra, mert Windows alá szoktam sima C-ben is programokat írni, és ez a függvény (mármint az általam írt, nem a CALLBACK) így használható lenne sima C-ben is és C++-ban is.

Megelőzve a következő kérdésedet, ami valahogy így hangozna, hogy ((ez nem idézet lesz, de kiírja, hogy idézet))
IDÉZET
akkor miért nem fordítom le *.obj vagy *.o-ra és úgy használom ahelyett, hogy a forráskódot próbálom átírni

Gondoltam már rá, de szeretném magát a kódot Visual sima C-ben is látni, így szerintem használhatóbb.
Másrész pedig tudom, hülyeségnek hangzik, de én jobban szeretem a sima C-t, annak ellenére is, hogy hiányoznak belőle az OOP programozáshoz szükséges dolgok, egyszerűen ezt a nyelvet logikusabbnak és következetesebbnek tartom, mint az "utódját".
A probléma tehát még mindig ugyanaz.
arpsoft
Ebben az esetben nem fogsz szép áttekinthető kódot kapni.
Szokásos C-s kód lesz, a mutatóra mutató mutatókkal. ani_wink.gif
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.
csutomi
Hmmm.
Horgokkal még nem foglalkoztam, csak hallottam róluk, de jó ötlet. Nogyon tetszik a programrészlet, amit írtál, el fog tartani egy darabig, amíg átnézem és hasznosítom, addig is köszönöm a segítséget.

Ja, ha megengedsz mégegy megjegyzést: Szerintem nem attól lesz egy program áttekinthető, hogy objektum orientált vagy hogy más nyelven írják, hanem attól, hogy valamilyen elv szerint építik fel és annak megfelelően csoportosítják (strukturálják smile.gif bocs, ezt nem hagyhattam ki) benne a dolgokat.

welcomeani.gif
arpsoft
Ez rendben van, csak a mutatóra mutató mutatókkal megbonyolítva egy kicsit nehéz követni, hogy most ki kicsoda. biggrin.gif
csutomi
Szerinted meg lehet ezzel a hurkos módszerrel azt is csinálni. hogy például az edit ablak háttere piros, a betűk színe pedig kék legyen?
Ez a tartalom egy lebutítottváltozata. A teljes változat képekkel kiegészült megtekintéséhez kérünk, kattints ide.