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.
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.
Dac selectm ultima opiune, va trebui s indicm sursa de date butonul Data Source.
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.
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.
2
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.
3
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.
Win32 Application
Se creaz o aplicaie obinuit n C++.
4
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.
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.
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);
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.
Parameter Action
None Start app and open new file.
Filename Start app and open file.
/p filename Start app and print file to default printer.
/pt filename printer driver port Start app and print file to the specified printer.
/dde Start app and await DDE command.
/Automation Start app as an OLE automation server.
/Embedding 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()
void CFirstSDIApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
Se construiete obiectul aboutDlg, care este o box de dialog, i apoi se execut acest dialog.
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;
}
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_)
11