Re: how to recive checkbox click event on CDateTimeCtrl?
I changed my mind about the way I was notifying the parent about the check
box status changes.
Instead of sending a seperate message to the parent I just add a value to
the dwFlag of pDTChange variable
BOOL CCheckDateTimeCtrl::OnDtnDatetimechange(NMHDR *pNMHDR, LRESULT
*pResult)
{
LPNMDATETIMECHANGE pDTChange =
reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
if (!m_Checked && pDTChange->dwFlags == GDT_VALID)
{
pDTChange->dwFlags |= 0x2;
m_Checked = TRUE;
}
else if (m_Checked && pDTChange->dwFlags == GDT_NONE)
{
pDTChange->dwFlags |= 0x4;
m_Checked = FALSE;
}
return FALSE;
}
This was all the parent window has to do is catch the DTN_DATETIMECHANGE
message and check for these values in the flag
Like this
void CDialogTestDlg::OnDtnDatetimechangeDatetimepicker1(NMHDR *pNMHDR,
LRESULT *pResult)
{
LPNMDATETIMECHANGE pDTChange =
reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
if (pDTChange->dwFlags & 0x2)
{
MessageBox("It was just checked");
}
else if (pDTChange->dwFlags & 0x4)
{
MessageBox("It was just unchecked");
}
}
AliR.
"AliR" <AliR@online.nospam> wrote in message
news:44f45188$0$15176$a8266bb1@reader.corenews.com...
You will have to do a little work yourself. When the control sends you a
DTN_DATETIMECHANGE it will actually tell you when the check box is
unchecked. If the dwFlags member of LPNMDATETIMECHANGE struct that is
passed to DTN_DATETIMECHANGE is GDT_NONE then the user just unchecked the
box.
So all you have to do is, derive a class from CDateTimeCtrl. Have a bool
flag that keeps track of the check state, set it to true by default. Take
over the DTN_DATETIMECHANGE using message reflection. When you detect a
uncheck and the flag says that it was checked before then you know that
they
just unchecked the checkbox, if you get a DTN_DATETIMECHANGE with dwFalgs
set to GDT_VALID and the check flag is false then you know that they just
checked it.
Here is the code:
CheckDateTimeCtrl.h
#pragma once
// CCheckDateTimeCtrl
#define WM_DTN_CHECKCHANGED WM_APP + 100
class CCheckDateTimeCtrl : public CDateTimeCtrl
{
DECLARE_DYNAMIC(CCheckDateTimeCtrl)
public:
CCheckDateTimeCtrl();
virtual ~CCheckDateTimeCtrl();
protected:
afx_msg BOOL OnDtnDatetimechange(NMHDR *pNMHDR, LRESULT *pResult);
DECLARE_MESSAGE_MAP()
private:
BOOL m_Checked;
};
CheckDateTimeCtrl.cpp
// CheckDateTimeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "CheckDateTimeCtrl.h"
// CCheckDateTimeCtrl
IMPLEMENT_DYNAMIC(CCheckDateTimeCtrl, CDateTimeCtrl)
CCheckDateTimeCtrl::CCheckDateTimeCtrl()
: m_Checked(TRUE)
{
}
CCheckDateTimeCtrl::~CCheckDateTimeCtrl()
{
}
BEGIN_MESSAGE_MAP(CCheckDateTimeCtrl, CDateTimeCtrl)
ON_NOTIFY_REFLECT_EX(DTN_DATETIMECHANGE, OnDtnDatetimechange)
END_MESSAGE_MAP()
// CCheckDateTimeCtrl message handlers
BOOL CCheckDateTimeCtrl::OnDtnDatetimechange(NMHDR *pNMHDR, LRESULT
*pResult)
{
LPNMDATETIMECHANGE pDTChange =
reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
if (!m_Checked && pDTChange->dwFlags == GDT_VALID)
{
MessageBox("Checked");
if (GetParent())
{
GetParent()->SendMessage(WM_DTN_CHECKCHANGED,1);
}
m_Checked = TRUE;
}
else if (m_Checked && pDTChange->dwFlags == GDT_NONE)
{
MessageBox("Unchecked");
if (GetParent())
{
GetParent()->SendMessage(WM_DTN_CHECKCHANGED,0);
}
m_Checked = FALSE;
}
return FALSE;
}
AliR.
"rsobies" <rsobies@discussions.microsoft.com> wrote in message
news:DD89522D-A097-4704-AB20-4D3B047D9BA4@microsoft.com...
this message is also send when a user change a date or when a user swich
betwean months. i want to know when exactly the checkbox is clicked
"AliR" wrote:
Well it does send a DTN_DATETIMECHANGE message.
AliR.
"rsobies" <rsobies@discussions.microsoft.com> wrote in message
news:C942CA85-9A0D-4D42-AA14-34901FFA192A@microsoft.com...
is there any way to handel this event?