Anımsanacağı gibi bir MFC programında CWinApp sınıfından bir sınıf türetip o sınıfa ilişkin global bir nesne tanımlamak gerekiyordu. Bu global nesne diğer modüllerden extern yapılarak kullanılabilir. Ancak istenirse AfxGetApp global fonksiyonuyla bu nesnenin adresinin elde edilmesi mümkündür.
CWinApp *AfxGetApp(void);
Fonksiyonun geri dönüş değeri CWinApp türünden olmasına karşın aslında adreste bulunan nesne CWinApp’den türettiğimiz sınıf türündendir. Yani bu adresin aşağıya doğru dönüştürme yapılmasında bir sakınca yoktur.
CMyApp *pMyApp = (CMyApp *) AfxGetApp();
Programcı neden bu nesnenin adresini elde etmek ister? En önemli neden WinMain fonksiyonuna geçirilen parametrelere erişmektir. Çünkü framework InitInstance sanal fonksiyonunu çağırmadan önce WinMain parametrelerini CWinApp sınıfının veri elemanlarına yazmaktadır.
Sınıf Çalışması
İskelet MFC programını kullanarak farenin sol tuşuna basıldığında programın komut satırı argümanlarını MessageBox ile ekrana yazdıran programı yazınız.
COMMANDLINE.H
#ifndef _COMMANDLINE_H_
#define _COMMANDLINE_H_
class CGenericApp : public CWinApp {
public:
virtual BOOL InitInstance(void);
};
class CMainWnd : public CFrameWnd {
public:
CMainWnd(void);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
#endif
COMMANDLINE.CPP
#include
#include “commandline.h”
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
CGenericApp theApp;
BOOL CGenericApp::InitInstance(void)
{
m_pMainWnd = new CMainWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMainWnd::CMainWnd(void)
{
Create(NULL, “Command Line”, WS_OVERLAPPEDWINDOW);
}
void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox(AfxGetApp()->m_lpCmdLine);
}
Programcı herhangi bir zaman programın ana penceresine ilişkin nesnenin adresini CWinThread sınıfının m_pMainWnd elemanından çekebilir. Aynı işlem AfxGetMainWnd global fonksiyonuyla da yapılabilir.
CWnd *AfxGetMainWnd(void);
Bu durumda karmaşık bir projede programı sonlandırabilmek için:
AfxGetApp()->m_pMainWnd->DestroyWindow();
ya da
AfxGetMainWnd()->DestroyWindow();
yapılabilir.
