DuiLib使用

初次用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的布局方法,同志仍需努力!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
duilib 是一个开源的界面库,它提供了丰富的界面控件和布局管理功能,非常适合用于开发Windows桌面软件。而MFC(Microsoft Foundation Class)是微软开发的用于Windows平台的C++类库,提供了大量的封装好的功能和控件,方便开发人员进行Windows应用程序的开发。 在duilib使用MFC的PictureControl控件,需要先在项目中引入MFC库,并创建一个MFC应用程序。然后,在duilib的界面布局文件中使用窗口控件,并设置控件类型为"Pic",通过name属性给控件命名。 接下来,在MFC应用程序中,创建一个继承自duilib::CPaintManagerUI的类,重写其中的虚函数Notify,用于监听控件的消息事件。在Notify函数中,通过duilib的API获取到PictureControl控件的指针,并调用MFC的相关函数,实现图片的加载和显示。 具体代码如下所示: 在duilib界面布局文件(XML)中添加如下代码: ```xml <Control name="picControl" type="Pic" pos="10, 10, 100, 100" /> ``` 在MFC应用程序的窗口类中添加如下代码: ```cpp class CMainWnd : public CDialogEx { public: CMainWnd(CWnd* pParent = nullptr) : CDialogEx(IDD_MAIN_DIALOG, pParent) { } protected: virtual void DoDataExchange(CDataExchange* pDX) override { CDialogEx::DoDataExchange(pDX); } afx_msg void OnPaint() { CPaintDC dc(this); // 获取duilib的PictureControl控件指针 duilib::CPictureUI* pPicControl = (duilib::CPictureUI*)GetDlgItem(IDC_DUI_PIC); if (pPicControl == nullptr) return; // 获取MFC的CDC对象 CDC* pDC = CDC::FromHandle(dc.GetSafeHdc()); // 加载图片 CImage image; image.Load(_T("path_to_your_image")); // 绘制图片 image.Draw(pDC->GetSafeHdc(), pPicControl->GetPos().left, pPicControl->GetPos().top, pPicControl->GetPos().Width(), pPicControl->GetPos().Height()); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMainWnd, CDialogEx) ON_WM_PAINT() END_MESSAGE_MAP() ``` 以上就是在duilib使用MFC的PictureControl控件的步骤,通过上述代码,可以实现在duilib界面中显示MFC加载的图片。当然,在实际的项目中,可能还需要添加图片缩放、鼠标事件等处理逻辑,具体根据实际需求进行扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值