duilib 快速入门
duilib入门基础一 容器之 BOX、VBOX、HBOX布局及其子控件align排列方式
duilib入门基础二 HBOX容器内 子控件margin定位规则
duilib入门基础三 VBOX容器内 子控件margin定位规则
duilib入门基础四 BOX容器内 子控件margin定位规则
duilib入门基础 六 见见世面,duilib 基本控件 Button 能实现的界面一览
duilib入门基础 七 见见世面,duilib 基本控件 复选框 单选框
duilib入门基础 八 见见世面,duilib 基本控件 滑动条
duilib入门基础 九 见见世面,duilib 基本控件 组合框
duilib入门基础 十 见见世面,duilib 基本控件 选项框 OptionBox
很多应用都有这样的场景,鼠标进入,显示按钮,鼠标离开 隐藏按钮
其实响应的是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="true"" />
<Event type="mouseleave" receiver=".\user" applyattribute="visible="false"" />
</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);
}