Prikaz brojčanog iznosa slovima u C++


Slovni prikaz broja potrebno nam je iz više razloga. Primarna svrha ovog prikaza je prikazati slovima iznos određenog računa ili iznos ugovorene vrijednosti u ugovoru. U ovom primjeru prezentirana je C++ klasa CHBCurrency koja prikazuje slovima određeni iznos (broj). Demo aplikacija je pisana u MFC C++ projektu VS2005.

Implementacija klase CHBCurrency posjeduje samo jednu javnu metodu:

CString ValueToString(CString str,char decSym=’,’);

Ova metoda uzima dva parametra CString tipa. Prvi brojčana vrijednost iznosa, dok je drugi parametar decimalni separator broja. Ovo znači da broj moze biti prikazan kako sa zerezom koji je i podrazumijevani prametar kao i sa tačkom (Svojstveno američkom zapisu broja).

Klasa je implementirana dvojezično, odnosno može prikazati slovima broj kako u matičnom bosanskom tako i na hrvatskom jeziku.

MFC aplikaciju ovog primjera možete skinuti ovdje.

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

Prof-UIS C++ GUI biblioteka


Jedna od vrlo popularnih C++ MFC biblioteka trećih firmi, a koje se bave razvojem modernih GUI interfejsa je zasigurno Prof-UIS firme Foss Software. Biblioteka sadrži kompletan skup GUI komponenata za Windows od redizajniranih osnovnih windows kontrola do naprednih kontrola poput grid kontrola rebar i toolbar te kompletnog MDI interfejsa. Biblioteka prati zadnje inovacije Microsotovih proizvoda tako da već u svom sastavu sadrži ribbon kontrolu. Biblioteka je dostupna i u free verziji u kojoj je veliki broj kontrola. Kada se biblioteka ugradi u aplikaciju promjena tema i izgleda kontrola postaje “piece of cake” .

Dio biblioteke koji se razvija od strane vanjskih saradnika je i lokalizacija biblioteke odnosno podrška za jezik i lokalne veličine. Već više od dvije godine ova biblioteka ima podršku za Bosanski jezik, koju razvijam za ovu biblioteku. Vjerojatno je ovo prva biblioteka široko korištena u svijetu koja ima našu lokalizaciju. U koliko razvijate MFC/C++ aplikacije ova biblioteka je pravi pogodak.