duilib 小知识 之 鼠标进入进出处理

 duilib 快速入门

duilib入门基础一 容器之 BOX、VBOX、HBOX布局及其子控件align排列方式

duilib入门基础二 HBOX容器内 子控件margin定位规则

​​​​​​duilib入门基础三 VBOX容器内 子控件margin定位规则

duilib入门基础四 BOX容器内 子控件margin定位规则

duilib入门基础五 简单示例之 文件选择框使用

duilib入门基础 六 见见世面,duilib 基本控件 Button 能实现的界面一览

duilib入门基础 七 见见世面,duilib 基本控件 复选框 单选框

duilib入门基础 八 见见世面,duilib 基本控件 滑动条

duilib入门基础 九 见见世面,duilib 基本控件 组合框

duilib入门基础 十 见见世面,duilib 基本控件 选项框 OptionBox

云信duilib基本控件示例下载

很多应用都有这样的场景,鼠标进入,显示按钮,鼠标离开 隐藏按钮

其实响应的是mouseEnter  mouseLeave消息

对于这个功能,duilib很容易就可以实现

首先看看 有哪些消息类型


//定义所有消息类型
enum EventType
{
	kEventInternalDoubleClick,
	kEventInternalMenu,
	kEventInternalSetFocus,
	kEventInternalKillFocus ,

	kEventNone,

	kEventFirst,

	kEventAll,

	kEventKeyBegin,
	kEventKeyDown,
	kEventKeyUp,
	kEventChar,
	kEventSystemKey,
	kEventKeyEnd,

	kEventMouseBegin,
	kEventMouseMove,
	kEventMouseEnter,
	kEventMouseLeave,
	kEventMouseHover,
	kEventMouseButtonDown,
	kEventMouseButtonUp,
	kEventMouseRightButtonDown,
	kEventMouseRightButtonUp,
	kEventMouseDoubleClick,
	kEventMouseMenu,
	kEventMouseScrollWheel,
	kEventMouseEnd,

	kEventTouchBegin,
	kEventTouchDown,
	kEventTouchMove,
	kEventTouchUp,
	kEventTouchEnd,

	kEventPointBegin,
	kEventPointDown,
	kEventPointMove,
	kEventPointUp,
	kEventPointEnd,

	kEventSetFocus,
	kEventKillFocus,
	kEventWindowSize,
	kEventWindowClose,
	kEventSetCursor,

	kEventClick,
	kEventSelect,
	kEventUnSelect,

	kEventTextChange,
	kEventReturn,
	kEventTab,
	kEventCustomLinkClick,

	kEventImeStartComposition,
	kEventImeEndComposition,

	kEventScrollChange,
	kEventValueChange,
	kEventResize,

	kEventNotify,	//仅作简单的通知,有复杂数据请通过其他方式实现

	kEventLast,
};

部分对应的字符串


#define	EVENTSTR_ALL				(_T("all"))
#define	EVENTSTR_KEYDOWN			(_T("keydown"))
#define	EVENTSTR_KEYUP				(_T("keyup"))
#define	EVENTSTR_CHAR				(_T("char"))
#define	EVENTSTR_SYSKEY				(_T("syskey"))

#define EVENTSTR_SETFOCUS			(_T("setfocus"))
#define EVENTSTR_KILLFOCUS			(_T("killfocus"))
#define	EVENTSTR_SETCURSOR			(_T("setcursor"))

#define EVENTSTR_MOUSEMOVE			(_T("mousemove"))
#define	EVENTSTR_MOUSEENTER			(_T("mouseenter"))
#define	EVENTSTR_MOUSELEAVE			(_T("mouseleave"))
#define	EVENTSTR_MOUSEHOVER			(_T("mousehover"))

#define	EVENTSTR_BUTTONDOWN			(_T("buttondown"))
#define	EVENTSTR_BUTTONUP			(_T("buttonup"))
#define	EVENTSTR_RBUTTONDOWN		(_T("rbuttondown"))
#define	EVENTSTR_DOUBLECLICK		(_T("doubleclick"))

#define EVENTSTR_SELECT				(_T("select"))
#define EVENTSTR_UNSELECT			(_T("unselect"))
#define	EVENTSTR_MENU				(_T("menu"))

#define	EVENTSTR_SCROLLWHEEL		(_T("scrollwheel"))
#define EVENTSTR_SCROLLCHANGE		(_T("scrollchange"))

#define EVENTSTR_VALUECHANGE		(_T("valuechange"))
#define EVENTSTR_RETURN				(_T("return"))
#define EVENTSTR_TAB				(_T("tab"))
#define EVENTSTR_WINDOWCLOSE		(_T("windowclose"))

方法有很多,可以   通过AttachMouseEnter 、AttachMouseLeave方式,可以自己写判断,这里介绍一种更简单的方式

方法一: XML层确定消息处理

直接在XML写这一层逻辑就可以了

示例:

                            <BitmapControl name="bypass_screen1" margin="0,0,50,50" bkcolor="bk_video_content" visible="false" maxwidth="120" maxheight="120" minwidth="90" minheight="90" valign="bottom" halign="right" mousechild="false">
                                <Box bkcolor="xnw_trans" bordersize="1" bordercolor="white_trans_80" valign="bottom" name="userBox" visible="false">
                                    <Box bkcolor="black_trans_20" halign="center" width="auto" height="auto" valign="bottom" padding="5,2,5,2" margin="0,0,0,10" borderround="10,10">
                                        <Label name="user" width="auto" height="auto" text="" normaltextcolor="white" visible="false" />
                                    </Box>
                                </Box>
                                <Event type="mouseenter" receiver=".\user" applyattribute="visible=&quot;true&quot;" />
                                <Event type="mouseleave" receiver=".\user" applyattribute="visible=&quot;false&quot;" />
                            </BitmapControl>

方法二:控件绑定鼠标消息

此方法,等同以下C++代码实现方式

		pVideoBox_ = (ui::Box*)FindControl(L"VideoBox");


		pVideoBox_->AttachMouseEnter([this](ui::EventArgs* param){

			scale_menu_box_->SetVisible(true);
			return true;
		});


		pVideoBox_->AttachMouseLeave([this](ui::EventArgs* param){

			scale_menu_box_->SetVisible(true);
			return true;
		});

不过 ,这种方式虽然简单,但有一个前提,就是必须将这个控件设置为 mousechild="false" 才可以,否则 鼠标消息会被子控件截取处理。

方法三 :控件绑定BubbledEvent  

这样不管子控件是不是截取了,都会触发

		pIntWindow_->AttachBubbledEvent(ui::kEventMouseEnter, [this](ui::EventArgs* param){


			if (BStudentApp())
			{
				scale_menu_box_->SetVisible(true);
				if (pFontPage->m_bCurIsMainVideo)
				{
					ShowFullBtn_Stu(true);
				}
				else{
					ShowFullBtn_Stu(false); //小窗的时候 不显示全屏
				}
			}
			



				return true;
		});
		pIntWindow_->AttachBubbledEvent(ui::kEventMouseLeave, [this](ui::EventArgs* param){


			if (BStudentApp())
			{
				scale_menu_box_->SetVisible(false);
				if (pFontPage->m_bCurIsMainVideo)
				{
					ShowFullBtn_Stu(true);
				}
				else{
					ShowFullBtn_Stu(false); //小窗的时候 不显示全屏
				}
			}

			return true;
		});

方法四: 绘制过程中,根据坐标判断

上述两种方法,都对子控件鼠标属性有所限制,有时候不得不使用这种笨方法

			POINT pt;
			GetCursorPos(&pt);
			ScreenToClient(GetHWND(), &pt); //获得光标位置,转成客户区坐标

			ui::UiRect rc = pVideoBox_->GetPos();
			if (PtInRect(&rc, pt))
			{
				scale_menu_box_->SetVisible(true);
			}
			else{
				scale_menu_box_->SetVisible(false);
			}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值