15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Message reflection for a more portable button

Michael R. Muller -- mmuller@esri.com
Friday, January 03, 1997

Environment: VC++ 4.2-flat, NT 4.0

   I have a CButton derived owner-drawn button class that handles
its own BN_CLICKED message via ON_CONTROL_REFLECT(BN_CLICKED, OnClicked).
After the button executes something, I would to inform the parent
window(dlg) that the button has been clicked. Is there a preferred
method for this? The documentation states that it is possible to have
both the parent and the control process reflected messages, but I am
unable to find any examples or further doc that describes this. For now,
I have resorted to using something like...

void CMyButton::OnClicked() 
{
   // do something ...
   
	...

   // notify the parent that the button has been clicked
   GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(),
                            BN_MYCLICKED), (LPARAM)(m_hWnd));  
}

but this has the drawback of using a user-defined message (BN_MYCLICKED)
because using BN_CLICKED would just get reflected. Should I be looking
closer at OnNotify?

thanks in advance,

Michael Muller
mmuller@esri.com



Mike Morel -- mmorel@mushroomsoft.com
Saturday, January 04, 1997

This is from a Q & A in MFC For Yourself. October, 1996.  The example is 
for a list control, but should equally apply to a button:

Using message reflection, once the control handles the message, it is gone. 
 However, there is a macro available to change this behavior.  Instead of 
using ON_NOTIFY_REFLECT to reflect the message, use ON_NOTIFY_REFLECT_EX.
You must change the prototype of the handler function also.  Functions used 
to handle normal reflected messages return type void.  But 
ON_NOTIFY_REFLECT_EX handlers return type BOOL.  If the function returns 
TRUE, the message will go no further, just as in normal message reflection. 
 But if it returns FALSE, the control's parent will get a crack at the 
message also.
Here's how it looks in our CDBListCtrl class:

CDBListCtrl Message Map
BEGIN_MESSAGE_MAP(CDBListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CDBListCtrl)
	ON_NOTIFY_REFLECT_EX(LVN_ITEMCHANGED, OnItemChanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CDBListCtrl::OnItemChanged
BOOL CDBListCtrl::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
	*pResult = 0;
	... do something...
	return FALSE;				// let the parent handle if desired
	}

Mike Morel
mmorel@mushroomsoft.com
Mushroom Software
Home of MFC For Yourself
http://www.mushroomsoft.com


----------
From: 	Michael R. Muller[SMTP:mmuller@esri.com]
Sent: 	Friday, January 03, 1997 6:53 PM
To: 	MFC-L
Subject: 	Message reflection for a more portable button

Environment: VC++ 4.2-flat, NT 4.0

   I have a CButton derived owner-drawn button class that handles
its own BN_CLICKED message via ON_CONTROL_REFLECT(BN_CLICKED, OnClicked).
After the button executes something, I would to inform the parent
window(dlg) that the button has been clicked. Is there a preferred
method for this? The documentation states that it is possible to have
both the parent and the control process reflected messages, but I am
unable to find any examples or further doc that describes this. For now,
I have resorted to using something like...

void CMyButton::OnClicked()
{
   // do something ...

	...

   // notify the parent that the button has been clicked
   GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(),
                            BN_MYCLICKED), (LPARAM)(m_hWnd));
}

but this has the drawback of using a user-defined message (BN_MYCLICKED)
because using BN_CLICKED would just get reflected. Should I be looking
closer at OnNotify?

thanks in advance,

Michael Muller
mmuller@esri.com









| Вернуться в корень Архива |