Print Page | Close Window

Markup/XAML: Does anybody know how to hook the Mou

Printed From: Codejock Forums
Category: Codejock Products
Forum Name: Toolkit Pro
Forum Description: Topics Related to Codejock Toolkit Pro
URL: http://forum.codejock.com/forum_posts.asp?TID=24238
Printed Date: 22 December 2024 at 12:28pm
Software Version: Web Wiz Forums 12.04 - http://www.webwizforums.com


Topic: Markup/XAML: Does anybody know how to hook the Mou
Posted By: rvoith
Subject: Markup/XAML: Does anybody know how to hook the Mou
Date Posted: 26 November 2021 at 6:53am
Has anybody hooked the mouse-button events?

I see that Markup's XTPMarkupInputElement.h contain the following events

static CXTPMarkupRoutedEvent* m_pMouseLeaveEvent;
static CXTPMarkupRoutedEvent* m_pMouseEnterEvent;
static CXTPMarkupRoutedEvent* m_pMouseLeftButtonUpEvent;
static CXTPMarkupRoutedEvent* m_pMouseLeftButtonDownEvent;
static CXTPMarkupRoutedEvent* m_pMouseRightButtonUpEvent;
static CXTPMarkupRoutedEvent* m_pMouseRightButtonDownEvent;
static CXTPMarkupRoutedEvent* m_pMouseMoveEvent;
static CXTPMarkupRoutedEvent* m_pLostMouseCaptureEvent;

I also see that the MarkupPad-sample contain handlers for the Markup tags like MouseEnter and MouseLeave in found DynamicMarkup.xaml.

The markup looks like this in DynamicMarkup.xaml:
<Border Grid.Column="4" Background="Magenta"><TextBlock MouseEnter="SetText1" MouseLeave="SetText2" Padding="4" Text="Column 5"/></Border>

Note the "SetText1" and "SetText2". Further, in the MarkupPad-samples CMarkupPadView::CMarkupPadView(), you find the connection between 
the markup's SetText1 and SetText2 like:

SetDelegate(L"SetText1", CreateMarkupClassDelegate(this, &CMarkupPadView::OnSetText1));
SetDelegate(L"SetText2", CreateMarkupClassDelegate(this, &CMarkupPadView::OnSetText2));

This allows MarkupPad's own implementation to hook into the Markup tag's *attribute values* of SetText1 and SetText2. Below you see the handler for SetText1:

void CMarkupPadView::OnSetText1(CXTPMarkupObject* pSender, CXTPMarkupMouseEventArgs* /*pArgs*/)
{
((CXTPMarkupTextBlock*)pSender)->SetText(L"New Text");
}

The only challenge with this approach, is that the SetText1 now can be used in many Markup tag' attribute value, like for example:

<Border Grid.Column="4" Background="Magenta"><TextBlock MouseRightButtonUp="SetText1" MouseLeftButtonUp="SetText2" Padding="4" Text="Column 5"/></Border>

I would rather like to have a generic hook into the MouseLeft/RightButtonUp, and then for example check the Markup-tag's Tag-attribute.

Has anybody done something along these lines? 



-------------
Best regards,
Bob
Proud Programmer!



Replies:
Posted By: cpede
Date Posted: 29 November 2021 at 6:26am
Maybe you can do something like this:

CXTPMarkupString* pTag = MARKUP_STATICCAST(CXTPMarkupString, (CXTPMarkupHyperlink*)pSender)->GetTag());

CString sTag(*pTag);
if (sTag.Compare(_T("Tag1"))==0) //do smomething
else if (sTag.Compare(_T("Tag2"))==0) //do smomething
else if (sTag.Compare(_T("Tag3"))==0) //do smomething

pArgs->SetHandled();


-------------
Product: Xtreme ToolkitPro (24.0.0)
Platform: Windows 10 (x64)
Language: Visual Studio 2017 (C++)


Posted By: rvoith
Date Posted: 29 November 2021 at 7:39am
@cpede, thanks for answering!

Yes, that is along the lines I plan to check for the current tag, when my handler is called. 

However, my current main-challenge is to be able to set up the handler for the mouse-events at large.

I imagine that I have to AddHandler or SetDelegate in my class somehow. My current class is based on CXTPMarkupStatic (which has a CXTPMarkupContext-member), and thus I imagined that I could use something like this in the constructor:

GetMarkupContext()->AddHandler(CXTPMarkupInputElement::m_pMouseRightButtonUpEvent, 
CreateMarkupClassDelegate(this, &CMyStaticControl::OnMouseRightButtonUp));

This is in the hope that any right-click in my control, would trigger my handler (where I next-up can check the tag and do stuff along your lines). I imagine this would be similar to how the CMarkupPadView's constructor sets up the handler for the CXTPMarkupHyperlink::m_pClickEvent, like this;

AddHandler(CXTPMarkupHyperlink::m_pClickEvent,
     CreateMarkupClassDelegate(this, &CMarkupPadView::OnHyperlinkClick));





-------------
Best regards,
Bob
Proud Programmer!


Posted By: cpede
Date Posted: 29 November 2021 at 8:03am
OK I see.

What about standard MFC code and a HitTest, like this:

BEGIN_MESSAGE_MAP(CMyMarkup, CXTPMarkupStatic)
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()


void CMyMarkup::OnRButtonDown(UINT nFlags, CPoint point)
{
CXTPMarkupInputElement* pObject = m_pUIElement->InputHitTest(point);
CString sTag = ((CXTPMarkupObject*)pObject)->GetTagName();

__super::OnRButtonDown(nFlags, point);
}



-------------
Product: Xtreme ToolkitPro (24.0.0)
Platform: Windows 10 (x64)
Language: Visual Studio 2017 (C++)


Posted By: rvoith
Date Posted: 29 November 2021 at 8:21am
That is a great tip, which I might need to resolve to.

In CXTPMarkupContext's HandleMouseUpDown() something similar seem to be happening. The message == WM_RBUTTONUP is handled and an "routed event" seems to be triggered. Below you see the top of the method:

BOOL CXTPMarkupContext::HandleMouseUpDown(UINT message, WPARAM /*wParam*/, LPARAM lParam)
{
CXTPMarkupInputElement* pMouseOver = m_pMouseOver;
if (m_pMouseCapture)
pMouseOver = m_pMouseCapture;

if (!pMouseOver)
return FALSE;

CInputElementCollection listNewMouseOver;
BuildInputList(pMouseOver, &listNewMouseOver);

CXTPMarkupMouseButtonEventArgs* eMouseButtonEventArgs = new CXTPMarkupMouseButtonEventArgs(
message == WM_LBUTTONDOWN || message == WM_LBUTTONDBLCLK
? CXTPMarkupInputElement::m_pMouseLeftButtonDownEvent
: message == WM_LBUTTONUP
  ? CXTPMarkupInputElement::m_pMouseLeftButtonUpEvent
  : message == WM_RBUTTONDOWN
? CXTPMarkupInputElement::m_pMouseRightButtonDownEvent
: message == WM_RBUTTONUP
  ? CXTPMarkupInputElement::m_pMouseRightButtonUpEvent
  : NULL);

I was hoping that some of the CodeJock-samples could shred some light on how to use these mouse handllers in code. However, your tips might be the hack to get around this :-)



-------------
Best regards,
Bob
Proud Programmer!



Print Page | Close Window

Forum Software by Web Wiz Forums® version 12.04 - http://www.webwizforums.com
Copyright ©2001-2021 Web Wiz Ltd. - https://www.webwiz.net