WM_LBUTTONDBLCLK netratat
WM_LBUTTONDBLCLK netratat
Am o aplicatie construita cu wizard-ul din VS2010 de tipul MDI cu project style Visual Studio (usor de generat din cateva click-uri).
In stanga am un tree generat de wizard ca demo intr-o clasa de CClassView : public CDockablePane.
Incerc sa tratez mesaje de mouse pe item-urile tree-ului cu handler-ele aferente genrate de Class Wizard (WM_LBUTTONDBLCLK) dar e noapte... Mesajele de right/left click up/down nu sunt prinse desi in zona de message maps am: ON_WM_LBUTTONDBLCLK() , ON_WM_LBUTTONDOWN(), ON_WM_RBUTTONDOWN(), ON_WM_RBUTTONUP().
Am dat o geana cu Spy++ si iata cam ce am prins: Aveti idee cum as putea prinde aceste mesaje in aplicatia mea?
In stanga am un tree generat de wizard ca demo intr-o clasa de CClassView : public CDockablePane.
Incerc sa tratez mesaje de mouse pe item-urile tree-ului cu handler-ele aferente genrate de Class Wizard (WM_LBUTTONDBLCLK) dar e noapte... Mesajele de right/left click up/down nu sunt prinse desi in zona de message maps am: ON_WM_LBUTTONDBLCLK() , ON_WM_LBUTTONDOWN(), ON_WM_RBUTTONDOWN(), ON_WM_RBUTTONUP().
Am dat o geana cu Spy++ si iata cam ce am prins: Aveti idee cum as putea prinde aceste mesaje in aplicatia mea?
- Silviu Ardelean
- Senior
- Posts: 1175
- Joined: 12 Jul 2007, 09:22
- Contact:
Re: WM_LBUTTONDBLCLK netratat
O varianta de-a prinde mesajele ar fi sa metoda PreTranslateMessage().
Code: Select all
BOOL CClassView::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_LBUTTONDBLCLK:
OnLButtonDblClk( MK_LBUTTON, pMsg->pt);
break;
default:
break;
}
return CDockablePane::PreTranslateMessage(pMsg);
}
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: WM_LBUTTONDBLCLK netratat
Am o mica observatie. In general e bine sa eviti sa chemi handlere de mesaje de pe unde te taie capul.
Sa zicem ca aici rezolvam problema si stergem/comentam apelul la handlerul din clasa de baza...
...si evitam astfel ceva care nu trebuie facut, intr-o aplicatie babana s-ar putea sa ajungi sa-ti prinzi urechile prin handlere.
Asa ca, lasa handlerele asa cum sunt apelate de la mama lor framework si, daca vrei sa face ceva mai special fa-o intr-o functie privata.
Exemplu:
Sa zicem ca aici rezolvam problema si stergem/comentam apelul la handlerul din clasa de baza...
Code: Select all
void CClassView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// CDockablePane::OnLButtonDblClk(nFlags, point); // <- DELETE THIS
// blah-blah...
}
Asa ca, lasa handlerele asa cum sunt apelate de la mama lor framework si, daca vrei sa face ceva mai special fa-o intr-o functie privata.
Exemplu:
Code: Select all
BOOL CClassView::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_LBUTTONDBLCLK:
_DoSomethingCool(pMsg->pt);
break;
// ...
}
return CDockablePane::PreTranslateMessage(pMsg);
}
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
- Marius Bancila
- Fondator
- Posts: 2344
- Joined: 11 Jul 2007, 11:45
- Judet: Timiş
- Location: Timisoara
- Contact:
Re: WM_LBUTTONDBLCLK netratat
O "rule of thumb" (cum ii zice la asta in Romana?) e ca handlerele sunt metoda apelate de framework, si nu trebuie sa le apelezi in mod explicit. Daca ai ceva functionalitate intr-un handler ce trebuie sa se executa si din alt context, atunci fa putin refactoring, extrage acea functionalitate intr-o functie separata si apeleaz-o de unde e nevoie.
Re: WM_LBUTTONDBLCLK netratat
1st Multumesc! 
Problema ce-am sesizat-o eu si am expus-o mai sus pare a fi un bug. Practic cu ON_WM_LBUTTONDBLCLK() in zona de messages map nu se intampla nimic si am zis sa nu fac o ciobaneala de genu' celei prezentate de Ovidiu initial (primul sample).
De aceea ma gandeam la fel diverse idei, de genul mesajelor reflectate.

Problema ce-am sesizat-o eu si am expus-o mai sus pare a fi un bug. Practic cu ON_WM_LBUTTONDBLCLK() in zona de messages map nu se intampla nimic si am zis sa nu fac o ciobaneala de genu' celei prezentate de Ovidiu initial (primul sample).
De aceea ma gandeam la fel diverse idei, de genul mesajelor reflectate.
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: WM_LBUTTONDBLCLK netratat
[ off-topic ]Marius Bancila wrote:... Daca ai ceva functionalitate intr-un handler ce trebuie sa se executa si din alt context, atunci fa putin refactoring, extrage acea functionalitate intr-o functie separata si apeleaz-o de unde e nevoie.
Aha, deci asta inseamna vestitul "refactoring" cu care se bat unii in piept. Nu stiam ca fac asta de-o viata...

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
- Marius Bancila
- Fondator
- Posts: 2344
- Joined: 11 Jul 2007, 11:45
- Judet: Timiş
- Location: Timisoara
- Contact:
Re: WM_LBUTTONDBLCLK netratat
Da, asta e "extract method" (http://www.refactoring.com/catalog/extractMethod.html). Inca putin si o sa-ti dai seama ca folosesti si design patterns de o viata si acuma afli si tu... 

- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: WM_LBUTTONDBLCLK netratat
Da, mai ales KISS Pattern.Marius Bancila wrote:...
Inca putin si o sa-ti dai seama ca folosesti si design patterns de o viata si acuma afli si tu...
Daca toti s-ar face architecti, ar disparea programatorii iar programele ar deveni... forme fără fond.

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: WM_LBUTTONDBLCLK netratat
[ Later edit, also off-topic]
Aceasta este o dramatizare dupa o intamplare reala. Din motive lesne de inteles, numele unor locuri si personaje au fost schimbate.
NOTA:Intr-o buna zi, un mare Architect cobora din Inalturi sa vada ce mai fac creaturile mici si negre, puse sa-i desavarseasca Opera.
Vazu una care tocmai se pregatea sa dea cu tastatura-n monitor.
"What's up?" intreba El cu indreptatita mirare.
"F*** this ******* architecture!" i se raspunse in furniceasca vulgara, imposibil de tradus.
Atunci, The Architect ofta, o batu compatimitor pe umar si-i zise cu blandete: "Don't be upset! I was a developer too".
Aceasta este o dramatizare dupa o intamplare reala. Din motive lesne de inteles, numele unor locuri si personaje au fost schimbate.

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: WM_LBUTTONDBLCLK netratat
Revenind on topic.
In fond si la urma urmei nici n-ai nevoie sa "prinzi" WM_LBUTTONDBLCLK.
Un control precum treeview-ul trimite notificarea NM_DBLCLK la parinte. Mapeaz-o pe aia si lasa-l in pace pe PreTranslateMessage.
In fond si la urma urmei nici n-ai nevoie sa "prinzi" WM_LBUTTONDBLCLK.
Un control precum treeview-ul trimite notificarea NM_DBLCLK la parinte. Mapeaz-o pe aia si lasa-l in pace pe PreTranslateMessage.
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: WM_LBUTTONDBLCLK netratat
Da. Din fericire wizard-ul a generat o clasa CViewTree ce suprascria CTreeCtrl si acolo pot avea notificarea NM_DBLCLK.Ovidiu Cucu wrote: In fond si la urma urmei nici n-ai nevoie sa "prinzi" WM_LBUTTONDBLCLK.
Un control precum treeview-ul trimite notificarea NM_DBLCLK la parinte. Mapeaz-o pe aia si lasa-l in pace pe PreTranslateMessage.
Faza e ca, data fiind arhitectura aplicatiei, mi-e mai util sa prind WM_LBUTTONDBLCLK pe PreTranslateMessage() din CMainFrame... deci e ok si asa.
Many Thanks!
