Re: Weird problem for BS_OWNERDRAW BN_CLICKED
After two days of working I finally get a working solution !!! :)
Here is the trick :
-----------------------------------------------------------------------------------
BEGIN_MESSAGE_MAP(CBitmapCheckBox, CButton)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_CONTROL_REFLECT(BN_CLICKED, &CBitmapCheckBox::OnBnClicked)
END_MESSAGE_MAP()
void CBitmapCheckBox::OnBnClicked()
{
// Do nothing !
// Message will be send to parent in Mouse Up Button event
}
void CBitmapCheckBox::OnLButtonUp(UINT nFlags, CPoint point)
{
CButton::OnLButtonUp(nFlags, point);
// Get windows rect
CRect rectButtton;
GetClientRect(&rectButtton);
// Verify that user has release the mouse
// button above the control
if ( rectButtton.PtInRect(point) )
{
// Change check state
if (m_bCheckState == BST_CHECKED)
{
m_bCheckState = BST_UNCHECKED;
}
else if (m_bCheckState == BST_UNCHECKED)
{
m_bCheckState = BST_CHECKED;
}
GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), BN_CLICKED);
}
// Refresh display
Invalidate();
}
void CBitmapCheckBox::OnLButtonDown(UINT nFlags, CPoint point)
{
// Set button state
m_iState = BTN_PUSHED_STATE;
// Refresh display
Invalidate();
CButton::OnLButtonDown(nFlags, point);
}
LRESULT CBitmapCheckBox::WindowProc(UINT message, WPARAM wParam, LPARAM
lParam)
{
// Owner drawn buttons (derived class) double click does only a
// WM_LBUTTONDOWN ! Here is the solution :
if (message == WM_LBUTTONDBLCLK)
{
message = WM_LBUTTONDOWN;
}
return CButton::WindowProc(message, wParam, lParam);
}
-----------------------------------------------------------------------------------
Thank anyway for your help :)
Regards,
"Somebody" wrote:
Are you getting a double click message?
"Erakis" <Erakis@discussions.microsoft.com> wrote in message
news:9020366E-3D3A-4135-9AD3-7B5168BEA5AF@microsoft.com...
Oups... sorry I did a mistake while copy/paste.
I my tes program this is really :
void CBitmapCheckBox::OnLButtonUp(UINT nFlags, CPoint point)
{
static int c = 1;
CString s;
s.Format( _T("%d X OnLButtonUp\n"), c );
wprintf(s);
++c;
CButton::OnLButtonUp(nFlags, point);
}
void CBitmapCheckBox::OnLButtonDown(UINT nFlags, CPoint point)
{
static int c = 1;
CString s;
s.Format( _T("%d X OnLButtonDown\n"), c );
wprintf(s);
++c;
CButton::OnLButtonDown(nFlags, point);
}
"Somebody" wrote:
Umm... because your trace for LButtonDown says "OnLButton *** UP ***"?
"Erakis" <Erakis@discussions.microsoft.com> wrote in message
news:D84E20E0-4D5B-4DEB-BD59-01A20109B79A@microsoft.com...
I did a second test to show you the problem.
On my CBitmapCheckBox class :
------------------------------------------------------------------------------------
void CBitmapCheckBox::OnLButtonUp(UINT nFlags, CPoint point)
{
static int c = 1;
CString s;
s.Format( _T("%d X OnLButtonUp\n"), c );
wprintf(s);
++c;
CButton::OnLButtonUp(nFlags, point);
}
void CBitmapCheckBox::OnLButtonDown(UINT nFlags, CPoint point)
{
static int c = 1;
CString s;
s.Format( _T("%d X OnLButtonUp\n"), c );
wprintf(s);
++c;
CButton::OnLButtonDown(nFlags, point);
}
------------------------------------------------------------------------------------
After doing a double click on my button, here is what I get on my VS
console :
1 X OnLButtonDown
1 X OnLButtonUp
2 X OnLButtonUp
Why do I did not get ?
1 X OnLButtonDown
1 X OnLButtonUp
2 X OnLButtonDown
2 X OnLButtonUp