初次用duilib写一个小玩具,由于还不熟悉XML的布局相关的,所以比较简陋
功能描述:
模仿抖音小视频中的,一个窗口,询问是否喜欢我,点击‘喜欢’按钮则弹出小对话框,如果想点击‘不喜欢’,则鼠标移动上去后就弹开,让你点不到
主函数省略了!
class MWindow :public CWindowWnd, public INotifyUI,public CHorizontalLayoutUI
{
public:
virtual void DoEvent(TEventUI& event) //为响应鼠标的信号,
{
if (event.Type == UIEVENT_MOUSEENTER)
{
m_pain.SendNotify(this, DUI_MSGTYPE_MOUSEENTER); //鼠标穿过 就触发 注册这个信号
return;
}
__super::DoEvent(event);
}
virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
virtual void Notify(TNotifyUI &msg)
{
if (msg.sType == _T("click")) //处理鼠标单击产生的信号
{
if (msg.pSender->GetName() == _T("like")) //根据XML中设置的按钮,对点击该按钮的信号进行处理
{
::MessageBox(NULL, _T("我也喜欢你!"), _T("嘿嘿"), NULL); //开启小对话框,对点击事件进行回应
}
// if(msg.pSender->GetName() == _T(""))
}
}
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) //消息处理函数 继承来重写
{
LRESULT lRes = 0;
if (uMsg == WM_CREATE) //创建窗口时系统给消息处理程序发送的消息
{
m_pain.Init(m_hWnd); //m_hWnd是主窗口句柄
CDialogBuilder builder;
CControlUI *p = builder.Create(_T("m.xml"), (UINT)0, NULL, &m_pain); //调用Create ,加载XML文件开窗
ASSERT(p && "Failed to parse XML!");
m_pain.AttachDialog(p); //将控件添加到Hash表中
m_pain.AddNotifier(this); //添加通知处理
return lRes;
}
if (uMsg == WM_MOUSEMOVE) //鼠标移动的信号
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; //得到消息触发坐标
CControlUI* pHover = m_pain.FindControl(pt);
if (pHover == NULL) return 0;
if (pHover->GetName() == _T("unlike"))
{
srand(time(0));
pHover->SetVisible(false); //让控件消失
RECT re = pHover->GetPos(); //得到鼠标目前所在位置
long tmp1 = rand() % (300 - 50) + 50;
if (abs(tmp1 - re.left) < 50) { tmp1 += 50; } //这一部分是为了产生随机数,让按钮新位置随机产生
long tmp2 = tmp1 - 15; //但是逻辑上并不健全,有待完善
TCHAR pose[18]; memset(pose, 0, 18); //使用通用类型
_stprintf(pose,_T("%ld,%ld,%ld,%ld"),tmp1,tmp2,0,0);
pHover->SetAttribute(L"pos", pose); //给控件设置新位置
pHover->SetVisible(true);
}
}
if (m_pain.MessageHandler(uMsg, wParam, lParam, lRes))
{
return lRes;
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
private:
CPaintManagerUI m_pain;
};
上面是C++部分,还需要XML文件
m.xml
<?xml version="1.0" encoding="UTF-8"?>
<Window size="600,400" mininfo="150,100" caption="0,0,0,44" >
<HorizontalLayout bkcolor="#FFcfe2f3" > <!-- 整个窗口的背景 -->
<Button name="like" float="true" borderround="6,6" pos="390,280" text="喜欢" width="55" height="25" normalimage="file='button_pp.png' source='0,0,20,110'" hotimage="file='button.png'" pushedimage="file='button_push.png'"/>
<Button name="unlike" float="true" borderround="6,6" pos="110,280" text="不喜欢" width="55" height="25" normalimage="file='button_pp.png' source='0,0,20,110'"hotimage="file='button.png'" />
<Label name="douyoulove" text="你喜欢我吗?"size="12" float="true" pos="80,80" width="100" height="60" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="right"/>
</HorizontalLayout>
</Window>
XML中设置两个控件button,Label 并设置内容和属性
效果图
初始情况:
点击“不喜欢”,按钮弹走
点击“喜欢”,弹出新窗口
界面简陋,因为还不会XML的布局方法,同志仍需努力!