Sei sulla pagina 1di 6

Standart SDI projesinde MFC'nin hazrlad temel dosyalarda ne ilem yaplyor?

Visual C 5.0 'da MFC wizard'mz bizim iin neler hazrlyor neler hazrlamyor. ncelemek iin MFC App
Wizard (exe) ile standartSDI adl bir uygulama iskeleti oluturalm. 1. Admda SDI document'i seelim.
Dier tm admlarda var olan deerler ile bir sonraki adma geelim.
Uygulama yaratldnda CAboutDlg, CMainFrame, CStandartSDIApp, CStandartDoc,
CStandartSDIView snflar cin tarafndan yaratlyor. Peki tm bu snflar ne iimize yaryor.
CStandartSDIApp
CWinApp snfndan miras alarak gelitirilmi olan bu snf uygulamanza ait ilk deerlerinin atanmas,
almas ve sonlandrlmas iin gerekli kodlar iermektedir.
CStandartSDIDoc
Bu snf CDocument snfndan miras alarak gelitirilmitir. Dkman snf nesneleri uygulamann
verilerinin ynetildii yerlerdir. Grnt (view) snflar ile iletiimde bulunurlar. Bylece veri
uygulamann client alannda grntlenebilir, kullanc veri ile bylece iletiim kurabilir.
CStandartSDIView
Bu snf CView snfndan miras alarak gelitirilmitir. Uygulamann dkmannn verisinin gsterildii ve
kullancnn veriyi, deitirmek veya semesi iin giri alr.
CMainWindow
Bu snf CFrameWnd snfndan miras alarak gelitirilmitir.SDI uygulamalarnda uygulamann ana frame
penceresidir.Frame(ereve) pencereleri uygulamann tamamn veyahut bir ksmn ereveler, iinde
barndrr. Genellikle dier pencereleri fizksel olarak iinde barndrr. Buna rnek olarak ara ubuklar
(toolbarlar), stat ubuklar(status barlar),view (grnt) bulunur.
CAboutDlg
Uygulamnzla ilgili, bilgi verici bir dialog gstermeye yarayan bir dialog snfdr. CDialog'tan miras
alnarak retilmitir.
ClassView'da grnrdeki tm snflarmz bunlar. yleyse en yukardan balyarak snflara ait veri ve
fonksiyonlara bakalm. lk olarak uygulama bana sadece bir tane olmas gereken CWinApp snfndan
gelitirilmi olan CStandartSDIApp snfna gz atalm.Mesaj yaplarna ve fonksiyonlarn ne tr
olduuna bakmadan srayla hepsini inceleyelim.
Bir defa bir constructorumuz var. CStandartSDIApp::CStandartSDIApp ve iersine baktmzda yle bir
mesajla karlayoruz. Construction (snfn ina etme) kodunu buraya koyun, ilk deerleri atama ilemini
CStandartSDIApp::InitInstance()'de yapn diyor.
yleyse CStandartSDIApp::InitInstance()'a bakalm.
BOOL CStandartSDIApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif

// Call this when using MFC in a shared DLL


// Call this when linking to MFC statically

// Change the registry key under which our settings are stored.
// You should modify this string to be something appropriate

// such as the name of your company or organization.


SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
/*
Bizim iin nemli olan ksma geldik.Acaba aadaki satrlarda neler oluyor
Nedir bu CSingleDocTemplate snf?
Yukarda sylemediimiz nmeli bir snf vard. O da CSingleDocTemplate.
CSingleDocTemplate
snf CWinApp snf ile CDocument snf arasnda kalr. Ve Single Document Interface (SDI) iin
dkman ablonu (template) oluturur.
Dkman ablonlar ise dkman snf ( burda CStandartSDIDoc), grnt (view) snf
(CStandartSDIView), ve frame window (CMainWindow) arasndaki ilikileri tanmlar.
pDocTemplate ile CSingleDocTemplate'ten bir gsterge (pointer) nesnesi tanmlyor.
*/
CSingleDocTemplate* pDocTemplate;
/*
Tanmlanan nense iin hafza yer ayrmamz gerekiyor. Bunu new ile yapyor. Burada
nemli
olan nesnemize construction (ina edilmesi) iin gerekli olan argmanlar.Burada
RUNTIME_CLASS'lar
aralarnda ilki kurulacak snflar belirtiyor. IDR_MAINFRAME ise dkman tr ile birlikte
kullanlan kaynaklarn (resource) ID'sini belirtiyor. Bu kaynaklar men, ikon, stringler, ve
ksayol tanm tablosu, toolbar olabilir.
*/
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CStandartSDIDoc),
RUNTIME_CLASS(CMainFrame),
// main SDI frame window
RUNTIME_CLASS(CStandartSDIView));
/*
Sra geldi CWinApp snfnn dkman ablonu uzdan haberdar olmasna. Bunun iin
dkman
ablonumuza ait olan gstergei AddDocTmplate'e parametre olarak yolluyoruz.
*/
AddDocTemplate(pDocTemplate);
/*
Aadaki satrlar komut satrn ilemek iin
*/
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))

return FALSE;
/*
Artk ana ereveye ait ilk deer atama ilemleri sona erdi. O zaman ereveyi gsterip,
gncelliyelim.
*/
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CStandartSDIApp snfnn fonksiyonlarndan bir dieri ise OnAppAbout(). Bu fonksiyon uygulamanza
ait Hakknda dialou gsterecektir.
Peki tm bu fonksiyonlar nasl tamlanyor. Birde ona bakmak iin CStandartSDIApp snfnn .h
dosyasndaki tanmlanmasna bakalm.
class CStandartSDIApp : public CWinApp
{
public:
/* Construction fonksiyonumuz aada. */
CStandartSDIApp();
/*
Peki aadaki satrlar ne? ClassWizard ve AppWizard bizim iin kodlar yaratrken, veya daha
sonradan eklerken, kodu nereye ekliyeceini bilmesi gerekiyor.
Burda da;
//{{AFX_VIRTUAL(CStandartSDIApp)
...
//}}AFX_VIRTUAL arasna virtual (sanal) fonksiyonlarn override tanmlamalar yaplyor.
Sanal fonksiyonlarn override ilemi nedir derseniz?
1- Virtual fonksiyon snfnzn miras ald (st) snf tarafndan da tanmlanp gelitirilmi, ve
eer siz (alt) snfnzda tekrar tanmlayp gelitirmediiniz taktirde direk st snfntan arlan
fonksiyonlardr.
2- Virtual fonksiyonu override etmek alt snfta ayn isimli, ayn prametreli fonksiyonu tekrar
tanmlayp, yeniden gelitirmektir. Bu gelitirme srasnda stSnfAd::fonksiyonAd(...) eklinde st
snfn fonksiyonu istendii taktirde arlabilir.
*/
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStandartSDIApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
/*
Gelelim
//{{AFX_MSG(CStandartSDIApp)
...
//}}AFX_MSG 'e Burasda dier window mesajlarna karlk arlacak olan ye fonksiyonlarn
tanmland blm. Yine buray ClassWizard ve AppWizard kullanyor.

*/
//{{AFX_MSG(CStandartSDIApp)
afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
/*
CCmdTarget snflarnn (u ana kadar bahseetiimiz tm snflarn st snfdr. Bilgi iim MFC
hiyerari aacna baknz) mesajlar ele alabilmesi iin bu makronun snf tanmlamasnn sonunda yer
almas gerekmektedir.
*/
DECLARE_MESSAGE_MAP()
};
Mesaj haritas iin snf tanmlamas dnda , .cpp dosyasnda da AppWizard, ClassWizard
tarafndangelitirilmi olan ksmlar var Birde bunlara bakalm.
/*
BEGIN_MESSAGE_MAP'i mesaj haritanzn tanmlanmasnn balangc iin kullann. Kullanm
BEGIN_MESSAGE_MAP( hangi_snf_iin_kullanlaca, st_snf)
END_MESSAGE_MAP'i mesaj haritanzn tanmlanmasnn sona erdiini belirtmek iin kullann.
Arada hangi fonksiyonun hangi mesaj ald zaman arlaca belirtiliyor. Bunuda
ON_COMMAND makrosu ile yapyorsunuz. Kullanm ON_COMMAND(mesaj id'si,
ye_fonksiyon_ad)
*/
BEGIN_MESSAGE_MAP(CStandartSDIApp, CWinApp)
//{{AFX_MSG_MAP(CStandartSDIApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
CStandartSDIDoc snfnn sanal fonksiyonlarna bakacak olursak
OnNewDocument() : Yeni bir dkman oluturulduu zaman File New komutunun bir paras olarak
arlr.
Serialize(CArchive& ar): Dosyaya yazma veya dosyadan okuma iin kullanlr.
CStandartSDIDoc snfnn tanmlanmasna bakarsak DECLARE_DYNCREATE(CStandartSDIDoc)
makrosu dikkatinizi ekecektir. Bu macro DECLARE_DYNCREATE(snf_ismi) eklinde
tanmlanmaktadr. Bu macroyu CObject(CObject bir ok snfn miras alnd bir snftr. Baknz. MFC
hiyerar aac)'ten miras alnarak yaratlan snflarda run-time (alma srasnda) dinamik olarak nesnenin
yaratlmas iin kullanlyor.Bu makroyu snfn.h dosyasna eklemelisiniz, bunun dnda .cpp
dosyasnada IMPLEMENT_DYNCREATE eklenmelidir.
CStandartSDIView snfnn sanal fonksiyonlarna bakacak olursak
// Overrides
// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CStandartSDIView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
/*
Aadaki fonksiyonlar yazc kts almak iin gelitirilen fonksiyonlar
*/
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
BOOL CStandartSDIView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
/*
Grnt yaratlmadan nce arlan bu fonksiyonda cs'yi deitirerek oluacak
pencerenin zelliklerini deitirebilirsiniz.
*/
return CView::PreCreateWindow(cs);
}
void CStandartSDIView::OnDraw(CDC* pDC)
{
CStandartSDIDoc* pDoc = GetDocument();// dokman ablonunda ilikilendirilen dkmana ait
gsterge alr
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/*
Bu fonksiyon grntnn tekrar boyanmas gerektii zamanlarda sistem tarafndan
arlr.
*/
}
CMainFrame snfna bakarsak
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
ile stat ve ara ubuklarnn Ana erevenin yesi olduunu gryoruz.
PreCreateWindow(CREATESTRUCT& cs) fonksiyonu ereve penceresi yaratlmadan nce pencere
zerinde deiiklik yapmanza izin verir.OnCreate fonksiyonuna detayl olarak bakalm
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// Aada erevenin penceresi yaratlyor
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// Aada ara ubuu yaratlyor
if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// Aada stat ubuu yaratlyor
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// Aada ara ubuunun zellikleri deitiriliyor
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
Bu dkmann orjinali http://www.prizma.net.tr/~seherler/mfc/stdSDI.html adresinde bulunmaktadr.
Daha geni bilgi iin http://www.prizma.net.tr/~seherler/mfc/mfc.html adresine bakabilirsiniz.
Bu mesaj Erdem Seherler tarafndan gnderilmitir.
seherler@prizma.net.tr
http://www.prizma.net.tr/~seherler

Potrebbero piacerti anche