OnFileNew funksiyasi hujjat obyekti yaratadi, lekin hali ma'lumotlarini yuklamaydi
Sinf obyekti CChildFrame bola deraza romi uchun yaratiladi va oyna hosil bo'ladi. DR_MAINFRAME menyusi IDR_TESTTYPE menyusi bilan almashtirildi.
"Вид" obyekti yaratiladi va displey oynasi hosil bo'ladi (lekin bu oyna hali ko'rsatilmagan).
Yuqoridagi obyektlar o'rtasida aloqa o'rnatiladi.
Hujjat obyekti uchun OnNewDocument a'zosi funktsiyasi chaqiriladi.
Ko'rish obyekti uchun OnInitialUpdate virtual a'zo funktsiyasi chaqiriladi.
Freym oynasi va displey oynasini namoyish etish uchun ActivateFrame virtual a'zo funktsiyasi bolalar freymining obyektida chaqiriladi.
Amaliyotda MDI dasturini yaratishni ko'rib chiqing. Microsoft Visual Studio-ni ishga tushiring va Test deb nomlangan yangi loyihani yarating. Taklif etilayotgan loyihalar turlaridan MFC AppWizard (exe) turini tanlang. AppWizard sizga loyihani yaratish uchun olti bosqichdan o'tishni taklif qiladi. Birinchi bosqichda biz yaratilishi kerak bo'lgan bir nechta hujjatlar ilovasining standart turini qoldiramiz. Keyingi to'rt bosqichda biz standart variantlarni qoldiramiz. Oltinchi bosqichda, CView bazasini CFormView-ga o'zgartiring. Finish tugmachasini bosish bilan AppWizard avtomatik ravishda MDI dastur doirasini yaratadi.
6-qadam. Ilova bazasi sinfini CFormView-ga o'zgartirish.
Agar siz dasturni ishga tushirishda darhol zudlik bilan yuklamoqchi emassiz, unda IDR_MAINFRAME menyusini o'chirib tashlashingiz va IDR_TESTTYPE nomini IDR_MAINFRAME ga o'zgartirishingiz mumkin. Bunday holda, CTestApp sinfining boshlang'ich bo'limiga quyidagi kodni kiritish kerak bo'ladi:
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
//Don't show a new MDI child window during startup
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Ushbu kod yordamida biz dastur doirasiga, dastur boshlanganda yangi oyna ochilmasligini aytamiz
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
Yangi menyu elementlarining xususiyatlarini Test-ga, ID_FILE_NEW-ni ID_OPEN_TEST-ga va Ochish ... -ga va ID_FILE_OPEN-ga ID_OPEN_DATA-ga o'zgartiramiz.
Test menyusidagi yangi elementning xususiyatlari.
Ikkita dialog resurs qo'shamiz (ikkita quyi oynasi). Ushbu oynalarning uslubi o'rnatilishi kerak.
Quyi dialog oynalarining xususiyatlari
String Table resurslari ro'yxatida ikkita identifikatorni yaratish kerak: IDR_TESTOPEN va IDR_DATAOPEN.
Quyi dialog oynalarining xususiyatlari.
Yaratilgan ikkita oynaga kerakli elementlarni qo'yishingiz mumkin (EditBox, ListBox, Radio tugmachalari, Tekshirish tugmalari va boshqalar).
Endi yangi oynalar uchun sinflarni aniqlash kerak. Birinchi oynada bu CTestClass, ikkinchisi uchun - CDataClass bo'ladi. Odatiy bo'lib, ClassWizard CDialog dialogi uchun asosiy sinfni taklif qiladi. Bizning derazalarimiz CFormView asosiy sinfidan meros bo'lib o'tgan.
Keyinchalik, har bir hujjat turi uchun buyruq xabarlarini qayta ishlash vositalarini yaratishingiz kerak. ClassView yorlig'ida CTestApp klassini tanlang, sichqonchaning o'ng tugmachasini bosing, kontekst menyusidan "Add Windows Message Handler ..." -ni tanlang. Ishlash uchun Sinf yoki obyekt oynasida biz ID_OPEN_TEST identifikatorini topamiz va "Qo'shish va Tahrirlash" tugmasini bosing. Buyruq xabari CTestApp sinfiga qo'shiladi va kod muharriri bizga ushbu buyruqli xabar uchun kodni kiritish imkoniyatini beradi. Bu yagona OpenNewDoc xususiyati bo'ladi. Ushbu funktsiyaning parametrlari sifatida har bir shablondan hujjat turining pastki satri o'tkaziladi:
void CTestApp::OnOpenTest()
{
OpenNewDoc("TestOpen");
}
void CTestApp::OnOpenData()
{
OpenNewDoc("DataOpen");
}
MDI dasturi bir nechta hujjat shablonini qo'llab-quvvatlaydi. Buning uchun har bir shablon uchun AddDocTemplate-ga qo'ng'iroq qiling:
CMultiDocTemplate* pDocTemplateTest;
pDocTemplateTest = new CMultiDocTemplate(
IDR_TESTOPEN,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CChildFrame), // hoshiya-oyna sinfi
RUNTIME_CLASS(CTestOpen)); // quyi oyna sinfi
AddDocTemplate(pDocTemplateTest);
CMultiDocTemplate* pDocTemplateData;
pDocTemplateData = new CMultiDocTemplate(
IDR_DATAOPEN,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CChildFrame), // hoshiya oyna sinfi
RUNTIME_CLASS(CDataOpen)); // quyi sinf oynasi
AddDocTemplate(pDocTemplateData);
Fayl menyusidan yangi buyruq chaqirilganda, dastur doirasi shablonlarni ro'yxatini ko'rsatadi, bu esa kerakli manbani string resursida (hujjat turi osti satrida) ko'rsatilgan nom bo'yicha tanlash imkoniyatini beradi. Dastur bajarilganda, ob'yekt-hujjat obyektlar ro'yxatini (faol hujjat shablonlari) saqlaydi. CWinApp sinfining GetFirstDocTemplatePosition va GetNextDocTemplate funktsiyalari ushbu ro'yxat bo'yicha saralashga imkon beradi:
BOOL CTestApp::OpenNewDoc(const CString& strTarget)
{
CString strDocName;
CDocTemplate* pSelectedTemplate;
POSITION pos = GetFirstDocTemplatePosition();
while (pos != NULL)
{
pSelectedTemplate = (CDocTemplate*) GetNextDocTemplate(pos);
pSelectedTemplate->GetDocString(strDocName, CDocTemplate::docName);
if (strDocName == strTarget) // shablonning satr manbasidan tanlanadi
{
pSelectedTemplate->OpenDocumentFile(NULL);
return TRUE;
}
}
return FALSE;
}
MDI dasturida hujjatlarni yuklash va saqlash SDI-ga o'xshash, ammo ikkita farq bor: hujjat yuklanganda, diskdan yangi hujjat obyekti yaratiladi va hujjatni ko'rsatish uchun oxirgi bolalar oynasi yopilganda u yo'q qilinadi.
Ilovani ishga tushirgandan so'ng, fayl menyusidan ikkita faol sub-menyu elementlarini ko'ramiz. Ularni tanlab, ikkita hujjatlar (bolalar oynalari) o'zlarining boshqaruv elementlari va displeylari bilan to'ldiriladi.
Xulosa qilib shuni ta'kidlash kerakki, MDI dasturlarini yaratish qiyin emas. Natijada biz zamonaviy ko'rinishga ega va belgilangan xalqaro standartlarga javob beradigan, foydalanish uchun qulay dasturga ega bo'lamiz.
7.Nazorat uchun savollar:
OLE (Object Linking and Embedding) haqida aytib bering?
ActiveX bu?
MFC (Microsoft Foundation Classes) tushunchasi?
MFC tarixi?
Multiple Document Interface nima?
MDI ni SDI bilan taqqoslang? Ustunlik va kamchiliklarini sanab o’ting?
Visual C++ muhitida ko’p oynali muhit yaratish?
Dostları ilə paylaş: |