Sunteți pe pagina 1din 11

Crearea unei aplicaii Windows

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.

Etapa 1. Tip aplicaie


n etapa 1 (pas 1) vom selecta tipul aplicaiei (se alege interfaa cu utilizatorul). Avem urmtoarele posibiliti: O aplicaie single document interface (SDI), are numai un document deschis la un moment dat. Cnd selectm File->Open, fiierul existent i care este deschis va fi nchis nainte ca s se deschid noul document. O aplicaie multiple document interface (MDI), cum ar fi Excel sau Word, poate deschide mai multe documente odat. Dac dorim vizualizri multiple pentru un document va trebui s construim o aplicaie MDI. O aplicaie dialog-based, cum ar fi utilitarul Character Map. Aplicaiile nu au meniu.

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.

Etapa 2. Baze de date


n aceast etap vom alege nivelul pentru suportul bazelor de date. Exist patru posibiliti: Pentru aplicaii fr baze de date vom selecta None. Dac dorim s avem acces la baze de date dar nu dorim s derivm vizualizarea din CFormView sau s nu avem meniu Record vom selecta Header Files Only. Dac dorim s derivm vizualizarea din CFormView i s avem meniul Record dar nu dorim s serializm documentul, vom selecta Database View Without File Support. Dac dorim suport pentru baze de date i n plus dorim i salvarea documentului vom selecta Database View With File Support. Dac selectm ultima opiune, va trebui s indicm sursa de date butonul Data Source.

Etapa 3. Suport pentru documente compuse


Tehnologia ActiveX i OLE este referit ca fiind tehnologia documentului compus (compound document technology). n aceast etap exist cinci posibiliti: Dac nu scriem o aplicaie ActiveX, alegem None. 1

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.

Etapa 4. Opiuni pentru interfa. Alte Opiuni


Urmtoarele opiuni afecteaz modul de afiare al interfeei: Docking Toolbar. AppWizard pregtete un toolbar. Acesta poate fi editat (adugare, modificare, tergere). Initial Status Bar. AppWizard creaz o bar de stare care afieaz mesajele ataate comenzilor din meniu sau alte mesaje specifice aplicaiei. Printing and Print Preview . Aplicaia va avea opiunile Print i Print Preview din meniul File, i o parte din codul necesar va fi generat de AppWizard. Context-Sensitive Help. Meniul Help va avea opiunile Index i Using Help, i o parte din codul necesar pentru a fi implementat Help va fi generat de AppWizard. Aceast decizie este dificil de luat mai trziu pentru c pri din cod sunt generate n diverse locuri din cadrul aplicaiei. 3D Controls. Aplicaia va arta ca o aplicaie obinuit Windows 95. Dac nu selectm aceast opiune, boxele de dialog vor avea background alb i nu vor fi umbre n jurul boxelor de editare, checkbox-urilor i alte controale. MAPI(Messaging API). Aplicaia va avea posibilitatea de trimite fax-uri, email-uri i alte mesaje. Windows Sockets. Aplicaia va putea accesa Internet-ul n mod direct, folosind protocoale ca FTP i HTTP (protocolul World Wide Web). Putem seta de asemenea numrul fiierelor din lista MRU. Implicit acest numr este 4. Butonul Advanced activeaz dou tab-uri (Document Template Strings, Window Styles) unde putem schimba numele aplicaiei, titlul ferestrei cadru, extensia fiierelor folosite n File->Open, etc. Prporpietile care pot fi setate pentru ferestrele cadru: Thick Frame. Dac nu o selectm se previne redimensionarea. Minimize Box. Maximize Box. System Menu. Minimized. Cadrul este minimizat cnd aplicaia este lansat n execuie. Pentru aplicaiile SDI, aceast opiune va fi ignorat cnd aplicaia ruleaz sub Windows 95. 2

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.

Etapa 6. Numele fiierelor i al claselor


Ultima etap stabilete numele claselor i fiierelor create de AppWizard. Putem schimba aceste nume. Dac aplicaia include o clas pentru vizualizare, care n mod obinuit este derivat din CView, putem schimba clasa de baz, de exemplu CScollView sau CEditView care ofer o funcionalitate sporit vizualizrii. Vom apsa butonul Finish pentru terminarea generrii aplicaiei. Urmeaz exemple de creare aplicaii pentru fiecare tip n parte.

Crearea DLL-urilor, Aplicaiilor de tip Consol


Alte opiuni ce se regsesc n tab-ul Projects: ATL COM AppWizard Custom AppWizard Database Project DevStudio Add-In Wizard Extended Stored Procedure AppWizard ISAPI Extension Wizard Makefile MFC ActiveX ControlWizard MFC AppWizard (dll) Utility Project Win32 Application Win32 Console Application Win32 Dynamic Link Library Win32 Static Library

ATL COM AppWizard


ATL este Active Template Library, i este utilizat pentru a scrie un mic control AciteX.

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.

DevStudio Add-In Wizard


Add-ins lucreaz exact ca macro-urile care automatizeaz Developer Studio, dar acestea sunt scrise n C++ sau alt limbaj de programare; macro-urile sunt scrise n VBScript. Acestea folosesc automatizarea pentru a manipula Developer Studio.

ISAPI Extension Wizard


ISAPI este pentru Internet Server API i se refer la funcii pe care le putem apela pentru a interaciona cu un server Microsoft Internet Information Server.

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.

MFC ActiveX ControlWizard


ActiveX controls sunt controale pe care lescriem pentru a fi utilizate ntr-un dialog din VC++, o form din VB sau chiar o pagin Web. Aceste controale nlocuiesc controalele VBX.

MFC AppWizard (DLL)


Dac dorim s colectm un numr de funcii ntr-un DLL, i aceste funcii folosesc clase din MFC, vom selecta aceast opiune. Dac funciile nu folosesc MFC alegem Win32 Dynamic Link Library.

Win32 Application
Se creaz o aplicaie obinuit n C++.

Win32 Console Application


O aplicaie consol arat ca o aplicaie obinuit DOS.

Win32 Dynamic Link Library


Dac dorim s colectm un numr de funcii ntr-un DLL, i aceste funcii folosesc clase din MFC, vom selecta aceast opiune. Dac funciile nu folosesc MFC alegem Win32 Dynamic Link Library.

Win32 Static Library


Aplicaia va ncorpora funciile pe care folosete dintr-un DLL.

nelegerea codului generat de AppWizard


Aplicaie SDI
O aplicaie SDI are meniu pe care utilizatorul poate s-l foloseasc pentru a deschide documente i s lucreze cu ele. AppWizard genereaz cinci clase. Numele proiectului este FirstSDI. CAboutDlg, o clas de dialog pentru About CFirstSDIApp, o clas CWinApp pentru ntraga aplicaie (obiectul aplicaie) application CFirstSDIDoc, o clasa document CFirstSDIView, o clas vizualizare CMainFrame, o clas cadru

Fiierul FirstSDI.h pentru aplicaie


// FirstSDI.h : main header file for the FIRSTSDI application // #if !defined(AFX_FIRSTSDI_H__CDF38D8A_8718_11D0_B02C_0080C81A3AA2__INCLUDED_) #define AFX_FIRSTSDI_H__CDF38D8A_8718_11D0_B02C_0080C81A3AA2__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #ifndef __AFXWIN_H__ #error include `stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols ///////////////////////////////////////////////////////////////////////////// // CFirstSDIApp: // See FirstSDI.cpp for the implementation of this class // class CFirstSDIApp : public CWinApp { public: CFirstSDIApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFirstSDIApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CFirstSDIApp) 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. 5

#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.

n continuare prezentm listingul pentru CFirstSDIApp::InitInstance()


BOOL CFirstSDIApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and want to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you don't need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // 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. 6

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.

Aplicaia Multiple Document Interface


O asemenea aplicaie are meniu i permite utilizatorului de a deschide mai multe documente odat. AppWizard a generat cinci clase. Numele proiectului este FirstMDI. Clasele generate sunt: CAboutDlg, o clas de dialog pentru About CFirstMDIApp, o clas CWinApp pentru aplicaie CFirstMDIDoc, o clas document CFirstMDIView, o clas pentru vizualizare CMainFrame, o clas cadru

Listing pentru FirstMDI.h


// FirstMDI.h : main header file for the FIRSTMDI application // #if !defined(AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_) #define AFX_FIRSTMDI_H__CDF38D9E_8718_11D0_B02C_0080C81A3AA2__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #ifndef __AFXWIN_H__ #error include `stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols ///////////////////////////////////////////////////////////////////////////// // CFirstMDIApp: 8

// 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.

Listing pentru CFirstMDIApp::InitInstance()


BOOL CFirstMDIApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and want to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you don't need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which your 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. CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_FIRSTMTYPE, RUNTIME_CLASS(CFirstMDIDoc), 9

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.

Componentele unei aplicaii bazate pe dialog


AppWizard genereaz trei clase: CAboutDlg, o clas dialog pentru About CFirstDialogApp, o clas CWinApp pentru ntreaga aplicaie CFirstDialogDlg, o clas de dialog pentru ntreaga aplicaie. // FirstDialog.h : main header file for the FIRSTDIALOG application // #if ! defined(AFX_FIRSTDIALOG_H__CDF38DB4_8718_11D0_B02C_0080C81A3AA2__INCLUDED_) #define AFX_FIRSTDIALOG_H__CDF38DB4_8718_11D0_B02C_0080C81A3AA2__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #ifndef __AFXWIN_H__ #error include `stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols ///////////////////////////////////////////////////////////////////////////// // CFirstDialogApp: // See FirstDialog.cpp for the implementation of this class // class CFirstDialogApp : public CWinApp { public: CFirstDialogApp(); // Overrides // ClassWizard generated virtual function overrides 10

//{{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_)

Listing pentru CDialog16App::InitInstance()


BOOL CFirstDialogApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and want to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you don't need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CFirstDialogDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Because the dialog has been closed, return FALSE so that you exit the // application, rather than start the application's message pump. return FALSE; }

11

S-ar putea să vă placă și