Cum pot pune un CCtrlView pe un CComboBox ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot pune un CCtrlView pe un CComboBox ?

Post by Ovidiu Cucu » 11 Feb 2011, 11:49

mesajflaviu wrote: apelez o metoda care mi-ar putea provoca CBN_ONCLOSEUP , in combobox :

Code: Select all

void CTreeComboBox::TreeCtrlDone()
{
	OnCloseUp();
}
Ceea ce ai facut acolo NU se cheama "provoc CBN_CLOSEUP in combobox" ci "apelez direct si nemijlocit functia CTreeComboBox::OnCloseup()".

In primul rand CBN_CLOSEUP trebuie sa-l primeasca parintele combobox-ui (via WM_COMMAND).
Dupa aia vezi ce se intampla cu mesajul "reflectat" in control.

Pentru lamurire, trage un ochi in surse si vezi ca nenea ClassWizard pune in clasa combobox-ului ON_CONTROL_REFLECT(CBN_CLOSEUP... si nu ON_CONTROL(CBN_CLOSEUP...
Dupa aia poti sa te uiti si prin MSDN la CBN_CLOSEUP Notification Code si la Handling Reflected Messages cu accent pe
The parent window of the combo box receives this notification code through the WM_COMMAND message.
si pe
Message reflection lets you handle messages for a control, such as WM_CTLCOLOR, WM_COMMAND, and WM_NOTIFY, within the control itself.
// Daca tot ne-am apucat de "carchit" controale, hai macar s-o facem gospodareste! :)



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

Re: Cum pot pune un CCtrlView pe un CComboBox ?

Post by mesajflaviu » 11 Feb 2011, 19:48

Sa inteleg ca trebuie sa trimit mesaj din CTreeComboBox catre parinte prin WM_COMMAND ?

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

Re: Cum pot pune un CCtrlView pe un CComboBox ?

Post by Ovidiu Cucu » 11 Feb 2011, 23:03

DA.
Ceva de genul:

Code: Select all

void CTreeComboBox::TreeCtrlDone()
{
   //// OnCloseUp(); <--- sterge te rog gluma asta!
   CWnd* pParent = GetParent();
   if(NULL != pParent)
   {
      WPARAM wParam = MAKEWPARAM(GetDlgCtrlID(), CBN_CLOSEUP);
      pParent->SendMessage(WM_COMMAND, wParam, (LPARAM)m_hWnd);
   } 
}
void CTreeComboBox::OnCloseup() 
{	
} // <--- pune breakpoint aici si-ai sa vezi ca intra...
Eu cred ca in link-urile pe care ti le-am dat se explica destul de clar ce si cum, totusi sa reiau cu alte cuvinte si pe romaneste.
In Windows, mesajele de notificare sunt trimise de copii catre parinte ca sa-l anunte ceva (ex: Gigel n-a fost cuminte).
Atunci parintele, daca vrea, poate sa-l traga pe Gigel de urechi.
Cei care au facut MFC-ul si nu numai ei, au zis: "Ar fi mai OOP daca s-ar trage Gigel singur de urechi". :biggrin:
Atunci s-au inventat aceste notificari "reflectate" care vin de la parinte la copil.

Acuma, programatorul are doua optiuni:
  • sau trateaza notificarea in clasa ferestrei parinte, asa cum a fost proiectat in Windows;
  • sau o trateaza pe cea reflectata in clasa controlului; in lista de la ClassWizard este un semn egal in fata, (ex. '=CBN_CLOSEUP' ca sa vezi ca nu-i chiar unul si acelasi lucru cu 'CBN_CLOSEUP').

Ideea e ca, daca vrei sa simulezi o notificare in controlul tau modificat, atunci trebuie sa pastrezi mecanismul original.
Altfel, poate deveni nashpa, enervant, bagos, zi cum vrei. ;)

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

Re: Cum pot pune un CCtrlView pe un CComboBox ?

Post by mesajflaviu » 12 Feb 2011, 15:11

Super fain !! Merge acum ... am invatat ceva aici !!! Intradevar , acum in CTreeComboBox am eveniment :

Code: Select all

void CTreeComboBox::OnCloseup() 
{
	// TODO: Add your control notification handler code here

	TRACE("\n CTreeComboBox::OnCloseup() \n");
}
dar daca tratez evenimentul aici , nu il mai am in parinte :

Code: Select all

void CTestTreeComboView::OnCloseupCombo1() 
{
	// TODO: Add your control notification handler code here

	TRACE("\n The user has done with treectrl \n");
}
... mii de multumiri !!!
Attachments
TestTreeCombo.rar
(87.5 KiB) Downloaded 276 times

Post Reply