Interview with famouswhy.com


Regarding my open source project ScreenPainter which I published on Code Project in 2004, several sites asked me if I could put my application on their site as a freeware software.

One of the site (famouswhy.com) send me request to make an interview with me, which you can see below or visit the link.

Advertisements

BHGridCtrl – Zadnja implementacija


Zadnja implementacija BHGridCtrl projekta, podrazumijevala je povezivanje tabela sa bazom podataka preko ADO. Zadnjom verzijom podaci koji se učitaju nije moguće vršiti modifikaciju. Za zadnji primjer potrebno je imati instaliran SQL server i NorthWind bazu podataka. Svi podaci u tabeli se mogu isprintati i implementirane su funkcije za printanje GridKontrole, zaglavlja i podnožja. Primjer sa zadnjom implementiranom verzijom BHGriCtrl možete skinuti sa ovog  linka. Primjer je kompajliran sa VS 2008.

Visual C++ 2008 značajne promjene u MFC


Microsoft sa novim VS2008 donosi velike promjene za MFC programere. Naime sve ovo vrijeme razvoja .NET tehnologije MS je pomalo zaboravio jedan od najsnažnijih programskih jezika danas C++. Novom verzijom VS koja bi se trebala naći na tržištu 28. februara iduće godine, MFC programeri će imati šta da vide. Jako puno alata koji će generirati kod i GUI kakav danas vidimo u Office 2007, Internet exploreru, i Visual Studiu. Novi izgledi menija, usidrenih prozora, autoskrivanje i mnogo više.Više informacija o novim proširenjima u MFC koji dolaze novom verijom VS 2008 možete vidjeti na oficijelnom blogu http://blogs.msdn.com/vcblog/. Svakako pogledajte i interviju sa Pat Brennerom koji već skoro 20 godina radi u Microsoftu.

Ultimate Toolbox, Grid i TCP/IP u open source verziji


Jedna od najpoznatijih kompanija koja razvija komponente bazirane na MFC C++ u posljednjih 15 godina bila je zasigurno Dundas Software’s. Njihovi proizvodi imali su prefiks Ultimate (UltimateGrid, UltimateToolbox, UltimateTCP/IP). U januaru 2005 godine David Cunningham and Chris Maunder (osnivač Code Project zajednice) osnivaju firmu TheUltimateToolbox.com, te izdvajaju iz Dundas Software’s Ultimate proizvode. U prethodnih nekoliko dana na Code Project zajednici objavljen je niz članaka u kojima se ove komponente nakon više od 10 godina otvaraju u Open Source verziji. Ove komponente mogu skinuti članovi Code Project zajednice jedne od najvećih zajednica koje razmjenjuju informacije o microsoftovim tehnlogijama C++,MFC, ATL, VB, C#, VB .NET, ASP itd. Više informacije o ovim komponentama možete dobiti ovdje. Naravo morate se učlaniti da bi skinuli cijeli source code.

O CodeProject.com

Ova zajednica broji preko 4,5 miliona članova, u svakom trenutku je preko 15000 članova online. Mogu se pohaviti da sam jedan od prvih članova ove zajednice (657 član od 6. Jula. 2000). Ako se želite baviti programiranjem na nekoj od microsoftovih tehnologija vaš izvor informacija na kojoj možete naći skoro sve što vas zanima je upravo www.codeproject.com.

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