Forum.hr

Natrag   Forum.hr > Informatička tehnologija > Softver
Korisničko ime
Lozinka

Softver O programima koje koristite ili namjeravate koristiti

Odgovor
 
Tematski alati Opcije prikaza
Old 14.01.2003., 22:50   #1
TomK
Registrirani korisnik
 
Registracija: Dec 2002.
Postova: 1,993
Moja prva MFC aplikacija

Ovaj topic otvaram najprije zbog Ivice Loncara, ali i ostalih koji su zainteresirani za MFC. Dajem opis najjednostavnija MFC win aplikacije. Okruzenje koje sam koristio je VisualStudio

Za Ivicu: ovo nije ono sto si trazio, jer sam mislio da je vaznije razumjeti osnovne principe, ali ako je ovo za tebe suvisno, nastavljamo odmah sa primjerom kako uhvatiti poruku koju salje sistem kada misem kliknemo, te kako ispisati koordinate ili slicno u prozoru.

////////////////////////////////////////////////////////////

Startaj VisualStudio6.0. i napravi ovo:

1. klikni na new -> projects tab -> win32 application i daj ime projektu, npr MyFirstWin (mozda nije prvi , ali nema veze:))
2. klikni ok
3. klikni finish
4. klikni ok

Oprosti ako je ovaj pocetak gnjavaza, ali mislio sam da nije lose da idem ispocetka i sve korake.
Projekt je otvoren. Otvori "project" Menu -> settings -> General tab -> Microsoft Foundation Classe i izaberi "Use MFC in a Shared dll".
Ovo je veoma vazan korak i nesmije se zaboraviti.

Sad kreiraj jedan .cpp file ovako:
File Menu -> New -> Files Tab -> Slektiraj C++ source file i daj ime, npr. mainWin

Otvorio se prazan .cpp file. sada valja nesto i isprogramirati. Ali najprije nekoliko objasnjenja:
1. Da bi program bio Win program (application) treba nam jedan objekt koji ce predstavljati Aplikaciju u sistemu!
Taj aplikacijski objekat ce predstavljati aplikaciju u cjelini i u sebi ce imati sav funkcionalitet jedna
aplikacija treba imati. Najveci dio je vec isprogramiran u base klasama, tako da mi trebamo kreirati
vlastiti klasu koja nasljedjuje od "Aplikacijske klase" koja je vec u MFC-u, i onda tu nasu aplikacisjku (derived)
klasu trebamo inicijalizirati prema vlastitoj potrebi.
2. Treba nam i jedan prozor u koji ce biti "vidljivi" dio aplikacije (Aplikacija moze biti aplikacija, cak i ako ne
kreira ni jedan vindow, ali nama ipak treba jedan prozor da vidimo da je aplikacija "ziva" i da se izvrsava)
To znaci da treba kreirati jednu klasu koja ce naslijediti od "window MFC" klase koja je vec tu u MFC-u, u sebi sadrzi
sav funkcionalitet jedan window ima u sebi, a onda mi samo trebamo napraviti jednu klasu koja nasljedjuje od te
"Window klase" i prilagoditi je (dodati funkcionalitet) prema vlastitoj potrebi. Ovo je vazno: kada se
program starta, on je ucitan u memoriju i procesor mu dodjeljuje svoje vrijeme. Ali mi aplikaciju ne vidimo. Da bi
vidjeli da se aplikacja izvrsava i sta radi, mi trebamo kreirati jedan window objekt koji ce biti "prozor od aplikacije" i
u kojemu cemo prikazivati to sto aplikacija radi (od tuda je ima "window" - prozor u aplikaciju)
I to je uglavnom to.
sada slijedi kod sa komentarima.



#include "afxwin.h" // .h file koji sadrzi deklaracije MFC klasa! Ovo uvijek na pocetak!


// naprije napravimo window klasu koja ce predstavljati "prozor u aplikaciju", odnosno, window na ekranu

class CMainWindow:public CFrameWnd // CFrameWnd je MFC klasa koja sadrzi sve sto window treba. Zato nasljedjujemo od nje
{
public:
CMainWindow();
protected:
afx_msg void OnPaint(); // deklariramo funkciju koju ce MFC framework pozvati kad se prozor treba update
DECLARE_MESSAGE_MAP() // deklarisemo array koji ce sadrzavati adrese funkcija koje ce se pozivati
// kao odgovor na poruke od windows sistema
};

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) // ovdje kazemo: WM_PAINT poruka (update window) neka se posalje funkciji OnPaint()
ON_WM_PAINT()
END_MESSAGE_MAP()

CMainWindow::CMainWindow() // konstruktor Windowa
{
Create(NULL,_T("Moj prvi MFC program")); // Ovdje mi naredjujemo sistemu: napravi prozor u sistemu, a
// nasa CMainWindow klasa ce ga zastupati (sa svojim funkcionalitetom)
}


void CMainWindow::OnPaint() // funkcija se poziva kada stigne WM_PAINT poruka - update window
{
CPaintDC dc(this); // kreiramo virtualnu plocu za crtanje (device context)
CRect rect; // kreiramo objekt koji predstavlja pravougaonik
GetClientRect(&rect); // u taj objekt snimamo trenutnu velicinu prozora

dc.DrawText(_T("Hallo MFC world"), -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); // ovdje kazemo:
// ispisi tekst i pozicioniraj ga u sredinu.

}



// sada nam treba objekat koji ce predstavljati aplikaciju
class CMyApp:public CWinApp // CWinApp sadrzi sve sto nam treba da upravljamo aplikacijom. Zato je to base class
{
public:
virtual BOOL InitInstance(); //samo samo da inicijaliziramo aplikaciju. Zato cemo ovu funkciju override
};

BOOL CMyApp::InitInstance() // ovdje se aplikacija inicijalizira
{
m_pMainWnd = new CMainWindow; //treba nam jedan prozor! kreiraj ga
m_pMainWnd->ShowWindow(m_nCmdShow); // pokazi taj prozor
m_pMainWnd->UpdateWindow(); // update prozor odmah na startu
return TRUE;
}


// na kraju, kreirajmo jedan objekat koji predstavlja aplikaciju.
CMyApp theApp;

I to je to.
Sad sve to kompajliramo, linkajmo i startajmo. Trebao bi se pojaviti prozor sa tekstom.

Izgleda komplicirano? Mozda za pocetak, ali u ovome malom programu je sazet cijeli koncept MFC programa. Zato je od presudne vaznosti da programer-pocetnik u MFC razumije sto se ovdje desava, prije nego sto nastavi dalje.

I na kraju, znam da mnogi na forumu ne vole MFC, i to je sasvim o.k. Ono sto bih ja htio je da to to ne komentiramo u ovome topicu, nego da ovdje pisu postove samo oni koji su zainteresirani da nesto nauce o MFC. Ako se pokaze da nema zainteresiranih za ovaj Topic, onda nista, gasimo ga.
A ako bude zainteresiranih, onda bih u sljedecem postu pokusao objasniti detaljnije sto je aplikacijski objekat i zasto je vazan, kao i to sto je window objekat i kako je on to "prozor kroz koji gledamo u aplikaciju".

A dali je Delphi bolji od MFC, ostavimo to za neki drugi topic.

Lijepi pozdravi

Zadnje uređivanje TomK : 15.01.2003. at 09:23.
TomK is offline  
Odgovori s citatom
Old 15.01.2003., 14:59   #2
Ivica Lončar
Registrirani korisnik
 
Registracija: Dec 2002.
Lokacija: Varaždin
Postova: 84
Javim se kad isprobam

usput, nisam imao na umu takve detalje. Mislio sam krenuti od onog što ti izgenerira AppWizard. Razumijem logiku klasa koje čine framework (CApp, CFrameWnd, CSingleDocTemplate, CMultiDocTemplate, CDocument, CView itd.). Onaj dio koji mi je falio je povezivanje događaja i koda, ali i to sam sad shvatio (Ctrl + W).

Isprobat ću ovo što si mi predložio, možda kreiram još koji Thread i vidim ponašanje.

Ako imaš vremena daj mi radije opiši kreiranje sadržaja Document klase. Može neki jednostavniji primjer.

Pozdravljen!
Ivica Lončar is offline  
Odgovori s citatom
Old 16.01.2003., 11:31   #3
TomK
Registrirani korisnik
 
Registracija: Dec 2002.
Postova: 1,993
Ok.
Ja sam i sam bio u dilemi dali ovako zapoceti, i dobro je da si me odmah upozorio na nepotrebne detalje (barem za tebe ).

Evo jedan mali primjer: Zelis napraviti MFC program uz pomoc Wizarda, a koji na ekranu ispise koordinate na mjestu gdje kilknes sa misem!

Pod pretpostavkom da si generirao projekat koji podrzava Document/View, dodaj ovo:

U Document klasi cuvamo podatke. U nasem slucaju je to koordinate gdje je mis kliknuo. Za taj zadatak cuvanja koordinata je najprikladnije koristiti objekat CPoint klase (iz ocitih razloga). Zato u Documentu (headeru, naravno) dodamo jednu member variablu tipa CPoint ovako:

private:
CPoint pMousePosition;

posto je variabla private (moze biti i public, ali je to los programerski stil), dodajemo i ovo:

public:
void SetMousePosition(CPoint point);
CPoint GetMousePosition();

Nakon toga u Document-ovom .cpp implementiramo gore navedene funkcije ovako:

void ImeDokumenta::SetMousePosition(CPoint point)
{
pMousePosition = point;
}

CPoint ImeDokumenta::GetMousePosition()
{
return pMousePosition;
}

Ovo ImeDokumenta je naravno ime dokument klase u tvojoj aplikaciji.

Sljedece sto trebamo uraditi je napisemo handler funkciju za ON_WM_LBUTTONDOWN poruku. To mozes uraditi uz pomoc wizarda (sto si vec otkrio kako). Handler naravno treba biti u View klasi. Sada samo nedostaje code u handleru (pojednostavljeno. Sto funkcija da uradi nakon sto bude pozvana od strane frameworka kao odgovor na klik misem). A code je ovaj:
.... U View klasi se nalazimo, u gore navedenom handleru

GetDocument()->SetMousePosition(point);
Invalidate();

GetDocument() vraca pointer na dokument. Kad njega imamo, pozovimo nasu funkciju SetMousePosition(point). point je argument koji framework posalje handleru (funkciji) kad je pozove kao odgovor na klik misem, a sam point sadrzi poziciju misa u trenutku kad se klik dogodio.

Invalidate() forsira view da se ponovo iscrta, sto znaci da OnDraw() funkcija u View klasi biva pozvana automatski. Zato sada idemo tamo i dodajemo sljedeci code:

CPoint point = pDoc->GetMousePosition();
CString sTextToWrite;
sTextToWrite.Format("Mouse Position is : ( %d , %d )", point.x, point.y);

pDC->TextOut(point.x,point.y, sTextToWrite);

Prva linija:
pDoc je pointer na Dokument koji je wizard automatski generirao u OnDraw handleru. Njega koristimo da procitamo poziciju misa koju smo zapamtili u Documentu
Druga linija:
Treba nam string da formiramo text koji ce se ispisati
Treca linija:
Formatiramo teks koji ce se ispisati
Cetvrta Linija:
Ispisujemo tekst u poziciji gdje je mis kliknuo

I to je sve. Ovo je jednostavan program, ali opisuje dosta od Document View Arhitekture.

Nadam se da je ovo neka pomoc. Ipak dopusti mi reci jos i ovo. Ja mislim da je losa ideja poceti sa wizardom. Na nasem faxu je wizard ZABRANJENO koristiti u projektima u prva dva semestra. Sve se mora raditi "rucno" Ja mislim da je to potpuno ispravno. Zato je onaj prvi primjer onakav kakav jeste. Najjednostavniji, ali u sebi sadrzi 50 % principa kojima treba dobro vladati.

na serveru ftp://www.theleniax.com u folderu MFC mozes naci cijeli projekat po imenom test_mfc. Server nije aktivan 24 sata, nego otprilike tijelkom dana, pa se nemoj iznenaditi ako iza ponoci ne mozes naci server, ali tijekom dana je gotovo sigurno da ces uspjeti

Lijepi pozdravi
TomK is offline  
Odgovori s citatom
Sponsored links
Advertisement
 
Advertisement
Odgovor


Tematski alati
Opcije prikaza

Pravila postanja
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smajlići su On
[IMG] kôd je On
HTML kôd je Off

Kreni na podforum




Sva vremena su GMT +1. Trenutno vrijeme je: 04:36.



Powered by vBulletin Version 3.8.4 (hrvatski)
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Site content ©1999-2014 Forum.hr
Ad Management by RedTyger