[ Mikky @ 21.01.2002. 21:39 ] @
ja ovo MFC programiranje stvarno ne kapiram
do sad sam radio samo preko API-ja

pitanje gde je program flow?
kad radim bez mfc-a imam lepo WinMain()
pa lepo sve vidim gde je sta, sta je deklarisano kao global a sta kao local, sta se sledece izvrsava, sta rade funkcije itd jednostavno mogu da citam kod po nekom redosledu
a ovde nemam pojma sta se desava, gde je pocetak gde kraj

ako neko od iskusnijih ima zivaca da mi objasni kako se prave programi koristeci taj famozni MFC ali bez ikakvih primera vec sustinski, sta je sustina, koja je ideja iza toga, kako to MFC smanjuje vreme izrade aplikacije i olaksava posao
[ Ivan Dimkovic @ 21.01.2002. 21:50 ] @
Ovako, MFC je objektni framework, nesto slicno OWL biblioteci (ako se neko ovde seca iste) u Borland kompajlerima.

Znaci, poenta je da se sve sto je vazno za razvoj jedne Windows aplikacije predstavi kao skup klasa (objekata) izvedenih iz neke osnovne klase, u slucaju MFC-a to je CObject

Flow programa i nije tako komplikovan, tvoja aplikacija je u stvari izvedena iz klase CWinApp odakle se kreira glavni prozor (CMainFrame) - CMainFrame je u stvari izveden iz klase CWnd (windows prozor) a CWnd je izveden iz CObject..

Sve je znaci klasno-orijentisano i nema standarnih procedura za obradu poruka, vec se poruke isto obradjuju kao poziv clanovima odredjene klase. Znaci, ti samo dodas member OnLButtonDown() i MFC framework ce pozvati bas taj member kad taj prozor dobije poruku WM_LBUTTONDOWN...

Kako MFC ubrzava rad? paaa.. sad, bas zbog toga sto imas kompletan framework za dizajn aplikacije, korisnicki interfejs, obradu poruka, document/view serijalizaciju, sve GUI alatkice windowsa (toolbari, property sheetovi, scrollbari, status barovi, itd..), internet funkcije, itd.. sve bi to ti morao da pises od nule da nemas MFC. Takodje VisualStudio ima vrlo mocnu vezu izmedju GUI objekata i tvog MFC projekta tako da ces se vrlo brzo snaci sto se toga tice...

Takodje MFC omogucava unificiran i intuitivan izgled svih aplikacija - sto smanjuje vreme ucenja/obuke korisnika za tvoj program...

Isto tako, imas dosta pomocnih klasa, kao na primer CString za efikasnu manipulaciju stringovima (MFC ima i Unicode verziju, a i thread-safe je :) ... itd...

[ Dragi Tata @ 21.01.2002. 22:03 ] @
Ako te stvarno zanima dobro objašnjenje pogledaj obavezno:

http://www.codeproject.com/useritems/mfc_architecture.asp

kao i drugi deo ovog članka na istom sajtu.
[ Mikky @ 23.01.2002. 21:41 ] @
dobri su ovi textovi kao i ceo sajt
imam jos 2 pitanja
u .h fajlovima stoje deklaracije, protipovi, konstante, definicije funkcija
u .cpp fajlovima stoje definicije funkcija, clanice klasa tj sav izvrsni kod

sad sta treba includeovati u sta
npr imam klasu CBox
neka joj se definicija nalazi u Box.h a implementacija u Box.cpp
i neka imam Main.cpp kao glavnu fajl tj entry point
dakle sta na koji nacin treba includeovati da bi bilo ono good programming practice

i jos jedno, ako u projekat ubacim novi c/c++ fajl (new cpp....insert to project) da li onda njega treba da #include-ujem u main.cpp ili ce to sve za mene da obavi vc++ cim ga dodam u projekat
[ Ivan Dimkovic @ 24.01.2002. 14:51 ] @
Pa zdrava logika kaze da u box.h(pp) deklarises klasu, na primer..


<box.h>
Code:


class CBox {
public:
  void Create(int height, int width);
  
protected:
  int iHeight;
  int iWidth;
};


A u box.cpp stavis implementacije

<box.cpp>
Code:

#include "box.h"

void CBox::Create(int height, int width)
{
  iHeight = height;
  iWidth = width;
  
  /* itd... */
}




U VC++ (ili sta vec koristis) u projekat / makefile dodas samo box.cpp a gde hoces da koristis klasu CBox samo dodas:

#include "box.h"

[ Dragi Tata @ 24.01.2002. 16:34 ] @
Citat:
Mikky:
i jos jedno, ako u projekat ubacim novi c/c++ fajl (new cpp....insert to project) da li onda njega treba da #include-ujem u main.cpp ili ce to sve za mene da obavi vc++ cim ga dodam u projekat


Nema potrebe da #include-ješ cpp fajlove. Svaki cpp koji je uključen u projekat biće preveden.

U stvari, evo kako (krajnje uprošćeno) ide proces pravljenja exe fajla.

1. Preprocesiranje. Za svaki cpp fajl u projektu izvrši se ubacivanje koda iz #include - vanih fajlova (što znači da je sa kompajlerove tačke gledišta svejedno da li koristiš #include ili prosto iskopiraš ceo sadržaj h fajla na početak cpp fajla), kao i ekspandiranje (zna li neko bolji prevod?) makroa.
2. Generisanje koda. Od svakog cpp fajla pravi se jedan obj fajl.
3. Linkovanje. Od više obj fajlova pravi se jedan exe (ili dll).

Dakle, što se tvog pitanja tiče, bitno je da zapamtiš da #include bukvalno iskopira sadržaj naznačenog fajla; nema tu ničeg "magičnog".
[ leka @ 24.01.2002. 16:47 ] @
Ma da... Ja to non-stop pricam ovde. Nasim programerima definitivno fale fundamentalna znanja iz programiranja. :(
[ Mikky @ 25.01.2002. 21:33 ] @
ok znam kako radi #include
samo mi je malo bila nejasna ta struktura fajlova u projektu

znaci ako pravim neku svoju funkciju i stavim je u .cpp a deklaraciju tj prototip u .h
i onda includujem .h u .cpp
e sad glavni .cpp fajl znaci onaj koji nosi ime programa ima include samo .h od te funkcije koju sam gore pisao tako da bi on video samo prototip funkcije ali ne i definiciju... tako da mi je bilo logicnije da includuje .cpp fajl jer je u njemu includovan .h
tako bi se u glavni cpp includovalo sve odjednom
ako me razume neko sta hocu da kazem
ali posto okruzenje kompajlira sve cpp fajlove u obj i posle ih povezuje onda nema problema
tako da sam otprilike ukapirao ;)
[ Ivan Dimkovic @ 26.01.2002. 23:46 ] @
Pa da - sa ukljucivanjem .cpp fajlova u druge fajlove bi doslo do potencijalne opasnosti od visestrukih implementacija funkcija u .obj fajlovima a onda bi ti linker zakukao ;)

Postoje odredjene okolnosti u kojima bi mogao da stavis i telo funkcije u .h fajl - naime MSVC kompajler (bar ne do verzije 6.0 koju imam) nema opciju da inline funkcije iz drugih .c(pp) fajlova koristi u drugim fajlovima. Intelov ICL kompajler to podrzava (kao -Qipo optimizacija) ali je taj proces mukotrpno spor.

Znaci, ako si napisao neku funkciju koja se mnogo puta poziva a kratka je (recimo - sin(x) a da ga nema implementiranog) pametno je tu funkciju definisati i implementirati kao inline u samom .h fajlu tako da ce biti ukljucena svuda gde treba (po .cpp fajlovima) - ili, alternativno, definisi je kao makro.