Documente Academic
Documente Profesional
Documente Cultură
VC++ nu compileaz numai cod ci i genereaz cod. Pentru generarea unei aplicaii se folosete AppWizard. n primul rnd aici se lucreaz cu proiecte. Un proiect poate conine mai multe aplicaii. Pentru a crea un proiect vom folosi comenzile File->New->Projects. Din lista prezentat n pagina (tab-ul) Projects vom selecta MFC AppWizard (EXE), selectm locul unde va fi memorat pe HDD i apoi completm numele proiectului. Dup acest lucru va trebui s completm o serie de informaii grupate pe etape.
OBSERVAIE:: Aplicaiile bazate pe dialog sunt diferite de cele de tip SDI sau MDI. Vor fi tratate n mod separat.
Mai exist un checkbox care ne d posibilitatea de a indica dac dorim suport pentru arhitectura Document/View. Opiunea se folosete n special pentru portarea aplicaiilor dintr-un alt sistem de dezvoltare. Nu o vom folosi.
Dac dorim o aplicaie care s conin obiecte ActiveX nglobate sau legate, cum ar fi aplicaia Word, alegem Container. Dac dorim ca aplicaia noastr s furnizeze obiecte, care pot fi nglobate, pentru alte aplicaii, dar aplicaia s nu poat fi executat separat (stand alone), vom alege Mini Server. Dac dorim ca aplicaia noastr s furnizeze obiecte, care pot fi nglobate, pentru alte aplicaii, i aplicaia s poat fi executat separat (stand alone), vom alege Full Server. Dac dorim ca aplicaia s ncorporeze opiunile 3 i 4 vom selecta Both Container and Server.
Dac alegem suport pentru documentele compuse vom avea i suport pentru fiiere compuse ( compound files). Fiierele compuse conin unul sau mai multe obiecte ActiveX i sunt salvate ntr-un mod special astfel nct un obiect poate fi modificat fr a rescrie ntregul fiier. Pentru acest lucru facem o selecie pe unul din butoanele radio Yes, Please, sau No, Thank You. Tot n aceast pagin ne hotrm dac aplicaia suport automatizare sau va folosi controale ActiveX.
OBSERVAIE: Dac dorim ca aplicaia s fie un control ActiveX, nu trebuie s crem o aplicaie .exe obinuit. Crearea controlului ActiveX se face selectnd o alt opiune din Projects.
Maximized. The frame is maximized when the application starts. For SDI applications, this option will be ignored when the application is running under Windows 95.
Alte Opiuni
Dorim biblioteca MFC s fie legat ca un DLL partajabil sau n mod static? Un DLL este o colecie de funcii utilizate de diferite aplicaii. Folosirea DLL-urilor face ca programul s fie mai mic dar mai greu de instalat. Dac legtura este static crete mrimea programului dar nu mai sunt probleme deosebite cu instalarea.
Custom AppWizard
Se folosete n general pentru a crea noi proiecte din altele existente (se copie cod, help, etc.).
Database Project
Dac avem instalat Enterprise Edition of Visual C++, putem crea un proiect de baze de date.
Makefile
Dac dorim s crem un proiect care este utilizat cu un alt utilitar make diferit de Developer Studio, vom selecta aceast opiune. Nu se genereaz cod.
Win32 Application
Se creaz o aplicaie obinuit n C++.
#endif //! defined(AFX_FIRSTSDI_H__CDF38D8A_8718_11D0_B02C_0080C81A3AA2__INCLUDED_) #ifndef acioneaz ca n codul care urmeaz,i are ca efect includerea fiierului ce urmeaz o singur dat. #ifndef test_h #include "test.h" #define test_h #endif #pragma once este de asemenea pentru a preveni definiiile multiple dac acest fiier este inclus de dou ori. Clasa CFirstSDIApp derivat din CWinApp, furnizeaz cea mai mare funcionalitate a aplicaiei. Instana acestei clase constituie obiectul aplicaie. AppWizard a generat anumite funcii pentru aceast clas care reacoper funciile motenite din clasa de baz. Aceast seciune de cod ncepe cu //Overrides. De asemenea sunt generate annumite comentarii care ajut la nelegerea codului. n aceast seciune vom gsi declaraia pentru funcia InitInstance(). Urmtoarea seciune de cod este pentru harta de mesaje. AppWizard genereaz cod pentru constructorul CFirstSDIApp, i funciile InitInstance() i OnAppAbout() n fiierul firstsdi.cpp. Codul generat pentru constructor arat astfel: CFirstSDIApp::CFirstSDIApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } Ca regul general trebuie reinu c Microsoft construiete obiectele n doi pai. Se creaz obiectul unde se scrie cod care sigur se execut corect, iar iniializrile se fac cu ajutorul unei funcii membru, care poate indica dac acestea au fost efectuate cu succes sau nu. Constructorul nu ntoarce nici o valore, construiete obiectul.
CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CFirstSDIDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CFirstSDIView)); AddDocTemplate(pDocTemplate); // 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; // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE;
Comentariile sunt incluse de AppWizard. InitInstance este apelat prima la lansarea apliaciei. AfxEnableControlContainer() permite aplicaiei de a conine controale ActiveX. Se permite afiarea controalelor cu aspect 3D. Se completeaz regitrii sub care va fi nregistrat aceast aplicaie. InitInstance() nregistreaz n continuare ablonul de document care este SDI n acest caz. InitInstance() creaz un obiect vid (neiniializat) CCommandLineInfo pentru a menine parametrii pasai aplicaiei prin linia de comand cnd aceasta a fost lansat n execuie i apoi apeleaz ParseCommandLine() pentru a completa acest obiect. n final se proceseaz linia de comand printr-un apel la ProcessShellCommand(). De exemplu dac lansm aplicaia din linia de comand astfel: FirstSDI fooble, aplicaia va deschide fiierul fooble. Parametrii din linia de comand pe care ProcessShellCommand() i suport sunt urmtorii: Parameter None Filename /p filename /pt filename printer driver port /dde /Automation /Embedding Action Start app and open new file. Start app and open file. Start app and print file to default printer. Start app and print file to the specified printer. Start app and await DDE command. Start app as an OLE automation server. Start app to edit an embedded OLE item.
Dac dorim s implementm o alt comportare, vom construi o clas derivat din CCommandLineInfo pentru a pstra linia de comand, i apoi rescriem funciile CWinApp:: ParseCommandLine() i CWinApp::ProcessShellCommand(). 7
Se completeaz variabila m_pMainWnd cu adresa obiectului aplicaiei, variabil ce este defintn CWinThread, ce este clas de baz pentru CWinApp. La sfrit funcia ntoarce TRUE pentru a indica c restul aplicaiei poate rula. Harta de mesaje indic c funcia OnAppAbout() va trata un mesaj. Care este? Va trata comanda de meniu care are ID-ul ID_APP_ABOUT. Acest ID corespunde comenzii de meniu Help->About. Descrierea hrii de mesaje este: BEGIN_MESSAGE_MAP(CFirstSDIApp, CWinApp) //{{AFX_MSG_MAP(CFirstSDIApp) 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() OnAppAbout() arat aa: void CFirstSDIApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } Se construiete obiectul aboutDlg, care este o box de dialog, i apoi se execut acest dialog.
// See FirstMDI.cpp for the implementation of this class // class CFirstMDIApp : public CWinApp { public: CFirstMDIApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFirstMDIApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CFirstMDIApp) 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 DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately // before the previous line. #endif //! defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_) Nici o diferen fa de clasa de la aplicaia SDI.
RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CFirstMDIView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // 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; // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE; } Care sunt deferenele? Folosind WinDiff le putem vedea mai uor. Aplicaia MDI folosete CMultiDocTemplate Aplicaia MDI seteaz fereastra cadru i apoi o arat, ceea ce nu face o aplicaie SDI.
//{{AFX_VIRTUAL(CFirstDialogApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CFirstDialogApp) // NOTE - The ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately // before the previous line. #endif // !defined(AFX_FIRSTDIALOG_H__CDF38DB4_8718_11D0_B02C_0080C81A3AA2 __INCLUDED_)
11