Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Resurse Windows
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

 

Majoritatea programelor Windows folosesc un mic desen pentru a simboliza aplicatia cind este minimizata-aceasta este un icon. Unele programe, de exemplu s4u1ux
Paintbrush, folosesc in functie de actiunea selectata pentru spatiu de lucru, un cursor specific. Tot in acest program intilnim meniuri si tool-boxuri, acestea din urma fiind "cutii de scule", fiecare reprezentata printr-un desen sugestiv - bitmap. Daca mai amintim ca nu prea exista program care sa nu lanseze cel putin un Dialog Box - fereastra de dialog, ajumgem la concluzia ca majoritatea obiectelor ce compun imaginea si modul de interactiune a aplicatiei sunt astfel de RESURSE.
Resursele sunt date incluse in fisierul executabil .EXE, dar care nu rezida in segmentul normal de date al aplicatiei. Cand Windows incarca un program in memorie in vederea executiei, de obicei lasa pe disc partea sa de resurse. Abia cand e nevoie de o anumita resursa, ea este incarcata in memorie si pusa la dispozitia aplicatiei. (Probabil ca s-a observat deja aceasta comportare dinamica in utilizarea resurselor cind s-a folosit o aplicatie
Windows. La prima invocare a unei ferestre de dialog timpul de raspuns a fost mai mare, tocmai datorita accesului la disc.)
Majoritatea resurselor sunt date read-only si sunt de tip DISCARDABLE.
Acestea inseamna ca atunci cand nucleul are nevoie de mai multa memorie, spatiul alocat resurselor este eliberat, ele urmand sa fie reincarcate la nevoie. Asa cum mai multe instante ale aceleiasi aplicatii folosesc in comun aceeasi zona de cod, tot asa si resursele sunt folosite in comun de toate instantele aceleiasi aplicatii. Mai mult, exista resurse ale nucleului resurse predefinite- ce pot fi utilizate de orice aplicatie care ruleaza sub
WINDOWS.
Iata tipurile de resurse acceptate de Windows:
*ICON-icon
*CURSOR-cursor
*BITMAP-desen in pixeli
*STRINGTABLE-tabele cu siruri de caractere
*MENU-meniu
*ACCELERATORS-acceleratori (combinatie de taste care echivaleaza o comanda dintr-un meniu)
*DIALOG-fereastra de dialog
*FONT-set de caractere
*Resurse definite de utilizator

Compilarea resurselor




In timpul dezvoltarii programului resursele sunt definite intr-un fisier text -"resource script"-cu extensia .RC.Acest fisier poate contine reprezentarea
ASCII a resurselor sau referinte inspre alte fisiere bimare sau ASCII ce contin resurse. Compilatorul de resurse RC.EXE compileaza acest fisier sursa de descriere a resurselor si adauga modulul binar obtinut la sfirsitul fisierului .EXE generat cu LINK, creind si un "tablou de resurse" in headerul executabilului.
Compilatorul de resurse poate fi folosit in una din urmatoarele posibilitati:
-compilarea resurselor si adaugarea lor la fisierul executabil intr-un singur pas;
RC numefis unde numefis.RC este numele fisierului de resurse, iar numefis.EXE este numele fisierului link-editat. Daca numele celor doua fisier difera comanda devine
RC fisresa.RCi fisexea.EXEi
-resursele pot fi compilate intr-o forma binara si salvate intr-un fisier cu extensia .RES,cu linia de comanda:
RC -r numefis
Fisierul binar numefis.RES se obtine prin compilarea fisierului numefis.RC.In continuare resursele se adauga la fisierul executabil numefis.EXE cu comanda
RC numefis.RES
In cazul in care programul nu are resurse ,trebuie totusi rulat compilatorul pentru a fi introduse in executabil specificatiile absentei resurselor cu comanda
RC numefis.EXE
Deoarece in timpul dezvoltarii programului modificarile asupra codului sunt mult mai frecvente asupra resurselor, este recomandata utilizarea metodei a doua care nu face decit sa adauge forma binara a resurselor - o singura data compilata - la fisierul executabil. In concordanta cu acestea fisierul .MAK va fi ca w2.mak
Prima actiune indica obtinerea executabilului care depinde de rezultatul compilarii sursei .C si resurselor .RES, la link fiind necesar si modulul de definire a aplicatiei .DEF.
Sectiunea a doua este dedicata compilarii sursei .C, iar ultima compilarii resurselor in fisierul .RES. Programul NMAKE va parcurge acest proiect urmarind daca fisierele .OBJ, .DEF, .RES s-au modificat. Daca da, va executa din nou prima sectiune pentru obtinerea unui nou .EXE. La fel pentru sectiunea a doua si a treia - o modificare in lista fisierelor de dependenta provoaca executia sectiunii pentru obtinerea unui nou modul actulizat.

Crearea resurselor

In mediile de dezvoltare de aplicatii sub Windows exista editoare de resurse.
Exista editoare specializate chiar pe anumite resurse, de exemplu in mediul
Microsoft SDK 6.0 (Software Development Kit) avem SDK_PAINT pentru crearea de icon-uri, cursori sau desene in mod pixel-bitmap ,iar pentru editarea ferestrelor de dialog exista programul DIALOG. Totusi cele mai comode editoare de resurse sunt cele din diferitele versiuni ale firmei BORLAND pentru dezvoltare de aplicatii sub Windows - la inceput WRT ,WhiteWater Resources, apoi Workshop.
Acestea sunt medii complete de lucru asupra resurselor ,putind chiar edita resurse ale unui program .EXE avind toate "sculele" pentru lucrul la resurse si putind salva in forma .RC sau .RES (caz in care apeleaza compilatorul de resurse).

Utilizarea resurselor

Ca o prima introducere in aceasta lume a programarii vizuale se prezinta o a doua versiune a programului "salut" care va lucra cu resurse atasate aplicatiei. S-au folosit in acest exemplu toate tipurile de resurse, mai putin
FONT, spre a va face o idee clara despre utilitatea fiecareia, despre modul de integrare in aplicatie si despre utilizare.

Modulul .MAK

Fisierul de descriere pentru NMAKE s-a comentat in sectiunea anterioara despre compilarea resurselor. Trebuie remarcat doar faptul ca mediile integrate de dezvoltat programe sub C cum este PWB - Programmers WorkBench de la Microsoft C 6.0 sau mediul TURBO al firmei BORLAND permit deschiderea unor proiecte - "Project" - cu module de toate tipurile necesare pentru o aplicatie Windows. Este suficient crearea unui proiect cu numele "w1" in care se insereaza modulele w2.c, w2.def si w2.rc. Construirea aplicatiei se rezolva automat pe baza switch-urilor fixate in meniul de optiuni al mediului, switch-uri referitoare la tipul aplicatiei, compilare, link-editare etc. Deoarece lucram sub un astfel de mediu nu se va mai scrie de acum inainte modulul .MAK.
Cel din exemplul dat ramine ca model pentru aplicatii construite cu NMAKE, evident modificind numele fisierelor destinatie si ale celor de dependenta.

Modulul .DEF

S-a pastrat exact acelasi fisier doar ca s-au modificat cimpurile NAME si
DESCRIPTION in concordanta cu noul program.

Modulul .H

Acest modul a aparut ca o necesitate de a lucra cu identificatori pentru diferite elemente de comanda descrise in resurse si folosite in program.
Acesti identificatori sunt nume simbolice pentru elementele unor dispozitive de "comanda" ale interfetei :butoane, elemente de meniu, liste etc., intr-un cuvint controale -controls- ce trimit spre fereastra aplicatiei diferite mesaje, dar cu precadere WM_COMMAND. In acest mesaj un parametru si anume
wParam specifica un intreg ce identifica controlul respectiv. Acestor identificatori le sunt atribuite numele simbolice de care vorbim. Prefixul lor a fost ales IDM_ pentru cei care desemneaza elemente de meniu si IDS_ pentru cei care desemneaza siruri de caractere.
Fisierul header w2.h apare in declaratiile de #include la ambele module w2.c si w2.rc.

Modulul .RC

Acesta este modulul de descriere a resurselor atasate aplicatiei. Dupa cum se vede, este un fisier text in care sunt enumerate resursele pe baza unui limbaj specific. Modulul incepe prin declaratiile de includere a header-ului
"w2.h" care cuprinde definitiile pentru identificatori. In continuare s-au declarat resursele grafice Desenul, Iconul si Cursorul prin declaratiile BIT MAP, ICON si respectiv CURSOR care specifica tipul resursei, urmate de numele fisierelor corespunzatoare cu imaginea acestora.
BITMAP este o resursa grafica in care este descrisa o zona de informatie grafica printr-o succesiune de valori corespunzatoare pixelilor ce o compun.
Resursa incepe cu o structura de date de descriere BITMAPINFOHEADER cu informatii despre marime, dimensiune verticala, orizontala, plane de culoare
(1), numar de biti pe pixel (1,4,8 sau 24) etc. Apoi urmeaza o descriere a culorilor prin structura RGBQUAD, urmata de bitii corespunzatori pixelilor.
Spre deosebire de BITMAP, resursele CURSOR si ICON contin doar matrici de pixeli, una este masca, iar a doua desenul propriu-zis. Operatia de afisare pe ecran se face dupa formula : pixDisplay = (pixDisplay & pixMasca)^pixDesen acesta deci inseamna ca acolo unde masca este 0 se va obtine un pixel din desen, iar pentru masca 1 se va face o operatie SAU_EXCLUSIV intre pixelul din ecran si cel din desen. Masca este o imagine alb-negru cu 1 pixel pe 1 bit, in timp ce imaginea poate fi color (4 biti/pixel-16 culori). Totusi operatia de inversare a culorii de pe ecran (masca=1) se face doar cind toti
4 bitii imaginii sunt pe 1. Aceasta in ceea ce priveste ICON-ul care poate fi color, deoarece CURSOR este o resursa alb-negru intotdeauna, cu imagine si masca in raport de 1 pixel la 1 bit.
Toate aceste observatii referitoare la resursele grafice sunt informatii pentru a intelege ce se ascunde in spatele lor. De obicei acest lucru nu trebuie sa preocupe deoarece editoarele de resurse fac totul, programatorilor ramanandu-le doar "creatia artistica".
Revenind acum asupra fisierului .RC in continuare sunt descrise celelalte resurse. DIALOG-ul "Despre" este o structura ce descrie asa-numitul sablon de baza caruia functia care lanseaza (creaza) fereastra poate sa o construiasca in conformitate cu specificatiile noastre. In acest sablon se precizeaza pozitia ferestrei relativ la parintele ei, stilul ferestrei, titlul si setul de caractere utilizat in ea, dupa care intre BEGIN si END sunt precizate ferestrele "copil" ale dialogului - adica controalele din ea. Fiecare control este un tip standard (ICON-icoana, LTEXT-text aliniat stanga, PUSHBUTTON-buton de apasare) urmat de identificatorul sau, de exemplu IDOK (identificator predefinit in windows.h la valoarea 1), apoi pozitia relativ la parintele sau
- spatiul de lucru al ferestrei de dialog, iar in final atributele (construite si ele din flag-uri predefinite). Problema nu este crearea unor astfel de ferestre de dialog - DialogBox-uri. Editoarele de resurse stiu sa faca aproape toata munca, pentru programatori ramanind in acest caz manifestarea doar a fanteziei in concordanta cu utilitatea dorita. Acelasi lucru se poate spune si despre crearea meniului. Un editor de meniuri ajuta copios la crearea acestora noi trebuind sa completam doar continutul elementelor si identificatorul lor, care va anunta functia ferestrei care are acest meniu de actiunea utilizatorului.

In textul atasat fiecarui element din POPUP-ul "Meniu" observati un simbol "&".
Acesta provoaca afisarea literei urmatoare cu o linie de subliniere _ litera fiind astfel utilizabila la selectarea elementului dorit. Tot in acest text pot fi trecute caracterele selectate de noi ca acceleratori.
Ajungem astfel la acest nou tip de resurse care da programatorului posibilitatea de a defini niste "scurtaturi" pentru lansarea unor comenzi atasate unor elemente de meniu de obicei. Observati ca sirul de caractere
"^S" este atasat identificatorului IDM_SCRIE - aceasta provocand urmatorul lucru : cand utilizatorul vrea sa lanseze din meniu comanda de "Scrie in fereastra" el poate s-o lanseze fara a mai deschide meniul si selecta elementul ci, pur si simplu, apasand simultan CONTROL+S.
A mai ramas de prezentat sectiunea STRINGTABLE. Este o resursa cu ajutorul careia putem integra in executabil, intr-o maniera eleganta, diferite mesaje, texte etc. la care dorim sa avem acces usor la nevoie. Accesul la un astfel de sir se face prin incarcarea resursei corespunzatoare unui identificator atasat: de exemplu IDS_SCRIE.
Tot fisierul w2.rc poate fi generat automat in urma editarii anumitor resurse si atasarii lor la "proiectul resurselor". De asemenea fisierul w2.h a fost completat automat pe masura ce s-au introdus identificatori de specificare a diferitelor controale al caror mesaj dorim sa fie prelucrate in program. Pentru aceasta se poate folosi Workshop (la Borland C++ 3.x).

Aplicatia w2 are urmatoarele actiuni :
- La o selectie din "Meniu" a optiunii "Scrie fereastra", la o apasare a butonului din stanga a mouse-ului sau de la tastatura la un CONTROL+S, deseneaza in spatiul ferestrei un bitmap dupa care afiseaza un mesaj
"Bravo, m-ai redesenat !" intr-un DialogBox cu titlul "Mesaj...", un icon cu semnul exclamarii si un buton "OK".
- In replica, la o selectie "Sterge fereastra" din "Meniu", apasare a butonului din dreapta al mouse-ului sau CONTROL+T de la tastatura, fereastra va fi stearsa si va aparea un DialogBox cu un semn de intrebare si mesajul
"DE ce m-ai sters ?"
Remarcati ca in spatiul de lucru al ferestrei aplicatiei veti avea un cursor, iar la minimizare fereastra va fi reprezentata de un icon.
La selectia elementului "Despre aplicatie" din "Meniu" va aparea
DialogBox-ul definit in resurse care se inchid prin "Close" din meniul sistem sau apasare pe butonul "Bine".

--------------------------------------------------------------

//************************************************************
//
//program -prog2.c
//scop -Al doilea exemplu de aplicatie sub Windows.
//
//************************************************************

#include <windows.h>
#include "w2.h"

HANDLE hInst,hAccel;
HBITMAP hBitmap;
BITMAP bm;

long FAR PASCAL WndProcSalut( HWND, WORD, WORD, LONG);
BOOL FAR PASCAL Despre( HWND, WORD ,WORD, LONG);

#pragma argsused int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int cmdShow)
A
HWND hWnd;
MSG msg;
WNDCLASS wndClass;

hInst=hInstance; if(!hPrevInstance)A
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpszClassName="Salut";
wndClass.lpfnWndProc=(WNDPROC)WndProcSalut;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInst;
wndClass.hIcon=LoadIcon(hInst,"Iconul");
wndClass.hCursor=LoadCursor(hInst,"Cursorul");
wndClass.lpszMenuName="Meniul";
wndClass.hbrBackground=GetStockObject(WHITE_BRUSH);
RegisterClass(&wndClass);
S hBitmap=LoadBitmap(hInst,"Desenul");
GetObject(hBitmap,sizeof(BITMAP),&bm);

hWnd=CreateWindow(
"salut",
"Al doilea program",
WS_POPUPWINDOW|WS_CAPTION|
WS_MINIMIZEBOX,
0,
0, bm.bmWidth, bm.bmHeight+
GetSystemMetrics(SM_CYBORDER)+
GetSystemMetrics(SM_CYCAPTION)+
GetSystemMetrics(SM_CYMENU),
NULL,
NULL, hInstance,
NULL);
ShowWindow(hWnd,cmdShow);
UpdateWindow(hWnd);

hAccel=LoadAccelerators(hInst,"Acceleratori");

while(GetMessage(&msg,NULL,0,0))A if(!TranslateAccelerator(hWnd,hAccel,&msg))A
TranslateMessage(&msg);
DispatchMessage(&msg);
S
S
DeleteObject(hBitmap); return(msg.wParam);
S

long FAR PASCAL WndProcSalut(HWND hWnd,WORD message,WORD wParam,LONG lParam)
A switch(message)A case WM_PAINT:
A
HDC hDC,hMemDC;
HBITMAP hOldBitmap;
PAINTSTRUCT ps; hDC=BeginPaint(hWnd,&ps); hMemDC=CreateCompatibleDC(hDC);
SelectObject(hMemDC,hBitmap);
BitBlt(hDC,0,0,bm.bmWidth,bm.bmHeight,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
EndPaint(hWnd,&ps); break;
S case WM_RBUTTONDOWN:
SendMessage(hWnd,WM_COMMAND,IDM_STERGE,0L); break; case WM_LBUTTONDOWN:
SendMessage(hWnd,WM_COMMAND,IDM_SCRIE,0L); break; case WM_COMMAND: switch(wParam)A case IDM_SCRIE:
InvalidateRect(hWnd,NULL,FALSE);
UpdateWindow(hWnd);
A char buffa32i;

LoadString(hInst,IDS_SCRIE,buff,32);
MessageBox(hWnd,buff,"Mesaj:",MB_OK|MB_ICONEXCLAMATION);
S break; case IDM_STERGE:
A
HDC hDC; char buffa32i;

hDC=GetDC(hWnd);
SendMessage(hWnd,WM_ERASEBKGND,hDC,0);

LoadString(hInst,IDS_STERGE,buff,32);
MessageBox(hWnd,buff,"Mesaj:",MB_OK|MB_ICONQUESTION);
S break; case IDM_DESPRE:
A
FARPROC fpDespre;

fpDespre=MakeProcInstance(Despre,hInst);
DialogBox(hInst,"Despre",hWnd,fpDespre);
FreeProcInstance(fpDespre);
S break; case IDM_EXIT:
DestroyWindow(hWnd); break;
S break; case WM_DESTROY:
PostQuitMessage(0); return 0;
S return(DefWindowProc(hWnd,message,wParam,lParam));
S

#pragma argsused
BOOL FAR PASCAL Despre( HWND hDlg, WORD message,WORD wParam , LONG lParam)
A switch (message)A case WM_COMMAND: switch(wParam)A case IDOK: case IDCANCEL:
EndDialog(hDlg,NULL); break;
S break; default: return(FALSE);
S return(TRUE);
S

#include"w2.h"
Desenul BITMAP "bitmap.bmp"
Iconul ICON "icon.ico"
Cursorul CURSOR "cursor.cur"
Meniul MENU BEGIN
POPUP "&Meniu"
BEGIN
MENUITEM "&Scrie in fereastra ^S", IDM_SCRIE
MENUITEM "S&terge fereastra ^T", IDM_STERGE
MENUITEM SEPARATOR
MENUITEM "&Despre aplicatie",IDM_DESPRE
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
END
END
Despre DIALOG 57,37,101,56
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Despre aplicatie..."
FONT 10,"System"
BEGIN
ICON "Iconul", -1,8,6,18,20, WS_CHILD | WS_VISIBLE
LTEXT "Salut Windows!",-1,32,10,54,10,
WS_CHILD | WS_VISIBLE | WS_GROUP
LTEXT "Al doilea exemplu din curs",-1,5,26,90,10,
WS_CHILD | WS_VISIBLE | WS_GROUP
PUSHBUTTON "Bine", IDOK,4,36,92,14,
WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
Acceleratori ACCELERATORS
BEGIN
"^S",IDM_SCRIE
"^T",IDM_STERGE
END
STRINGTABLE
BEGIN
IDS_SCRIE,"Bravo,m-ai redesenat!"
IDS_STERGE,"De ce m-ai sters?"
END

--------------------------------------------------------------

#define IDS_SCRIE 120
#define IDS_STERGE 121
#define IDM_SCRIE 101
#define IDM_STERGE 102
#define IDM_DESPRE 103
#define IDM_EXIT 104

--------------------------------------------------------------

NAME Salut
DESCRIPTION "Al doilea program sub Windows"
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'

CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
STACKSIZE 8192

EXPORTS WndProcSalut

--------------------------------------------------------------

Sa explicam sursa modulului w2.c.
Preambulul cuprinde declaratia de includere si a header-ului "w2.h" pentru a putea utiliza identificatori simbolici atasati controalelor definite in resurse. Mai exista de asemenea citeva declaratii de global asupra carora se va reveni la momentul potrivit.

Functia WinMain

Incarcarea structurii wndClass ce va fi utilizata la inregistrarea clasei de ferestre pentru aplicatia noastra are citeva modificari. Handle-ul pentru icon si cursor este furnizat de functia LoadIcon() respectiv LoadCorsor() care vor aduce din instanta aplicatiei resursele "Iconul" si "Cursorul" desenate de noi. Acestea vor caracteriza toate ferestrele ce vor fi create pe baza clasei "Salut". In plus toate ferestrele vor avea meniul "Meniul", deoarece numele acestei resurse a fost trecut in elementul wndClass.lpszMenuName.

Dupa inregistrarea clasei de ferestre se obtine handle-ul hBitmap prin apelul functiei LoadBitmap() care va incarca desenul "Desenul". Trebuie precizat aici ca aceste functii care incarca resurse obtin de la nucleu un bloc de memorie din heap-ul global, pe care il actualizeaza cu informatiile specifice resursei respective, returnand handle-ul acestui bloc. Considerati deci, de aici inainte, aceste blocuri specifice ca "obiecte" identificabile prin handle-ul primit de fiecare la alocare. Cu aceste precizari functia urmatoare
GetObject() poate fi explicata: ea va copia informatii legate de obiectul a carui handle este hBitmap in structura definita local, BITMAP bm, pe o lungime egala cu marimea acestei structuri.
Aceste informatii privitoare la desen ne vor folosi in continuare, caci pe baza dimensiunilor desenului vom putea preciza cat de mare trebuie sa fie fereastra la creare. Iata ca functia CreateWindow va crea o fereastra pe baza clasei "Salut", cu titlul "Al doilea program", stilul WS_POPUP - fereastra simpla combinat cu WS_CAPTION - bara de titlu si WS_MINIMIZEBOX - buton de minimizare, pozitionata in ecran la (x,y)=(0,0), avand latimea desenului
(bm.bmWidth) si inaltimea compusa din cea a desenului (bm.bmHeight), inaltimea chenarului, inaltimea titlului si a meniului. Ultimele trei date au fost aflate de la nucleu prin intermediul functiei GetSystemMetrics() ce furnizeaza dimensiunile curente ale diferitelor elemente ce intra in componenta unei ferestre specificate prin identificatorii simbolici indicati ca parametru
(SM_SystemMetric, CX-Contor dim.X-latime, CY-Contor dim.Y-inaltime) si definitii in "windows.h". O lista completa a lor o gasiti in tabelul 1.

ÉIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIÑIIIIIIIIIIIIIIIIIIII»
º Descriere ³ Identificator º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º Elemente globale ale ecranului º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune ecran pixeli ³ SM_CXSCREEN º
º ³ SM_CYSCREEN º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune icon ³ SM_CXICON º
º ³ SM_CYICON º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune cursor ³ SM_CXCURSOR º
º ³ SM_CYCURSOR º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune minima fereastra ³ SM_CXMIN º
º ³ SM_CYMIN º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune zona de lucru intr-o ³ SM_CXFULLSCREEN º
º fereastra maxima ³ SM_CYFULLSCREEN º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune cadru fereastra ³ SM_CXFRAME º
º ³ SM_CYFRAME º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune cadru fereastra de dialog³ SM_CXDLGFRAME º
º ³ SM_CYDLGFRAME º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune minima la deplasare ³ SM_CXMINTRACK º
º fereastra ³ SM_CYMINTRACK º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune chenar fereastra ³ SM_CXBORDER º
º ³ SM_CYBORDER º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º Elemente de fereastra º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune bara titlu ³ SM_CYCAPTION º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune fereastra Kanji (pentru ³ SM_CYKANJIWINDOW º
º meniu sistem) ³ º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune butoane min/maximizare ³ SM_CXSIZE º
º ³ SM_CYSIZE º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune bara meniu ³ SM_CYMENU º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune bara verticala de ³ SM_CXVSCROLL º
º defilare ³ SM_CYVSCROLL º
º ³ SM_CYVTHUMB º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º dimensiune bara orizontala de ³ SM_CXHSCROLL º
º defilare ³ SM_CYHSCROLL º
º ³ SM_CXHTHUMB º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º Alte º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º flag prezenta mouse ³ SM_MOUSEPRESENT º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º flag interschimbare functii ³ SM_SWAPBUTTON º
º butoane mouse ³ º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º flag versiune Debug ³ SM_DEBUG º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º numar metrici sistem ³ SM_CMETRICS º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º rezervate ³ SM_RESERVED1 º
º ³ SM_RESERVED2 º
º ³ SM_RESERVED3 º
º ³ SM_RESERVED4 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼ tabel 1

O modificare importanta a survenit in bucla de mesaje. Inainte de initierea acesteia a fost obtinut handle-ul hAccel prin incarcarea tabloului de accelerator "Accelerator" din instanta curenta, cu ajutorul functiei LoadAccelerators(). Bucla de mesaje functioneaza acum astfel: mesajul obtinut in structura msg de catre GetMessage() va fi in intii tratat de catre TranslateAccelerator(). Aceasta functie verifica daca mesajul primit este pentu ferestra hWnd si reprezinta o cobinatie de taste, corespunzatoare unuia din acceleratorii definiti in tabela al carei handle este hAccel.
Daca da, se depune in coada de mesaje a aplicatiei mesajul WM_COMMAND cu
wParam egal cu identificatorul acceleratorului si returneaza TRUE-semnificind ca s-a efectuat decodarea acceleratorului. Daca nu, functia returneaza FALSE, permitind tratarea clasica a mesajului cu translatarea tastaturii, daca este cazul, si dispecerizarea lui catre functia ferestrei.
In fine, inainte de incheierea aplicatiei trebuie eliberata memoria alocata
"obiectului" desen - hBitmap - prin apelul functiei DeleteObject().
O explicatie cuprinzatoare asupra lucrului cu obiectele contextului grafic al ferastrei - device context - trebuie aminata pentru un laborator dedicat exclusiv acestui subiect.

Procedura ferestrei

Sint procesate in aceasta functie doar cinci mesaje: WN_PAINT,
WM_RBUTTONDOWN, WM_LBUTTONDOWN, WM_COMMAND si WN_DESTROY. Sa vedem insa noutatiile aduse de ele.

WN_PAINT:
Mesajul este tratat asemanator ca in primul exemplu introducindu-se atunci necesitatea functiilor BeginPaint() respectiv EndPaint() intre care se poate realiza efectiv actiunea grafica dorita in zona de lucru a ferestrei. Aici s-a dorit afisarea in zona de lucru a ferstrei aplicatiei a "Desenul"-ui.
Pentru aceasta a trebuit creat intii un context grafic similar celui atasat ecranului, dar in memorie, deoarece un bitmap nu poate fi incarcat direct in ecran. Asadar pe baza handle-ul hDC furnizat de beginPaint(), functia
CreateCompatibleDC() creaza un context grafic similar ecranului, dar in memorie, identificat de acum prin handle-ul returnat si memorat in hMemDC.
In acest context va fi selectat "obiectul"desemnat de hBitmap - functia
SelectObject(), operatie ce inseamna de fapt realizarea imaginii desenului asa cum a fost creat. Urmeaza copierea acestuia pe ecran prin functia BitBlt()
(Bitmap Block Transfer). Parametri reprezinta :

- destinatia, prin hDC -contextul dispozitivului,0,0 - coordonatele
(x,y) coltului stinga/sus al zonei de lucru din fereastra, dimensiunea pe orizontala si pe verticala a dreptunghiului ce va primi desenul, deci bm.bmWidth respectiv bm.bmHeight.
- sursa, prin hMemDC si coordonatele coltului stinga/sus al dreptunghiului desenului sursa.
- metoda de transfer,care este in cazul de fata o banala copiere desemnata prin identificatorul SRCCOPY (SourceCopy).
Functiile inrudite cu BitBlt sunt PatBit (Pattern Block Transfer) si
StretchBit (Stretch Block Transfer). Parametrul METODA este semnificativ.
Aceasta metoda reprezinta de fapt CODUL OPERATIEI RASTRU (Raster Operation Cod ROP Code) specificind o anume operatie booleana intre bitul sursei, bitul unui patern (definit intr-o pensula - brush) si bitul initial al destinatiei. Dupa incheierea operatiei de transfer, trebuie eliminat hMemDC, pentru a elibera memoria. Acesta este scopul pentru care a fost utilizata functia DeleteDC().

WM_RBUTTONDOWN :

Mesajul este produs de apasarea butonului-dreapta al mouse-ului. Daca evenimentul se petrece cind cursorul este in fereastra noastra, mesajul va ajunge la functia ferestrei noastre pentru a fi procesat. Deoarece s-a dorit ca functia ce trebuie realizata sa fie aceeasi cu cea a comenzii "Sterge fereastra" din "Meniu" s-a apelat la o solutie des intilnita in programarea
Windows, functia isi trimite ei insasi mesaje:

SendMessage(hWnd,WM_COMMAND,IDM_STERGE,OL);

WM_LBUTTONDOWN :

Mesajul, produs de apasarea butonului din stinga al mouse-ului, este procesat intr-o maniera similara cu cel anterior. Singura deosebire este ca comanda similara este "Scrie in fereastra", deci mesajul va fi pentru IDM_SCRIE.
Functia
SendMessage(HWND hFereastraDest,WORD CodMesaj,WORD wParam,LONG IParam)

trimite mesajul, avind cei doi parametri, direct catre procedura ferestrei destinatie, asteptind valoarea returnata. Se putea folosi aici si functia
PostMessage(), avind aceiasi parametri, aceasta depunind mesajul in coada ferestrei respective, pentru ca sa se termine fara a mai astepta nici o procesare a lui.

WM_COMMAND:

Toate controalele ce pot fi atasate unei ferestre, trebuie sa comunice o eventuala actiune asupra lor. Aceasta se face cu precadere prin trimiterea catre "parinte" a unui mesaj WM_COMMAND insotit de identificatorul celui in cauza (wParam), si eventual de date suplimentare (lParam). Controalele in cazul exemplului nostru sint doar elementele meniului, tratate intr-o subselectie switch-case pe parametrul wParam.

IDM_SCRIE:

Produce redesenarea zonei de lucru prin apelul celor doua functii descrise in continuare. InvalidateRect() produce marcarea interna a unei zone rectangulare din suprafata ferestrei hWnd in vederea unei eventuale redesenari.
Daca al doilea parametru este NULL se marcheaza toata zona de lucru, iar daca ultimul parametru e FALSE ea va fi redesenata. Functia UpdateWindow() provoaca transmiterea unui mesaj WM_PAINT procedurii ferestrei conform actiunilor lui
WM_PAINT. In continuare intr-un bloc inclus se face o mica demonstratie de utilizare a resurselor de tip String-Table. Cu ocazia redesenarii, sirul de caractere "Bravo, m-ai redesenat!", avind identificatorul IDS_SCRIE, este incarcat din resurse in buffai cu ajutorul functiei LoadString(), se creaza o fereastra simpla de dialog, avind ca parinte fereastra noastra - hWnd , care va afisa continutul bufferului buff, sub titlul "Mesaj:", un icon cu semnul exclamarii si un buton de apasare "OK".

IDM_STERGE :

Va sterge zona de lucru a ferestrei, trimitindu-si un mesaj
WM_ERASEBKGND pe care il va procesa procedura implicita DefWindowProc(). Deoarece parametrul wParam al acestui mesaj trebuie sa precizeze contextul grafic, se obtine in hDC aceasta apelind functia GetDC() pentru fereastra, iar dupa utilizarea lui acesta se elibereaza prin ReleaseDC(). Acest mecanism trebuie inteles in felul urmator: procedura cere nucleului contextul grafic - aceasta insemnind o zona de memorie cu informatiile specifice de dispozitiv de afisare.
Nucleul blocheaza aceasta zona in memorie pentru o vreme ca ea sa poata fi regasita de cine are nevoie prin handle-ul hDC. Dupa utilizare zona poate fi
"de-fixata", aceasta realizindu-se cu ReleaseDC(). In continuare se incarca din nou un sir de caractere din resurse "De ce m-ai sters?", afisat si el intr-o fereastra de mesaj doar ca aceasta are un icon cu semnul intrebarii.

IDM_DESPRE:

Orice aplicatie, cit de mica, are undeva un control ce lanseaza o fereastra de dialog cu informatii despre aplicatie (About...). Aceata s-a facut in cel mai clasic mod. O fereastra de dialog -DialogBox, se poate crea prin functia DialogBox(). Aceasta construieste o fereastra pornind de la un sablon definit in resursele aplicatiei: "Despre".Fereastra va fi un copil al ferestrei aplicatiei hWnd si va fi servita de procedura de dialog "Despre".
Deoarece aceasta trebuie precizata printr-un pointer far, el se obtine apelind la functia MakeProcInstance(). Aceasta asigura si un segment de date corect pentru instanta procedurii ferestrei de dialog. In final aceasta instanta este eliberata prin FreeProcInstance().

IDM_EXIT :

Acest element de meniu trebuie sa provoace terminarea aplicatiei.Lucrul este simplu, deoarece functia DestroyWindow() va depune in bucla proprie de mesaje un WM_DESTROY,care este explicat si in laboratorul soc9.txt.

Procedura dialogului

Desi pare foarte asemanatoare cu o procedura de functie exista citeva deosebiri remarcabile:
-o procedura de ferastra returneaza un long;o procedura de dialog returneaza un BOOL (definit in windows.h ca un intreg).
-o procedura de fereastra apeleaza functia DefWindowProc() daca nu proceseaza un anumit mesaj;o procedura de dialog returneaza TRUE (non zero) daca a procesat mesajul si FALSE (0) daca nu.
-o procedura de dialog nu are nevoie sa proceseze WM_PAINT sau WM_DESTROY. Ea nu primeste mesajul WM_CREATE, in schimb poate sa-si faca initializari la mesajul
WM_INITDIALOG.
In procedura noastra de dialog este procesat doar WM_COMMAND si aici pentru ambele comenzi IDOK-de la butonul "Bine", respectiv IDCANCEL generat la o inchidere din meniul sistem, se executa functia EndDialog() care spune nucleului sa distruga fereastra de dialog.

Alt exemplu

Acest program nu are nici fereastra, nici resurse, nici macar bucla de mesaje.
Ea lucreaza totusi sub Windows amestecind ecranul intr-un mod aleator, prin schimbarea unor zone rectangulare intre ele, apoi refacind totul cum a fost.

//***************************************************
//
//program - amesteca (si reface) ecranul
//scop - cadou cu BitBlt
//
//***************************************************

#include <windows.h>
#include <stdlib.h>

#define NUM 200

#pragma warn -par int PASCAL WinMain( HANDLE hInstance , HANDLE hPrevInstance ,
LPSTR lpszCmdLine , int cmdShow )
A static short nKeepaNUMia4i; short i,j,x1,y1,x2,y2;

HDC hDC=CreateDC("DISPLAY",NULL,NULL,NULL);
HDC hMemDC=CreateCompatibleDC(hDC); short cxSize=GetSystemMetrics(SM_CXSCREEN)/10; short cySize=GetSystemMetrics(SM_CYSCREEN)/10;
HBITMAP hBitmap=CreateCompatibleBitmap(hDC,cxSize,cySize);

SelectObject(hMemDC,hBitmap); srand(LOWORD(GetCurrentTime() ) ); for(i=0;i<2;i++) for(j=0;j<NUM;j++) A if(i==0) A nKeepajia0i=x1=cxSize*(rand() % 10); nKeepajia1i=y1=cySize*(rand() % 10); nKeepajia2i=x2=cxSize*(rand() % 10); nKeepajia3i=y2=cySize*(rand() % 10);
S else A x1=nKeepaNUM-1-jia0i; y1=nKeepaNUM-1-jia1i; x2=nKeepaNUM-1-jia2i; y2=nKeepaNUM-1-jia3i;
S
BitBlt(hMemDC,0,0,cxSize,cySize,hDC,x1,y1,SRCCOPY);
BitBlt(hDC,x1,y1,cxSize,cySize,hDC,x2,y2,SRCCOPY);
BitBlt(hDC,x2,y2,cxSize,cySize,hMemDC,0,0,SRCCOPY);
S return FALSE;
S

------------------------------------------------------------------------------

NAME MIXER

DESCRIPTION "Amestecator ecran"
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'

CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
STACKSIZE 8192

------------------------------------------------------------------------------

Exercitii :

-sa se analizeze evenimentele ce apar in aplicatia 2
-sa se schimbe resursele cu altele din directorul e:\ (borlandc)



Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta