CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by mesajflaviu » 25 May 2011, 15:17

Ce mesaj se trateaza in Windows Explorer pentru a edita un item in listcontrol ? Ca dubluclick nu este , este un fel de al doilea click ( dupa primul :biggrin: , bine , merge si cu F2 ) ... acum pentru a edita un item folosesc dublu-click , dar pe acest eveniment as face altceva ...



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Atasare CHeaderCtrlEx la CListCtrlEx

Post by Ovidiu Cucu » 25 May 2011, 15:29

Trage mai intai un ochi in proiectul atasat.
Vezi ce diferentiaza listview-ul asta de unul default.
edit_Listview_label.zip
(8.72 KiB) Downloaded 272 times

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Atasare CHeaderCtrlEx la CListCtrlEx

Post by mesajflaviu » 25 May 2011, 19:26

Am inteles , aceasta compotare o are doar in cazul stilului LVS_EDITLABELS al list-control-ului , si in acest caz editarea se poate face numai pentru items , nu si pentru subitems ( normal ) . Ma gandeam ca e vorba de vreun mesaj standard.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by Ovidiu Cucu » 26 May 2011, 10:18

Ce mesaj primeste controlul ListView atunci cand intra in editare label in urma unei actiuni utilizator nu stiu.
Si nici nu ma intereseaza pentru ca am la dispozitie doua notificari pe care controlul le trimite la parinte: LVN_BEGINLABELEDIT si LVN_ENDLABELEDIT.
Cel de-al doilea (LVN_ENDLABELEDIT) trebuie tratat obligatoriu in aplicatie pentru ca sistemul nu actualizeaza automat textul, probabil ca sa dea o sansa ca eventual sa-l formatezi si/sau sa-l validezi mai intai.
LVN_BEGINLABELEDIT il hendluiesti cand vrei ceva custom, de exemplu vrei sa muti edit-ul in alta coloana.
Daca vrei sa fortezi editarea din program, mesajul pe care-l trimiti controlului este LVM_EDITLABEL (in MFC acesta este trmis de functia CListCtrl::EditLabel).

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by mesajflaviu » 26 May 2011, 18:49

Am incercat in cateva moduri sa prind OnBeginlabeledit si OnEndlabeledit fara sa am edit in item-ul listcontrolului ( acolo am codul meu care editeaza fiecare item sau subitem in parte ), dar inca n-am reusit : am observat ca daca setez in OnBeginlabeledit *pResult diferit de 0 , nu mai am edit-ul in listcontrol , dar OnEndlabeledit nu se mai executa ( unde as incheia editarea custom ) ... oare care ar fi solutia ?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by Ovidiu Cucu » 26 May 2011, 19:43

Ca sa obtii o lista cu subitem-uri editabile, faci cam asa:
  1. Derivezi din CListCtrl (sa-i zicem CEditableListCtrl) si din CEdit (sa-i zicem CEditableListEdit).
  2. Prinzi un mesaj de mouse, sa zicem notificarea NM_CLICK apoi LVN_BEGINLABELEDIT si LVN_ENDLABELEDIT.
  3. In handlerul lui NM_CLICK, iei pozitia cursorului (::GetCursorPos) si vezi daca userul a dat click pe un subtem si nu undeva aiurea (cu CListCtrl::SubItemHitTest). Tii minte indexul subitem-ului (o sa ai nevoie de el mai tarziu) si in fine, chemi CListCtrl::EditLabel.
  4. In handlerului lui LVN_BEGINLABELEDIT chemi CListCtrl::GetEditControl ca sa obtii controlul (in-place)Edit si il subclasezi in clasa ta (CEditableListEdit) careia ii spui cam pe unde se afla subitemul (vezi linia "m_pEdit->m_nXOffset =..."). La urma, setezi textul in edit cu textul din sub-item.
  5. In CEditableListEdit, prinzi WM_WINDOWPOSCHANGING si muti editul deasupra subitem-ului.
  6. In handlerul LVN_ENDLABELEDIT setezi noul text din edit inapoi in sub-item apoi chemi UnsubclassWindow.
Cam asta-i tot. Ramane totusi sa tratezi si WM_PAINT in asa fel incat sa nu mai apara textul subitem-ului sub edit.

Am atasat aici un demo. Nu-i perfect dar functioneaza.
EditableListDemo.zip
(11.91 KiB) Downloaded 272 times

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by mesajflaviu » 26 May 2011, 19:50

Am asa :

Code: Select all

void CListCtrlEx::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here
//	*pResult = 0;
	*pResult = 1;

	DisplayEditor(2, 3); // editez celuta 2,3
}
dar cu valoarea *pResult = 1; , nu se mai executa :

Code: Select all

void CListCtrlEx::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here

	HideEditor(FALSE);
	*pResult = 0;
}
unde as ascunde editorul ....

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by mesajflaviu » 26 May 2011, 19:55

Dar o sa incerc si solutia de mai sus ... desi , cu DisplayEditor / HideEditor ( deja implementate in CListCtrlEx ) ar fi fost mai simplu ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by Ovidiu Cucu » 26 May 2011, 20:07

Daca in handlerul lui LVN_BEGINLABELEDIT pui *pResult pe TRUE (diferit de zero) ii spui Windows-ului "Nu, mersi, m-am razgandit". Windows-ul, baiat finutz, n-o sa mai creeze acel control Edit si implicit n-o sa mai trimita nici LVN_ENDLABELEDIT, simplu pentru ca numai are pentru ce.

Fa asa cum ti-am spus eu si-ai sa vezi ca-i bine! ;)

[ Later edit ]
mesajflaviu wrote:... desi , cu DisplayEditor / HideEditor ( deja implementate in CListCtrlEx ) ar fi fost mai simplu ...
Aparent mai simplu.
In general, atunci cand customizezi un control built-in, e bine sa foslosesti cat mai mult din ce are el de la mama lui si ce iti pune el la dispozitie ca sa-l customizezi.
Daca te indepartezi prea mult de la regula asta, e nashpa. Atunci ar fi mai bine sa-l scrii cap-coada, cred c-am mai spus asta de zeci de ori.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by Ovidiu Cucu » 26 May 2011, 21:23

Banui ca te gandisesi sa creezi propriul tau control edit si nu cel pe care-l face automat Windows-ul pentru un control listview cu stilul LVS_EDITLABELS.
Se poate dar iti zic din start ca nu e mai simplu.
In primul rand, trebuie sa renunti la stilul LVS_EDITLABELS si la notificarile LVN_BEGINLABELEDIT si LVN_ENDLABELEDIT. Mai mult incurca.
Va trebui sa scrii ceva mai mult cod atat in clasa listei cat si in clasa edit-ului, sa rezolvi cu tratarea anumitor mesaje de tastatura etc. Si aici sunt mici trick-uri care iti vor lua ceva timp pana le rezolvi.

Daca vrei asa ceva neaparat (ar fi avantajos daca, in afara de edit folosesti alte controale, sa zicem combobox-uri) te pot ajuta.
Trebuie sa-mi amintesc iar acum e tarziu si-s obosit. Poate maine...
Am facut si eu asa ceva cand eram mai mititel :) pentru oaresce grid-uri mai "haioase" pe care oricum le-am scris cap-coada.

Daca insa folosesti numai edit-uri, atunci cel mai simplu este asa cum ti-am spus mai devreme.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by mesajflaviu » 26 May 2011, 22:17

Cred ca ma limitez doar la edit-box-uri , cel putin deocamdata. Daca ai deja exemple , le voi studia bucuros, daca nu , pun eu osul la munca, doar ca nu iese ceva mai apelez aici acest forum (meserias). Numai bine !

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: CListCtrl (LVS_EDITLABELS) - mesaje la editare eticheta

Post by Ovidiu Cucu » 27 May 2011, 20:40

Am atasat aici si varianta fara LVS_EDITLABELS. Nu-i definitiva, e facuta la repezeala, dar in principiu merge chiar mai bine decat cealalta.
Il mai aranjez pe ici pe colo si dupa aia il pun la Proiecte.
Daca ai intrebari...
TestInPlace.zip
(11.97 KiB) Downloaded 265 times

Post Reply