Re: Custom Control - Notifcation Messages
An update.
It works, but I get warnings.
: warning C4311: 'type cast' : pointer truncation from 'MOUSE *' to =
'UINT'
: warning C4312: 'type cast' : conversion from 'UINT' to 'MOUSE *' of =
greater size
I don't think the warnings really matter.
I suppose that is the reasoning why we have to recast to a larger =
struct.
Perhaps there some deeper reasoning why we have to recast?
I also changed the following
nmhdr.idFrom = GetDlgItemID();
Thanks,
"Nobody" <Nobody@yahoo.com> wrote in message =
news:e%23bwDRx1HHA.4004@TK2MSFTNGP05.phx.gbl...
Hi,
Yay. I got it to work.
I am just responding with what I have done.
I changed things around somewhat.
I don't know whether it is a good or bad idea to put a pointer in code, =
or if that is how it is done?
I have seen it done differently, where they recast to another structure.
I am not sure what code is for exactly, just generic information =
perhaps?
It would be cool if it had a LPVOID pointer to pass and address, but I =
suppose I can just use the code to pass the address.
So, that is what I am doing.
Is that reccomended standard practice?
I would like to do this correctly from the beginning, instead of having =
to change things later on.
struct MOUSE
{
UINT nFlags;
CPoint point;
};
class CSomeControl
{
private:
MOUSE Mouse;
NMHDR nmhdr;
}
CSomeControl::OnLButtonDown(...)
{
if(GetMouseEvents()) //If MouseEvents Notifcation Messages Enabled
{
nmhdr.hwndFrom = GetSafeHwnd();
nmhdr.idFrom = ID_MYCONTROL;
nmhdr.code = (UINT)&Mouse;
Mouse.nFlags = nFlags;
Mouse.point = point;
GetParent()->SendMessage(WM_PARENTNOTIFY, =
UWM_MY_CONTROL_LBUTTONDOWN, (LPARAM)&nmhdr);
}
}
void CSomeClass::OnParentNotify(UINT message, LPARAM lParam)
{
CSomeBase::OnParentNotify(message, lParam);
if( message == UWM_MY_CONTROL_LBUTTONDOWN)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
MOUSE* pMouse = (MOUSE*)pNMHDR->code;
OnLButtonDown(pMouse->nFlags, pMouse->point);
}
}
Thanks,
"Nobody" <Nobody@yahoo.com> wrote in message =
news:ez6kJuw1HHA.5992@TK2MSFTNGP02.phx.gbl...
Hi Scott,
Thanks for the quick response.
Your absolutely right about the Send/Post.
I just started messing around making my own notification messages.
I'm just curious as to how Notification messages actually work.
I am a bit confused about WM_PARENTNOTIFY and WM_NOTIFY.
I think I am on the right track. I just need verification.
Thanks,
"Scott McPhillips [MVP]" <org-dot-mvps-at-scottmcp> wrote in message =
news:ctSdnXtPWvICqSjbnZ2dnUVZ_vumnZ2d@comcast.com...
Nobody wrote:
Hi,
I just started messing around with creating my own custom control =
notification messages,
so I am just curious about the inner workings of notifcation =
messages.
This is more or less just the philosphy behind notification messages =
and how they work.
Here, I have created my own notification message.
struct MOUSE
{
HWND hwndFrom;
UINT idFrom;
UINT code;
UINT nFlags;
CPoint point;
};
In the class, I extantiate the object
class CSomeControl
{
private:
MOUSE Mouse;
}
Then, in OnLButtonDown, OnLButtonUp, OnMouseMove, I send a =
Notifcation message.
if(GetMouseEvents()) //If MouseEvents Notifcation Messages Enabled
{
Mouse.hwndFrom = GetSafeHwnd();
Mouse.idFrom = ID_MYCONTROL;
Mouse.code = UWM_MYCONTROL_LBUTTONDOWN;
Mouse.nFlags = nFlags;
Mouse.point = point;
GetParent()->PostMessage(WM_NOTIFY, UWM_MYCONTROL_LBUTTONDOWN, =
(LPARAM)&Mouse);
}
Is that basically how it is done?
No, this has a bad bug. PostMessage returns to you before the message =
is processed. Then OnMouseMove might occur before the message is
processed, so you PostMessage again but you have now wiped out the
previous data in the Mouse struct, even though the handler of the =
first
message has not seen it yet. Solution: You must use SendMessage =
instead
of PostMessage. SendMessage does not return until the message has =
been
processed.
--
Scott McPhillips [MVP VC++]