Jump to content
GSForum - Segélyvonal

Program átírása Visual C-re


csutomi

Recommended Posts

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.

Link to comment
Share on other sites

arpsoft

Nem engedi meg az LRESULT CALLBACK deklarálását.

 

Ezeket majd neked kell kasztolni.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

csutomi

Bocs, igazad van, csak az elõzõ üzenetet fejbõl írtam és nem goldoltam át, hogy hogy van pontosan. :upsz:

 

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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))

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.

Link to comment
Share on other sites

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. ;)

De szerintem nem nagyon fog menni ez a struktúrázás dolog.

Egyszerûbb, ha horgokat akasztasz az eredeti ablakkezelõkre, mondjuk így:

 

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.

Link to comment
Share on other sites

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 :) bocs, ezt nem hagyhattam ki) benne a dolgokat.

 

:üdv:

Link to comment
Share on other sites

arpsoft

Ez rendben van, csak a mutatóra mutató mutatókkal megbonyolítva egy kicsit nehéz követni, hogy most ki kicsoda. :D

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...