BHGridCtrl- open source


BHGridCtrl

BHGridCtlr zadnja verzija Februar 2006

C++ Grid kontrola razvijana isključivo iz hobija u slobodno vrijeme. Na blogu je otvorena stranica na kojoj su sumirani članci koje sam ranije pisao, kao i članci koje ću objaviti, vezano za ovu kontrolu.U slučaju da imate vremena na pretek ili veliku želju da programirate u C++ ovakvu kontrolu, slobodno me kontaktiraje, zaista bi bilo lijepo kada bi se ova kontrola nastavila razvijati.

Više o projektu na stranici Projekti->BHGridCtrl.

Iscrtavanje BHGrid kontrole


1. Uvod

Iscrtavanje grid kontrole je najvažniji segment u implementaciji. Vizuelni efekt grid kontrole daje kontroli izgled i za korisnika je, osim samih mogućnosti manipulacije podacima, najvažniji aspekt.

Grid kontrola se uglavnom sastoji iz nekoliko segmenata:

  • Zamrznute kolone/vrste (gornji lijevi ugao)
  • Nepokretne (fiksirane) vrste ili vrste zaglavlja (Header rows)
  • Nepokretne (fiksirane) kolone ili frozen columns
  • Grid cells ili sama grid polja za prikaz podataka

clip_image002

Slika 1. Prikaz komponenata Grid Kontrole

Gornja slika pokazuje šemu i medjusoban odnos komponenata Grid kontrole: virtualna veličina, virtuelne veličine pojedinih dijelova u odnosu na klient površinu koja trenutno pokazuje Grid kontrolu.

Radi same brzine i optimiziranog korištenja memorije računara grid kontrola se iscrtava samo onoliko koliko je potrebno da se iscrta klient površina, dočim Scroll kontrole obezbjedjuju da se pogleda cijela grid kontrola.

Da bi se valjano i efikasno iscrtala grid kontrola potrebno je u odnosu na poziciju scroll kontrola iscrtavati komponente i sama grid polja.

Radi kontinuiranog scrollanja redoslijed iscrtavanja komponenata kontrole je vrlo važan.

Redoslijed iscrtavanja kontrole treba da se odvija sljedećim redom:

· Iscrtavanje Grid polja

· Iscrtavanje fiksiranih vrsta

· Iscrtavanje fiksiranih kolona

· Iscrtavanje zamrznuto kolona/vrsta (gornji lijevi pravougaonik koji se iscrtava nezavisno od pozicije klizača)

· Iscrtavanje Fokusa i Aktivne cečije

Kako se iz same slike vidi da početna tačka iscrtavanje grid kontrole može biti u polju u kojem se iscrtavaju ostale dvije komponente. Potrebno je obezbjediti da se ona prva iscrta, a zatima fiksirane vrste koje opet mogu biti iscrtane u polju koji je predvidjen za fiksirane kolone, pa zatim one same kako bi se ostvarilo preklapanje crtanja, a izgled kontrole bio ispravan.

Kako se vidi iz slike da postoji odredjena preklapanja u iscrtavanju potrebno je u svakoj funkciji koja vrši nevedena iscrtavanja prosljediti i klipovan pravougaonik u kojem će se osvježiti iscrtana površina. Ovim će se obezbjediti maximalno smanjenje fliking efekta odnosno blicanja iscrtavanih površina.

Maximalna vrijednost scroll kontrola je jednak ukupnoj širini odnosno ukupno dužini grid kontrole, tako da zadnji položaj klizača scroll kontrola iscrtava zadnji segment grid kontrole, tj. zadnje desno polje iscrtava se u donjem desnom klient pravougaoniku.

2. Određivanje elemenata za iscrtavanje Grid kontrole

clip_image003 clip_image004

Slika 2. raspored pravougaonika grid kontrole u odnosu na klient pravougaonik

Elementi potrebni za iscrtavanje komponenata Grid kontrole su sljedeći

  • Tekuća pozicija klizača Scroll Kontrola , m_nXScrollPos, m_nYScrollPos
  • Gornje lijevo polje izračunato u odnosu na poziciju Scroll kontrole, nTopRow, nLeftCol
  • Početne koordinate X0,Y0 za iscrtavanje polja kontrole u zavisnosti fiksiranih vrsta i kolona.
  • Donje desno polje izračunato u odnosu na poziciju Scroll kontrole te veličine klient površine nBottomRow,nRightCol
  • Gornja fiksirana vrsta nTopFixedRow u odnosu na poziciju vertikalne Scroll kontrole
  • Lijeva fiksirana kolona nLeftFixwdCol u odnosu na poziciju horizontalne Scroll kontrole

3. Matematički model iscrtavanja

Pretpostavimo da je P0(x0,y0) početna tačka za iscrtavanja polja kontrole u klient površini,

za P0 vrijedi, 0 ≤ x0 < fColWidth

0 ≤ y0 < fRowHeight

gdje je: fColWidth ≥ 0 – ukupna dužina fiksiranih kolona,

fRowHeight ≥ 0 – ukupna visina fiksiranih vrsta

Gornje lijevo polje tlCell od kojeg se počinje iscrtavati kontrole izračunava se u odnosu na tekući položaj Scroll kontrola:

tlCell=f(nScrollPos)

Virtualna koordinata početka iscrtavanja polja kontrole:

Xv0=xSxrollPos,

Yv0=yScrollPos

clip_image005

Slika 3. Mogući položaj vrha gornjeglijevog polja i vrha klient pravougaonuka

Virtualnu koordinatu početka iscrtavanja potrebno je korigovati na taj način da se poklopi sa gornjim lijevim uglom gornjeg lijevog polja s kojim se počinje isctavati polja kontrole.

Na osnovu izloženog možemo zaključiti da je :

Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1) ≤ Xv0 ≤ Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)+ Widthcol(m)

Odnosno,

Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) ≤ Yv0 ≤ Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1)+ Heightrow(n)

Gdje je m,n=1,2,….. etc.

Iz gornje nejednačine dobijamo virtualne koordinate početka crtanja,

Xv0 = Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1),

Yv0 = Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1)

Takodjer je vidljivo da lijevoGornje polje :

tlCell=Cell(m-1,n-1);

Na osnovu virtualnih koordinata nije teško izračunati client koordinate:

X0 = fColWidth + (Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)) – xScrollPos

Y0 = fRowHeight +(Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) )- yScrollPos

Analogno iznesenom možemo izračunati početnu tačku iscrtavanja fiksiranih kolona i vrsta, koje su direktno vezane za prethodnu koordinatu.

Xfixedcol0 = fColWidth + (Widthcol(0) + Widthcol(1)+ ….. + Widthcol(m-1)) – xScrollPos

Y fixedcol0 = 0

Xfixedrow0 = 0

Y fixedrow0 = fRowHeight +(Heightrow(0) + Heightrow(1)+ ….. + Heightrow(n-1) )- yScrollPos

Kada znamo prvo polje od kojeg se počinje iscrtavati nije teško izračunati zdanje polje koje treba biti iscrtano. Ono je u direktnoj vezi sa veličinom klienta pravougaonika te početnog polja za iscrtavanje.

rbCell=f(clientRect, topleftCell)

Projekat BHGridCtrl


O projektu BHGridCtrl

BHGridCtrl je MFC projekat Grid kontrole, koji sam u slobodno vrijeme razvijao dvije godine 2004-2006. Obzirom da je u projekat uloženo poprilično truda kao i da je BHGrid kontrola na kraju implementacije imala popriličan broj osobina koje se mogu primjeniti u aplikacijama, odlučio sam je objaviti u obliku Open Source u fazama po kojim je i implementirana. U narednim postovima biće objavljene na način koko je sama kontrola bila razvijana.

U slučaju da imate vremena na pretek ili  veliku želju da programirate u C++ ovakvu kontrolu, slobodno me kontaktiraje, zaista bi bilo lijepo kada bi se ova kontrola nastavila razvijati.

Razlozi prestanka razvoja projekta:

  1. Projekat sam prestao razvijati jer zaista nemam vremena za ovakvo kompleksan projekat, jer mi rokovi i komercijalni projekti neostavljaju prostor.
  2. Prelazak na .NET platformu i C# programski jezik.

Projekat posjeduje popriličnu dokumentaciju, liste funkcionalnosti, odredjenih proračuna, kroz verzije. Source kod je također komentiran tako da se može razumijeti logika. Nekada zbog brzine i vremena komentari su mješavina egleskog i bosanskog jezika.

Imlementacija prve verzije BHGridCtrl – Ljeto 2004

Početak implementacije datira iz 2004, s tim da su određene metode bile dosta ranije implementirane. U to vrijeme primjenjivao sam dvije open source grid kontrole: ALXGrid te MFCGrid, koje su svaka za sebe imale prednosti i nedostatke. Ideja BHGridCtlr je bila bazirana na pomenutim kontrolama, ali BHGridCtrl sadrži svoju originalnu logiku. Prva verzija izbačena negdje u ljeto 2004 godine. Sadržavala je jednostavnu rešetku u kojoj su bile implementirane metode za iscrtavanje Grid kontrole, kao i ćelije koje su sadržavaje tekst sa koordinatama (indexima). Naredna slika pokazuje prvu alfa verziju kontrole.

clip_image002

Ova verzija nije imala nikakvih funkcija osim skrolanja i grafičkog manipulisanja vrstama, kolonama i ćelijama u smislu selekcije, resajziranja i skrolanja.

Projekat BHGridCtrl je sadržavao dvije datoteke (zajedno cpp i h):

1. BHGridCtrl.cpp i zaglavlje

2. BHGridCell.cpp i zaglavlje

Osobine BHGridCtrl ALFA

Osnovne osobine prve verzije:

1. Nepokretne (Fixed) kolone i vrste – sa SetFixedColumnCount(3) i SetFixedRowCount(3) definišemo broj nepokretnih kolona/vrsta

clip_image004

2. Selekcija ćelija, pojedinačno i grupno. Prilikom držanja tipke CTRL moguće je selektovati različite regione ćelija. Ova osobina je slična selekciji u Excelu (donja slika).

clip_image006

3. Automatsko resajziranje kolona i vrsta, resajziranje kolona i vrsta pomoću miša i dinamički. Različite visine vrsta su podržane.

clip_image008

4. Skrolanje Grid kontrole. Ako želimo da određena ćelija se pojavi u klijentsko vidljivo područje metode za skrolanje ćelije su implementirane. Test skrolanja je prikazan u demo programu. Skrolanje je vrlo važna i kompleksna osobina. Obziromda Grid kontrola može posjedovati veliki broj vrsta i kolona, ona se ipak svodi na iscrtanja samo onih ćelija koje su vidljive na monitoru. Kada se skrola ili prikazuje ćelija koja nije u vidnom polju potrebno je implementirati posebnu logiku.

clip_image010

Izvorni kod prve verzije projekata uradjen je u VS 2003, i može se skinuti sa ovog linka.

U narednom postu biće riječi oko same implementacije iscrtavanja Grid kontrole