MFC - Biblioteci DLL

Info in rusa despre crearea si utilizarea bibliotecilor DLL.

Biblioteci dll in MFC

MFC - Arhitectura Document/View

Arhitectura Document/View dă posibilitatea de a lega datele cu reprezentările lor pe ecran. Această arhitectură e realizată în clase, care se crează cu ajutorul AppWizard.

În carcasa arhitecturii MFC, documentul reprezintă un obiect ce conţine datele aplicaţiei. Reprezentarea e un obiect de tip fereastră, de obicei legat cu partea ferestrei clientului pe ecran, prin care utilizatorul completează documentul cu date. Reprezentările dau posibilitatea de a reprezenta un document prin diferite metode.

 

Obiect

Descriere

Document

Clasa obiectului e derivată de la clasa Cdocument. Aces obiect defineşte datele.

Reprezentare

Derivată de la Cview. Reprezintă afişarea pe ecran şi interacţionează cu utilizatorul.

Frame

Derivată de la CframeWnd.

Şablonul documentului

Derivat de la CDocTemplate. Dirijează procesul de creare a reprezentării documentelor şi ferestrelor. O clasă şablon răspunde de toate documentele deschise.

Aplicaţie

Derivată de la CWinApp.

 

Şablonul Documentului

Crearea obiectelor şablon de tip corespunzător se face cu ajutorul funcţiei InitInstance(). Această funcţie se află in obiectul aplicaţie şi setează toate datele. La etapa creării şablonului se leagă clasa şablon cu resursele fereastră şi reprezentare.

Şablonul se adaugă prin funcţia CWinApp::AddDocTemplate();

Document

Documentul deschide şi salvează datele şi le dirijează. El are funcţii de accesare la date şi prelucrearea lor pentru interacţiunea dintre reprezentări şi documente. Fiecare obiect de document conţine lista de reprezentări legate cu el, acces la care se face prin funcţiile clasei CDocument: GetFirstPosition(), GetNextView().

CDocument conţine funcţia UpdateAllViews() ce transmite la toate reprezentările legare de document mesajul de necesitate a redesenării ferestrei

Obiectul de reprezentare răspunde de interacţiunea cu obiectul. Acest obiect afişează informaţia din document şi posibilitatea utilizatorului de a introduce sau schimba date.

Cu un document pot fi legate mai multe reprezentări, dar o reprezentare poate aparţine numai unui document.

Dacă la etapa de creare a aplicaţiei cu AppWizard nu indicăm clasa pentru reprezentare, atunci reprezentarea va fi bazată pe clasa CView.

MFC - Prelucrarea Evenimentelor

Lucrul in SO Windows e pus în baza prelucrării evenimentelor. Când utilizatorul lucrează cu tastatura, mouse-ul,etc, driver-ul generează evenimentele ce descriu lucrul utilizatorului. Evenimentele, la prima etapă, nimeresc în rândul evenimentelor SO. Din acest rând evenimentele se transmit la aplicaţiile le care sunt destinate şi se înscriu în rândul de evenimente al aplicaţiei. Aplicaţia, în ciclul de prelucrarea a evenimentelor, scoate câte un eveniment şi transmite funcţiei de prelucrare, care prelucrează evenimentul.

Ciclul de prelucrare de obicei conţine WHILE în care, ciclic, se apelează funcţiile GetMessage() şi DispatchMessage(). În aplicaţii mai complexe ciclul de prelucrare a evenimentelor conţine apelul altor funcţii – TranslateMessange(), TranslateAccelerator(), care fac prelucrarea preventivă a evenimentelor.

Funcţia de prelucrare a evenimentelor controlează ce eveniment a venit la prelucrare şi-l apelează. Dacă la crearea aplicaţiei a fost folosită biblioteca MFC, atunci clasele prelucrează evenimentele. Fiecare clasa ce are ca părinte clasa CcmdTarget poate să prelucreze evenimente. Clasa poate prelucra evenimente dacă are tabel de evenimente(Event Map). În acest tabel pentru fiecare eveniment se indică metoda clasei care prelucrează acest eveniment.

Sunt 3 tipuri de evenimente:

  1. Evenimente Windows
  2. Mesaje de la elemente de control
  3. Evenimente de comenzi(comenzile)

Evenimetele Windows sunt acelea care au prefixul WM_, în afară de WM_COMMAND. Toate evenimentele din această categorie sunt menite spre prelucrare de către ferestre si prezentări şi deseori conţin parametri ce determină algoritmul de prelucrare a unui eveniment.

A doua categorie include mesaje(notification message) de la elemente de control şi alte ferestre derivate care transmit mesaje „părinţilor săi”.

NB! Mesajul BN_CLICKED de la elementrul BUTTON se înţelege ca şi eveniment de comandă şi se transmite ca şi o comandă.

Evenimentele acestor 2 categorii sunt menite pentru clasele derivate din CWnd, adică cele care au descriptorul HWND al ferestrei Windows.

Evenimentele de comenzi includ toate evenimentele WM_COMMAND, care se transmit de la obiectele interface-ului utilizatorului – meniu, butoanele din bara de instrumente şi butoanele acceleratoare.

Un tablou de evenimente pune în corespondenţă unui eveniment o funcţie, astfel încât la un eveniment întâmplat mesajul evenimentului de transmite la funcţia corespunzătoare.

Un tablou nu poate conţine mai mult decât o macro-comandă pentru un eveniment. Există un grup mic de evenimente standarte ce au metode care se apelează implicit(ID_FILE_OPEN -> ON_FILE_OPEN)

Serializarea datelor

Serializare – păstrarea stării obiectelor.

 

Necesitatea in păstrarea datelor constante crează probleme adăugătoare la etapa de elaborare a produselor OO. Carcasul aplicaţiei ajută să realizeze această situaţie care se num serializare.

Serializare – o metodă de păstrare a structurilor de date la etapa salvării sau restabilirii din fişier.

Serializarea este implicită in MFC şi este realizată în clasa Cobject. Pentru a susţine serializarea claselor derivare din Cobject tre de redefinit funcţie serialize:

Void Cobject::Serialize(Carchive& ar)

{

      If(ar.isStoring()) //daca salvam – true, daca citim - false

      {//…}

      Else

      {//…}

}

Serializarea arhivează diferite date din clasă şi restabileşte sau salvează aceste date din obiectul clasei CArchive. CArchive realizează un mecanism de buferizare. Fiecare obiect CArchive se folos pentru salvare sau citere, dar niciodata pentru ambele.

Obiectul CArchive trăieşte in timpul parcurgerii fişierului de salvare sau citire, la sfârşit obj se dirstruge. Pentru serializare in fişier si restabilire din fişier, de fiecare dată se crează alt obiect CArchive.

 

Ce tipuri de date pot fi serializare?

-         word

-         dword

-         double

-         int

-         Cstring

-         Float

-         Structura Point si clasa CPoint

-         Structura Rect si clasa CRect

-         Etc.

 

 

In fisierul mc.h se scrie:

 

#pragma once

class MyClass : public CObject

{

     DECLARE SERIAL(MyClass)

     char* ttt;

     int x;

     public:

          MyClass();

          virtual void Serialize(CArchive &ar);

}

 

In fisierul mc.cpp se scrie:

 

#include „mc.h”

IMPLEMENT_SERIAL(MyClass, Cobject,1) //1 se scrie pentru frumusete.

void MyClass::Serialize(Carchive &ar)

{

     if (ar.isStoring())

     {

          ar<<ttt;  //sau ar<<(CString)ttt;

          ar<<x;

     }

     else

}

 

Clase container:

-         CArray

-         CList

-         CMap

 

Cum se serializează aceste tipuri?

CList <int, &int> m_ilist;

=> m_ilist.Serialize(ar);

 

Există o funcţie pentru serializarea listelor claselor proprii

template <class Type>

void AFXAPI SerializeElementes(CArchive ar, Type *pEl, int nCount)

 

CList <MyClass, MyClass&> mlist;

=>

template <>

void AFXAPI SerializeElementes(CArchive &ar, MyClass* p *pEl, int nCount)

{

     for(int i=0; i<nCount; i++)

     {

          p->Serialize(ar);

          p++;

     }

}

Desenarea şi vizualizarea preventivă

În Windows Aplicaţii şi dispozitive de ieşiri interacţionează cu ajutorul interfeţei dispozitivelor grafice(GDI – Graphical Device Interface). Utilizarea acestei interfeţe garantează ieşirea corectă la toate dispozitivele compatibile cu GDI.

GDI dirijează cu structura datelor, ce se numeşte contextul dispozitivului, care conţine info despre atributele curente a dispozitivului dat.

În WinAPI (Application Programming Interface) sunt funcţii GDI pentru desenarea liniilor si a altor figuri geometrice, afişarea la ecran, etc. Toate aceste funcţii afişează datele la contextului dispozitivului, descriptul cărora se transmite ca parametru.

In MFC contextul disp si majoritatea funcţiilor GDI sunt incapsulate in clasa CDC. În această clasă sunt realizate funcţii pentru createa si init contextului dispozitivului şi funcţii pentru desenarea.

In afară de clasa CDC exista un set de clase derivate de la CDC:

-         CPlaintDC – incapsuleaza contextul dispozitivului, care se foloseşte pentru redesenare părţii neaccesibile a ecranului

-         CClientDC – descrie contextul dispozitivului, ce prezintă partea clientă a ferestrei.

-         CWindowDC – incapsulează contextul dispozitivului, ce reprezintă toată fereastră, inclusiv chenarul.

-         CMetafileDC – conţine un set de structuri ce păstrează imaginea aplicaţiei în format independent de hardware.

 

 

Desenarea prin reprezentare

Afişarea grafică a datelor aplicatiei se face cu ajut funcţiei OnDraw. În clasa derivată din Cview creata de AppWizard, există funcţia:

void CAppView::OnDraw(CDC* pDC)

{

      CappDoc* pDoc=GetDocument();

      ASSERT_VALID(pDoc); //controleaza daca pointerul este valid

      //…

      pDC->TextOut(10,10,_T(„Hello World!!!”));

}

 

Funcţia OnDraw primeste ca param un obj CDC. El trebuieşte pentru apelarea la funcţia de desenare din contextul dispozitivului. Înca funcţia OnDraw primeşte pointer la obj documentului care se folos pentru utilizarea datelor aplicaţiei. Dacă schimbarea datelor din document poate să reacţioneze la reprezentare, atunci vederea tre să fie redesenată. De obicei avcesta se intâmplă la intoducerea schimbării în vederea de utilizator. Codul ce reînnoieste datele din document tre să apeleze funcţia UpdateAllViews, care spune tuturor reprezentărilor ca tre să fie redesenate.

 

Print şi Preview

 

În prigramarea sub Win nu este diferentă intre desenare pe ecran si printare, fiindcă GDI are o interfaţă independentă de hardware. Unele şi aceleaşi funcţii pot fi util pentru reprez datelor la ecran şi pentru tipărirea la printer în dependenţă de contextul dispozitivului.

Biblioteca MFC dă posibilitate de a realiza funcţii de tipar fără a aplica efortul utilizatorului. Carcasul aplicaţiei singur crează de tip dialog si contextul dispozitivului pentru printer.

Introducere in MFC

Microsoft Foundation Class – o biblioteca de clase dezvoltată de Microsof în vederea uşurătii programării aplicaţiilor Windows. Multe dintre clasele MFC incapsulează funcţiile WinAPI, dar permit o utilizare mai prietenoasă a acestora. Folosind clasele din biblioteca MFC, aplicaţiile Windows se pot programa obiectual de o manieră mult mai simplă decât permite API. Acest fapt ne dă avantaje:

  1. creşte semnificativ lezibilitatea codului,
  2. se simplifică programarea aplicaţiilor prin folosirea claselor deja implementate
  3. se micşorează timpul de elaborare a unei aplicaţii Windows
  4. programatorul are posibilitatea de a se concentra numai asupra aspectelor particulare aplicaţiei
  5. se pot folosi în Wizards.

 

Clasele incluse in MFC sunt puse ăn mai multe categorii:

  1. Clase de uz general
    1. Manipularea fişierelor(CFile) şi şirurilor de caractere(CString)
    2. Excepţii(CException)
    3. Reprezentarea unor zone de pe ecran.
  2. Clase de obiecte vizuale
    1. Ferestre(CWnd, CFrameWnd)
    2. Meniuri (CMenu)
    3. Controale (Cbar, CeditBox, CListBox)
    4. Obiecte de desenare (Cpen, CBrush)
  3. Clase de aplicaţie
    1. Fire de execuţie(CWinThread)
    2. Aplicaţia(CWinApp)
    3. Arhitectura Document/View (Cdocument, CView)
  4. Clase de tip colecţie
    1. Tablou (CArray)
    2. Lista (CList)
    3. Harta (CMap)
  5. Clase suport OLE2
  6. Clase pentru BD (CDatabase)
  7. Clase pentru aplicaţiile in reţea

 

Clasele implementate în biblioteca folosesc moştenirea simplă. Majoritatea claselor sunt derivate direct sau indirect din clasa Cobject. De asemenea toate clasele ce reprezinta ferestre sau controale sunt derivate din CWnd.

Clasele Cobject utilizează funcţiile virtuale pentru implementarea polimorfismului ăn clasele derivate. Aceasta permite obiectelor din program sa acceseze funcţii de uz general prin intermediul unui pointer la clasa de bază.

Carte MFC

O carte destul de buna, numai k e in limba rusa. Descarcati cartea aici - MFC



FreeWM.ru - WebMoney нахаляву!
Ошибка, внешние коннекты на хостинге отключены, обратитесь к хостеру или попробуйте CURL.