CATEGORII DOCUMENTE | ||
|
||
Descrierea claselor dintr-o aplicatie standard MFC.
Scrierea aplicatiilor Non-Document/View.
Descrierea arhitecturii Document/View ( Notiuni fundamentale )
Analiza unei aplicatii bazata pe arhitectura Document/View.
Crearea unei aplicatii Document/View ( SDI ) folosind AppWizard.
Mediul de depanare
Folosirea Depanatorului
1. Crearea aplicatiilor MFC
Clase intr-o apliactie minimala MFC :
-Clasa pentru aplicatie
definitie : reprezinta aplicatia ca un intreg, este clasa de baza care se ocupa de initializarea, rularea si terminarea apliactiei.
-trebuie sa existe un obiect si numai unul de o clasa derivata din CWinApp intr-o apliactie.
-Trebuie rescrisa ( override ) functia InitInstance, cind se deriva o clasa pentru aplicatie din CWinApp.
-demonstratie animata despre clasa apliactiei
-clasa aplicatie si pozitia ei in ierarhia MFC :
clasa aplicatie si pozitia in ierarhie
-Clasa pentru cadrul principal al apliactiei
Defineste spatiul de lucru al aplicatiei pe ecran si serveste ca si container pentru spatiul de vizualizare.
Reprezinta chenarul ferestrei principale, pozitioneaza si determina automat dimensiunea ferestrei de vizualizare ( View ) .Gestioneaza elementele de interfata ale aplicatiei cum ar fi : butoanele de minimizare, maximizare, salvare ( Save ) , inchidere ( Close ) , bara de titlu si icoana din bara de titlu, meniul principal al apliactiei, barele de derulare, bara de stare, si cea de instrumente.
Implicata in gestionarea mesajelor ( harat de mesaje si tratarea mesajelor ) :
CFrameWnd este clasa derivata indirect din CCmdTarget ceea ce inseamna ca poate receptiona si trata mesaje de comanda.
Principalele functii ale clasei sint :
GetActiveView
GetActiveDocument
Scrierea unei aplicatii fara suportul arhitecturii Document/View
- Introducere in arhitectura Non-Document/View
Cel mai simplu mod de a crea o apliactie Non-Document/View este prin crearea unei apliactii bazate pe cutie de dialog
Codul generat de AppWizard :
BOOL CNonDocViewApp : : InitInstance ( )
else if ( nResponse == IDCANCEL )
// Since the dialog has been closed, return FALSE so that we exit the
application, rather than start the application's message pump.
return FALSE;
- Analiza unei aplicatii fara suportul arhitecturii Document/View
Derivarea claselor apliactie si pentru cadru principal din CWinApp respectiv CFrameWnd.
Declararea obiectului aplicatie global
Rescrierea ( Override ) functiei InitInstance.
Crearea ferstrei.
m _ pMainWnd = new CMainFrame;
( ( CMainFrame* ) m _ pMainWnd ) ->Create ( NULL,'The MFC Application' ) ;
Afisarea ferestrei.
m _ pMainWnd->ShowWindow ( m _ nCmdShow ) ;
tema laborator :
scrierea de mina a unei apliactii minimale MFC ( fara folosirea vrajitorilor )
Fundamentele arhitecturii Document/View
Demonstartie : componentele unei aplicatii Document/View
-Introducere in arhitectura Document/View
conceptul de arhitectura Document/View si principalele obiecte implicate
-Clasa Document
clasa CDocument incarca dintr-un fisier sau de la utilizator, stocheaza si gestioneaza datele programului.
Pentru a mentine o legatura cit mai strinsa intre document si view in arhitectura document/view, fiecare obiect document mentine o lista cu toate vizualizarile ( view ) asociate si fiecare obiect vizualizare mentine un pointer catre documentul asociat.
Cele mai importante functii sint : GetFirstViewPosition, GetNextView, IsModified, UpdateAllViews
Functiile care sint rescrise ( overridable member functions ) : OnNewDocument, OnOpenDocument, DeleteContents, Serialize.
-Clasa Vizualizare ( View )
Reprezinta suprafata in care sint afisate informatiile continute de clasa document si permite interactiunea cu utilizatorul.
Un obiect document poate avea oricite vizualizari asociate in schimb unui obiect vizualizare nu i se poate asocia decit un singur document.
Clase derivate din CView : CCtrlView, CEditView, CListView, CTreeView.
Functii ce pot fi rescrise ( overridable member functions ) : OnDraw, OnInitialUpdate, OnUpdate.
-Clasa sablon pentru Document ( Document Template Class )
Este clasa care leaga impreuna clasele pentru cadru ( frame ) , vizualizare ( view ) , document, si setul de resurse al aplicatiei.
Mentine o lista cu toate obiectele document existente in aplicatie, si este responsabile pentru gestionarea existentei acestora. In plus asociaza diverse resurse cu aceste obiecte.
Cadrul ( Scheletul ) principal al aplicatiei poate folosi doua clase sablon pentru document :
CSingleDocTemplate ( pentru aplicatii SDI ) .
CMultiDocTemplate. ( pentru aplicatii MDI ) .
Analiza unei apliactii Document/View
Clasele implicate intr-o palicatie MFC bazata pe arhitectura Document/View :
Clasa derivata din CWinApp.
Seteaza registrii windows ( inregistreaza aplicatia in baza de date a sistemului de operare )
Incarca profilul aplicatiei
Creaza un sablon pentru document
Initializeaza parametrii din linia de comanda
Exemplu codul sursa :
// Reader.cpp : Defines the class behaviors for the application.
#include 'stdafx.h'
#include 'Reader.h'
#include 'MainFrm.h'
#include 'ReaderDoc.h'
#include 'ReaderView.h'
#ifdef _ DEBUG
#define new DEBUG _ NEW
#undef THIS _ FILE
static char THIS _ FILE[] = _ _ FILE _ _ ;
#endif
// CReaderApp
BEGIN _ MESSAGE _ MAP ( CReaderApp, CWinApp )
//}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 ( )
// CReaderApp construction
CReaderApp : : CReaderApp ( )
// The one and only CReaderApp object
CReaderApp theApp;
// CReaderApp initialization
BOOL CReaderApp : : InitInstance ( )
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
//}}AFX _ DATA
// ClassWizard generated virtual function overrides
//}AFX _ VIRTUAL
// Implementation
protected :
//}AFX _ MSG
DECLARE _ MESSAGE _ MAP ( )
CAboutDlg : : CAboutDlg ( ) : CDialog ( CAboutDlg : : IDD )
}AFX _ DATA _ INIT
void CAboutDlg : : DoDataExchange ( CDataExchange* pDX )
}AFX _ DATA _ MAP
BEGIN _ MESSAGE _ MAP ( CAboutDlg, CDialog )
//}AFX _ MSG _ MAP
END _ MESSAGE _ MAP ( )
// App command to run the dialog
void CReaderApp : : OnAppAbout ( )
// CReaderApp commands
Clasa derivata din CFrameWnd.
Creaza dinamic obiectele
Creaza fereastra
Creaza si incarca bara de instrumente ( toolbar ) .
Agata bara de instrumente de chenarul aplicatiei ( docking the toolbar )
Exemplu codul sursa urmator :
// MainFrm.h : interface of the CMainFrame class
#if !defined ( AFX _ MAINFRM _ H _ _ 7EC9070B _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
#define AFX _ MAINFRM _ H _ _ 7EC9070B _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _
#if _ MSC _ VER >= 1000
#pragma once
#endif // _ MSC _ VER >= 1000
class CMainFrame : public CFrameWnd
}AFX _ VIRTUAL
// Implementation
public :
virtual ~CMainFrame ( ) ;
#ifdef _ DEBUG
virtual void AssertValid ( ) const;
virtual void Dump ( CDumpContext& dc ) const;
#endif
protected : // control bar embedded members
CStatusBar m _ wndStatusBar;
CToolBar m _ wndToolBar;
// Generated message map functions
protected :
//}AFX _ MSG
DECLARE _ MESSAGE _ MAP ( )
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined ( AFX _ MAINFRM _ H _ _ 7EC9070B _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
// MainFrm.cpp : implementation of the CMainFrame class
#include 'stdafx.h'
#include 'Reader.h'
#include 'MainFrm.h'
#ifdef _ DEBUG
#define new DEBUG _ NEW
#undef THIS _ FILE
static char THIS _ FILE[] = _ _ FILE _ _ ;
#endif
// CMainFrame
IMPLEMENT _ DYNCREATE ( CMainFrame, CFrameWnd )
BEGIN _ MESSAGE _ MAP ( CMainFrame, CFrameWnd )
//}AFX _ MSG _ MAP
END _ MESSAGE _ MAP ( )
static UINT indicators[] =
// CMainFrame construction/destruction
CMainFrame : : CMainFrame ( )
CMainFrame : : ~CMainFrame ( )
int CMainFrame : : OnCreate ( LPCREATESTRUCT lpCreateStruct )
if ( !m _ wndStatusBar.Create ( this ) ||
!m _ wndStatusBar.SetIndicators ( indicators,
sizeof ( indicators ) /sizeof ( UINT ) ) )
// TODO : Remove this if you don't want tool tips or a resizeable toolbar
m _ wndToolBar.SetBarStyle ( m _ wndToolBar.GetBarStyle ( ) |
CBRS _ TOOLTIPS | CBRS _ FLYBY | CBRS _ SIZE _ DYNAMIC ) ;
// TODO : Delete these three lines if you don't want the toolbar to
be dockable
m _ wndToolBar.EnableDocking ( CBRS _ ALIGN _ ANY ) ;
EnableDocking ( CBRS _ ALIGN _ ANY ) ;
DockControlBar ( &m _ wndToolBar ) ;
return 0;
BOOL CMainFrame : : PreCreateWindow ( CREATESTRUCT& cs )
// CMainFrame diagnostics
#ifdef _ DEBUG
void CMainFrame : : AssertValid ( ) const
void CMainFrame : : Dump ( CDumpContext& dc ) const
#endif // _ DEBUG
// CMainFrame message handlers
Clasa derivata din CDocument
Are o variabila membru protected m _ LineList, derivata din clasa CstringList ( in aceasta variabila se vor stoca datele aplicatiei )
Functii membru pentru accesul la aceasta variabila ( m _ LineList )
Functia DeleteContents apeleaza functia RemoveAll ( sterge intreg continutul documentului )
Functia OnOpenDocument foloseste clasa CstdioFile ( pentru acesul la fisiere )
Exemplu codul sursa urmator :
// ReaderDoc.h : interface of the CReaderDoc class
#if !defined ( AFX _ READERDOC _ H _ _ 7EC9070D _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
#define AFX _ READERDOC _ H _ _ 7EC9070D _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _
#if _ MSC _ VER >= 1000
#pragma once
#endif // _ MSC _ VER >= 1000
class CReaderDoc : public CDocument
// Operations
public :
// Overrides
// ClassWizard generated virtual function overrides
//}AFX _ VIRTUAL
// Implementation
public :
virtual ~CReaderDoc ( ) ;
#ifdef _ DEBUG
virtual void AssertValid ( ) const;
virtual void Dump ( CDumpContext& dc ) const;
#endif
protected :
CStringList m _ LineList;
virtual void DeleteContents ( )
// Generated message map functions
protected :
//}AFX _ MSG
DECLARE _ MESSAGE _ MAP ( )
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined ( AFX _ READERDOC _ H _ _ 7EC9070D _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
// ReaderDoc.cpp : implementation of the CReaderDoc class
#include 'stdafx.h'
#include 'Reader.h'
#include 'ReaderDoc.h'
#ifdef _ DEBUG
#define new DEBUG _ NEW
#undef THIS _ FILE
static char THIS _ FILE[] = _ _ FILE _ _ ;
#endif
// CReaderDoc
IMPLEMENT _ DYNCREATE ( CReaderDoc, CDocument )
BEGIN _ MESSAGE _ MAP ( CReaderDoc, CDocument )
//}AFX _ MSG _ MAP
END _ MESSAGE _ MAP ( )
// CReaderDoc construction/destruction
CReaderDoc : : CReaderDoc ( )
CReaderDoc : : ~CReaderDoc ( )
BOOL CReaderDoc : : OnNewDocument ( )
// CReaderDoc serialization
void CReaderDoc : : Serialize ( CArchive& ar )
else
// CReaderDoc diagnostics
#ifdef _ DEBUG
void CReaderDoc : : AssertValid ( ) const
void CReaderDoc : : Dump ( CDumpContext& dc ) const
#endif // _ DEBUG
// CReaderDoc commands
BOOL CReaderDoc : : OnOpenDocument ( LPCTSTR lpszPathName )
EndWaitCursor ( ) ;
return TRUE;
Clasa derivata din CView
Aici sint doua functii importante :
GetDocument - care face legatura cu documentul pentru a afisa datele continute de variabila m _ LineList
OnDraw - functia care se ocupa de afisarea acestor date
Exemplu codul sursa care urmeaza :
// ReaderView.h : interface of the CReaderView class
#if !defined ( AFX _ READERVIEW _ H _ _ 7EC9070F _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
#define AFX _ READERVIEW _ H _ _ 7EC9070F _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _
#if _ MSC _ VER >= 1000
#pragma once
#endif // _ MSC _ VER >= 1000
class CReaderView : public CView
}AFX _ VIRTUAL
// Implementation
public :
virtual ~CReaderView ( ) ;
#ifdef _ DEBUG
virtual void AssertValid ( ) const;
virtual void Dump ( CDumpContext& dc ) const;
#endif
protected :
// Generated message map functions
protected :
//}AFX _ MSG
DECLARE _ MESSAGE _ MAP ( )
#ifndef _ DEBUG // debug version in ReaderView.cpp
inline CReaderDoc* CReaderView : : GetDocument ( )
#endif
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined ( AFX _ READERVIEW _ H _ _ 7EC9070F _ F96E _ 11D0 _ B9C5 _ 00AA00688598 _ _ INCLUDED _ )
// ReaderView.cpp : implementation of the CReaderView class
#include 'stdafx.h'
#include 'Reader.h'
#include 'ReaderDoc.h'
#include 'ReaderView.h'
#ifdef _ DEBUG
#define new DEBUG _ NEW
#undef THIS _ FILE
static char THIS _ FILE[] = _ _ FILE _ _ ;
#endif
// CReaderView
IMPLEMENT _ DYNCREATE ( CReaderView, CView )
BEGIN _ MESSAGE _ MAP ( CReaderView, CView )
//}AFX _ MSG _ MAP
// Standard printing commands
ON _ COMMAND ( ID _ FILE _ PRINT, CView : : OnFilePrint )
ON _ COMMAND ( ID _ FILE _ PRINT _ DIRECT, CView : : OnFilePrint )
ON _ COMMAND ( ID _ FILE _ PRINT _ PREVIEW, CView : : OnFilePrintPreview )
END _ MESSAGE _ MAP ( )
// CReaderView construction/destruction
CReaderView : : CReaderView ( )
CReaderView : : ~CReaderView ( )
BOOL CReaderView : : PreCreateWindow ( CREATESTRUCT& cs )
// CReaderView drawing
void CReaderView : : OnDraw ( CDC* pDC )
TRACE ( 'nYDelta = %dn',nYDelta ) ;
// CReaderView printing
BOOL CReaderView : : OnPreparePrinting ( CPrintInfo* pInfo )
void CReaderView : : OnBeginPrinting ( CDC* /*pDC*/, CPrintInfo* /*pInfo*/ )
void CReaderView : : OnEndPrinting ( CDC* /*pDC*/, CPrintInfo* /*pInfo*/ )
// CReaderView diagnostics
#ifdef _ DEBUG
void CReaderView : : AssertValid ( ) const
void CReaderView : : Dump ( CDumpContext& dc ) const
CReaderDoc* CReaderView : : GetDocument ( ) // non-debug version is inline
#endif // _ DEBUG
// CReaderView message handlers
Mediul de depanare
Compilarea in mod debug versus compilarea in mod Release
Compilarea in mod debug :
Mediul de dezvoltare Visual Studio ofera o multime de informatii. Implicit caracteristicile de depanare optima nu sint setate ; in general optimizarea acestora fac mult mai dificila depanarea programului.
Compilarea in mod Release :
Implicit compilarea in mod release este optimizata pentru a obtine maximul de viteza si performanta.Aceasta nu ofera informatii pentru depanare.
Meniurile depanatorului
Build Menu
Debug menu
View menu
Edit menu
Barele de instrumente a depanatorului
Accesarea toobarului pentru depanare
Elementele toolbarului pentru depanare :
Fereastrele depanatorului
Fereastra Output :
Afiseaza informatii despre procesul de compilare inclusiv despre orice eroare de compilare, linkeditare, sau altor unelte de builduire si ceea ce transmite pentru afisare functii ca OutputDebugString sau afxDump; afiseaza codul cu care se termina un fir de eexecutie; si semnaleaza aparitia unor exceptii.
Fereastar Watch :
Afiseaza numele si valorile unor variabile si expresii
Fereastra Variables :
Afiseaza informatii despre variabilele folosite in blocul curent si cel anterior si valoarea returnata de functie ( in tabul Auto ) ; variabilele locale ale functiei curente ( tabul Locals ) ; si abiectele de la anumite adrese ( tabul This ) .
Fereastra Register :
Afiseaza continutul geberal al registrilor procesor si statusul acestora ( Numai in Visual C++ )
Fereastra Memory :
Afiseaza cea ce se gaseste in memorie la un momentul curent ( numai Visual C++ )
Feraesatra Call Stack :
Afiseaza cadrul de stiva al tuturor functiilor care au fost apelate si din care nu s-a revenit.
Fereastra Disassembly :
Afiseaza codul in limbaj de asamblare al programului compilat in acel moment.
Cutiile de dialog din depanator
Breakpoints :
Afiseaza o lista cu toate breakpointurile din proiectul curent.Folosind aceasta cutie de dialog se pot noi puncte de oprire a parcurgerii codului.
Exceptions :
Afiseaza exceptiile generate de sistem sau de utilizator din proiectul curent. Cu ajutorul acestei cutii de dialog se poate controla modul in care depanatorul sa trateze aceste exceptii.
QuickWatch :
Afiseaza o variabila sau o expresie. Se utilizeaza pentru a vedea sau modifica rapid o variabila sau o expresie sau pentru a o adauga in fereastra Watch.
Threads :
Afiseaza firele de executie ale aplicatiei disponibile pentru depanare. Se foloseste acesat cutie de dialog pentru a suspenda sau opri din executie un fir de executie si pentru a seta focusul.
Setarea si gestionarea Breakpoints
Setarea Breakpoints - urilor se poate face : la o linie de cod sursa, la inceputul unei functii, la punctul de revenire dintr-o functie, la o eticheta.
Vizualizarea Breakpoints setate
Stergerea breakpoints -urilor
Parcurgerea pas cu pas a unei aplicatii
Lansarea in executie a unei aplicatii si executarea pas cu pas ( Step Into )
( Step into ) Intrarea intr-o anumita functie.
Vizualizarea si modificarea variabilelor
Vizualizarea cadrului de stiva
Rularea in mod debug pina la o locatie specifica din cod
Utilizarea Visual Browse Windows
Setarea optiuniide depanare Just-in -Time
tema laborator :
Utilizarea AppWizard pentru crearea unei aplicatii MFC simple.
Exercitii :
1.Crearea unei aplicatii minimale MFC fara ajutorul AppWizard si ClassWizard ( MinApp )
-se construieste un proiect Win32 Aplication gol.
-se deriva doua clase CMyApp din CWinApp si CMainFrame din CframeWnd ,se include afxwin.h ( in MinApp.h )
-se rescrie functia virtual BOOL InitInstance ( ) ; in clasa CMyApp.
-din meniu Project-Setings ( general ) se include suport MFC.
-se compileaza si lanseaza in executie
2.Crearea unei aplicatii cu AppWizard ( TextEditor )
-aplicatie SDI, fara suport ActiveX, clasa CtextEditorView se deriva din CeditView
-se compileaza si se ruleaza aplicatia .
3.Aplicatie pentru depanare
-se ia o aplicatie existenta ( asemanatoare cu cea creata la exercitiul 2 TextEditor ) numita TextReader
-aceasta citeste fisiere create anterior prin intermediul clasei document unde exista o variabila care pastreaza sirurile din fisietul deschis
-se afiseaza in View si se foloseste macroul TRACE pentru a afisa valoarea unei variabile care da dimensiunea textului in fereastra Output a Debugaru-lui.
-se urmaresc diferentele intre afisarea normala si PrintPreview
4.Depanare - observare a ceea ce se intimpla cu debugarul la lansarea in executie a aplicatiei minimale .
-se ia aplicatia creata in primul exercitiu ( MinApp ) si se urmareste cu debugarul functiile care se apleleaza la lansarea in executie si ordinea lor. ( cel mai mult o aplicatie o petrec
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari : 954
Importanta :
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved