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)

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 07/05/2007, in BHGridCtrl, C/C++, Programiranje and tagged , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s