Jump to content
GSForum - Segélyvonal

Program átírása Visual C-re


Recommended Posts

Posted

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.

Posted

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

 

Ezeket majd neked kell kasztolni.

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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:

Posted

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

Posted

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?

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