Color picker
Color picker
Salut.
- As avea o intrebare: vreau sa fac un color-picker ca cel din imaginea atasata (e luat de la photoshop) si nu prea am idee cum e facut.Initial am vrut sa-l fac dintr-un listcontrol (in care sa folosesc small-icons) dar din cauza spatiului pe care-l lasa intre icon-uri (deci intre culori) nu e o solutie.Alta solutie ar fi sa desenez manual culorile, iar culoarea selectata s-o aflu in functie de coordonatele "click-ului" dar pare prea migalos... exista vreo solutie de mijloc?
Multumesc.
- As avea o intrebare: vreau sa fac un color-picker ca cel din imaginea atasata (e luat de la photoshop) si nu prea am idee cum e facut.Initial am vrut sa-l fac dintr-un listcontrol (in care sa folosesc small-icons) dar din cauza spatiului pe care-l lasa intre icon-uri (deci intre culori) nu e o solutie.Alta solutie ar fi sa desenez manual culorile, iar culoarea selectata s-o aflu in functie de coordonatele "click-ului" dar pare prea migalos... exista vreo solutie de mijloc?
Multumesc.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Versiunea clasica si cea mai usoara este sa folosesti dialogul de selectie culoare gata preparat in Windows.
Pentru aceasta ai in Windows API functia ChooseColor iar in MFC clasa CColorDialog.
Eu zic ca, in general e suficenta si mai mult decat satisfacatoare.
Alternativ, MFC Feature Pack, inclus in Visual Studio 2008 SP1 si in versiunile mai noi, contine clasa CMFCColorDialog care arata ceva mai fancy si pune mai multe culori pe fatzau.
Tu alegi.
Vezi si:
Pentru aceasta ai in Windows API functia ChooseColor iar in MFC clasa CColorDialog.
Eu zic ca, in general e suficenta si mai mult decat satisfacatoare.
Alternativ, MFC Feature Pack, inclus in Visual Studio 2008 SP1 si in versiunile mai noi, contine clasa CMFCColorDialog care arata ceva mai fancy si pune mai multe culori pe fatzau.
Tu alegi.
Vezi si:
- MSDN: CColorDialog Class
- MSDN: CMFCColorDialog Class
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Color picker
Merci de ajutor Ovidiu, picker-ele astea sint cam mari, vreau un picker extrem de restrins, care sa stea in permanenta la vedere, exact ca in photoshop.Pina la urma o sa le fac de mina, chiar daca e putin efort.Merci again.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Ce-si face omu cu mana lui, se cheama "lucru manual". 
In fine, sa zicem, astea-s cerintele si trebuie sa te abati de la "standard".
Amandoua metodele pe care le-ai enumerate la inceput sunt fezabile.
1. Faci un listview control (CListCtrl) custom sau owner-draw; in cazul acesta cred ca mai porivita e o lista report style si nu small icon.
2. Faci un control custom sau ActiveX, in care desenezi tu cu mana ta un grid colorat.
Depinde cum ti se pare mai usor: sa macelaresti un control deja existent sau sa faci altul de la zero.

In fine, sa zicem, astea-s cerintele si trebuie sa te abati de la "standard".
Amandoua metodele pe care le-ai enumerate la inceput sunt fezabile.
1. Faci un listview control (CListCtrl) custom sau owner-draw; in cazul acesta cred ca mai porivita e o lista report style si nu small icon.
2. Faci un control custom sau ActiveX, in care desenezi tu cu mana ta un grid colorat.
Depinde cum ti se pare mai usor: sa macelaresti un control deja existent sau sa faci altul de la zero.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Color picker
Încearcă și ultimul MFC care include controlul CMFCColorPickerCtrl: http://msdn.microsoft.com/en-us/library/bb984075.aspx.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
L-am incercat eu acum si "crapa" din toate incheieturile. 
In fine, asta o putem rezolva (are nevoie de oaresce initializari) insa se pare ca CMFCColorPickerCtrl a fost facut special ca sa fie folosit de CMFCColorDialog deci nu ne apropiem prea mult de look 'n feel-ul pe care-l vrea carrera.
Asta la prima vedere, poate ma insel...

In fine, asta o putem rezolva (are nevoie de oaresce initializari) insa se pare ca CMFCColorPickerCtrl a fost facut special ca sa fie folosit de CMFCColorDialog deci nu ne apropiem prea mult de look 'n feel-ul pe care-l vrea carrera.
Asta la prima vedere, poate ma insel...
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Color picker
Ovidiu Cucu wrote:
1. Faci un listview control (CListCtrl) custom sau owner-draw; in cazul acesta cred ca mai porivita e o lista report style si nu small icon
Buna idee, ramane doar sa colorez celulele.Chiar daca nu exista vreo functie standard de colorare, ramane totusi cea mai simpla solutie.
thx.
1. Faci un listview control (CListCtrl) custom sau owner-draw; in cazul acesta cred ca mai porivita e o lista report style si nu small icon
Buna idee, ramane doar sa colorez celulele.Chiar daca nu exista vreo functie standard de colorare, ramane totusi cea mai simpla solutie.
thx.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Nu chiar. Un control listview nu are "celule". Revin mai tarziu cu un draft si cu ceva explicatii suplimentare.carrera wrote: [...] ramane doar sa colorez celulele.Chiar daca nu exista vreo functie standard de colorare, ramane totusi cea mai simpla solutie.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Promisesem un draft si niste explicatii... 
Un listview control nu este organizat ca un "grid" desi seamana cu un grid daca are report style (LVS_REPORT).
Este doar o colectie de item-uri, fiecare item putand avea asociat un numar de subitem-uri. Daca un item poate contine informatii suplimentare, nu acelasi lucru se poate zice si pentru pentru subitem-uri.
De aceea n-o sa gasesti pentru el metode gen "SetCellColor", ca in cazul unui grid.
Spuneam totusi ca s-ar putea "carpi" un color picker custom (za zicem, similar cu cel din Photosop) cu un listview custom-draw sau owner-draw.
Vezi mai intai ce inseamna fiecare aici: Deci...
In fine, toate bune si frumoase... am dat exemplele de mai sus doar pentru a demonstra cum se poate face rapid un color picker folosind un listview control.
Daca ar fi sa aleg, eu as alege:

Un listview control nu este organizat ca un "grid" desi seamana cu un grid daca are report style (LVS_REPORT).
Este doar o colectie de item-uri, fiecare item putand avea asociat un numar de subitem-uri. Daca un item poate contine informatii suplimentare, nu acelasi lucru se poate zice si pentru pentru subitem-uri.
De aceea n-o sa gasesti pentru el metode gen "SetCellColor", ca in cazul unui grid.
Spuneam totusi ca s-ar putea "carpi" un color picker custom (za zicem, similar cu cel din Photosop) cu un listview custom-draw sau owner-draw.
Vezi mai intai ce inseamna fiecare aici: Deci...
- Folosind un listview custom-draw
In principiu, este super-easy. Nu avem decat sa tratam NM_CUSTOMDRAW trimis via WM_NOTIFY.
In faza "subitem pre-paint" (NM_CUSTOMDRAW vine cu NMLVCUSTOMDRAW::nmcd::dwDrawStage avand valoarea CDDS_ITEMPREPAINT | CDDS_SUBITEM), ii spunem sitemului cu ce culoare sa picteze subitem-ul respectiv si am rezolvat problema.
Ceva de genulCode: Select all
void CColorListCtrl::_HandleSubitemPrePaint(LPNMLVCUSTOMDRAW pNMCD, LRESULT *pResult) { // Note: for a listview, nmcd.dwItemSpec keeps the item index const int nItem = (int)pNMCD->nmcd.dwItemSpec; const int nSubItem = pNMCD->iSubItem; const int nColor = nItem * m_nColCount + nSubItem; if(nColor < m_arrColors.GetSize()) { pNMCD->clrTextBk = m_arrColors[nColor]; // m_arrColors is an array of colors } // ... }
Dezavantajul e ca nu putem modifica dimensiunea unui item. In caz ca se doreste asta, atunci vrand-nevrand trebie facuta o lista owner-draw. - Folosind un listview owner-draw
In primul rand, pentru a o fi owner-draw lista trebuie sa aiba stilul LVS_OWNERDRAWFIXED (proprietatea "Owner Draw Fixed" trebuie setata pe "True" in editorul de resurse).
In continuare putem trata mesajele WM_MEASUREITEM si WM_DRAWITEM pentru a fixa dimensiunea unui item si repectiv pentru a desena itemul asa cum vrea muschii nostri.
Pentru a trata WM_DRAWITEM putem suprascrie folosind vizard-ul functia DrawItem.
WM_MEASUREITEM trebuie mapat "la mana".
Ca si dezavantaj fata de metoda precedenta este faptul ca WM_DRAWITEM este trimis pentru fiecare item, nu si pentru fiecare subitem in parte, asa ca avem de facut oaresce mici calcule in plus.
Mai multe amanunte de implemetare gasesti in demo-ul atasat.
In fine, toate bune si frumoase... am dat exemplele de mai sus doar pentru a demonstra cum se poate face rapid un color picker folosind un listview control.
Daca ar fi sa aleg, eu as alege:
- color picker-ul deja facut in Windows/MFC, iar daca nu...
- as face un control (custom sau ActiveX) de la zero.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
-
- Membru++
- Posts: 687
- Joined: 10 Sep 2008, 21:40
- Judet: Cluj
Re: Color picker
Iau de aici fiecare proiect sa-l incerc, si daca nu e proiect VC6, no pb, il convertesc eu in VC6 ... insa nu pot face asta daca fisierul proiect contine spatiu ... de altadata, nu acum, puteti pune in loc de spatiu ceva caracter ? Nu conteaza ce, numa spatiu sa nu fie, pentru cei care traiesc in preistorie .... 

- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
[off-topic]
Imi pare rau, insa in momentul asta XP-ul meu (pe care am VS6.0) e vraiste si din moment ce m-am obisnuit cu Windows 7, ma trage din ce in ce mai greu ata sa-l reinstalez. O sa-l reinstalez totusi pentru ca mai fac din cand in cand teste pe XP, insa nu stiu cand.
Oricum, in afara de cazul in care un proiect contine cine sitie ce chestii noi care nu-s in MFC-ul si SDK-ul din VS6, "portarea" n-ar fi o asa mare problema.
Fa-ti un proiect nou (in cazul de fata, un proiect dialog-based numit "Demo") si-apoi pur si simplu copie fisierele sursa in el. Mai sunt de rezolvat cateva mici incompatibilitati, in rest nu cred ca-s mari probleme.
De exemplu chestia asta pusa de wizard-ul din VS200x
o sa-ti dea eroare in VS6. Nu trebuie decat sa stergi "&CColorListCtrl::".
Of course, o sa incerc de-acum si sa nu mai pun spatii in numele solutiei.
Imi pare rau, insa in momentul asta XP-ul meu (pe care am VS6.0) e vraiste si din moment ce m-am obisnuit cu Windows 7, ma trage din ce in ce mai greu ata sa-l reinstalez. O sa-l reinstalez totusi pentru ca mai fac din cand in cand teste pe XP, insa nu stiu cand.
Oricum, in afara de cazul in care un proiect contine cine sitie ce chestii noi care nu-s in MFC-ul si SDK-ul din VS6, "portarea" n-ar fi o asa mare problema.
Fa-ti un proiect nou (in cazul de fata, un proiect dialog-based numit "Demo") si-apoi pur si simplu copie fisierele sursa in el. Mai sunt de rezolvat cateva mici incompatibilitati, in rest nu cred ca-s mari probleme.
De exemplu chestia asta pusa de wizard-ul din VS200x
Code: Select all
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CColorListCtrl::OnNMCustomdraw)
Of course, o sa incerc de-acum si sa nu mai pun spatii in numele solutiei.

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Color picker
Merci fain Ovidiu.
As mai avea o intrebare: ar fi vreo metoda de-a micsora dimensiunea item-ilor, adica as putea sa fac mai mici patratelele colorate?
As mai avea o intrebare: ar fi vreo metoda de-a micsora dimensiunea item-ilor, adica as putea sa fac mai mici patratelele colorate?
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Daca vrei, poti (in varianta owner-draw). 
Arunci mai intai o privire in handlerul lui WM_MEASUREITEM, (MeasureItem)
unde se vede clar ca se poate.
Eventual, te uiti si la articolul asta Color Picker Listview Control.

Arunci mai intai o privire in handlerul lui WM_MEASUREITEM, (MeasureItem)
Code: Select all
void CColorListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemHeight = m_nColorItemHeight;
lpMIS->itemWidth = m_nColorItemWidth * m_nColCount;
}
Eventual, te uiti si la articolul asta Color Picker Listview Control.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: Color picker
Super.Tre' sa vin cu o sticla de vin cind mai ajung prin Iasi 
Merci!

Merci!
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: Color picker
Poate ca, pana vii tu in Iasi, fac un control color picker de la zero (custom sau ActiveX).
Insa ala nu costa o stica ci un butoi cu vin.
Insa ala nu costa o stica ci un butoi cu vin.

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks