• DirectUI界面编程(二)绘制一个按钮


    上节介绍了使用源码方式构建Duilib应用的项目配置,并创建了一个最简单的基于Duilib库的窗口,细心的读者会发现,当我们点击窗口的关闭按钮时,应用并没有真的退出,因为我们并没有对窗口事件进行处理,本节我们在窗口中绘制一个按钮并响应窗口及按钮的相关事件。

    在窗口中绘制一个按钮我们需要以下几个步骤:

    1. 创建并初始化CPaintManagerUI对象,CPaintManagerUI类是Duilib库的绘图管理器,用于管理整个窗口的绘制。
    2. 创建CButtonUI对象,并调用CPaintManagerUI对象的AttachDialog函数将CButtonUI对象附加到CPaintManagerUI对象中。
    3. 调用CPaintManagerUI对象的AddNotifier为按钮指定消息处理类。
    4. 在WM_PAINT消息处理中调用CButtonUI对象的SetPos函数设置按钮的位置和大小。

    案例代码如下:

    #include <Windows.h>
    #include "../DuiLib/StdAfx.h" 
    using namespace DuiLib;
    class CMyWnd : public CWindowWnd,public INotifyUI
    {
    public:
        CMyWnd(){}
        LPCTSTR GetWindowClassName() const
        {
            return L"MyWnd";
        }
        UINT GetClassStyle() const{
            return UI_CLASSSTYLE_FRAME|CS_DBLCLKS;
        }
        void Notify(TNotifyUI& msg)
        {
            //判断是否为点击事件
            if(msg.sType == L"click")
            {
                //判断事件源名称是否为CloseBtn
                if(msg.pSender->GetName() == L"CloseBtn")
                {
                    if(IDOK == ::MessageBox(NULL,L"退出程序?",L"提示信息",MB_OKCANCEL))
                    {
                        ::PostQuitMessage(0);
                    }
                }
            }
        }
        LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
        {
            switch(uMsg)
            {
            case WM_CREATE:
                {
                    m_PaintMgr.Init(m_hWnd); 
                    //创建按钮
                    m_pCloseBtn = new CButtonUI();
                    m_pCloseBtn->SetName(L"CloseBtn");
                    m_pCloseBtn->SetBkColor(0xFFFF0000);
                    m_pCloseBtn->SetText(L"关闭按钮");
                    m_pCloseBtn->SetVisible(true);
                    m_PaintMgr.AttachDialog(m_pCloseBtn); 
                    m_PaintMgr.AddNotifier(this);
                }
                break;
            case WM_PAINT:
                {
                    RECT rect = {100,100,200,150};
                    m_pCloseBtn->SetPos(rect);
                }
                break;
            case WM_DESTROY:
                ::PostQuitMessage(0);
                break;
            } 
            LRESULT lRes=0;
            if(m_PaintMgr.MessageHandler(uMsg,wParam,lParam,lRes)) return lRes;
            return CWindowWnd::HandleMessage(uMsg,wParam,lParam);
        }
    
        ~CMyWnd(){}
    private:
        CPaintManagerUI m_PaintMgr; 
        CControlUI* m_pCloseBtn;
    };
    INT WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,INT Show)
    {
        CPaintManagerUI::SetInstance(hInst);
        //创建主窗口
        CMyWnd* pFrame = new CMyWnd();
        pFrame->Create(NULL,L"Hello World!",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
        pFrame->CenterWindow();
        //设置窗口大小
        pFrame->ResizeClient(800,600);
        pFrame->ShowWindow(true);
        CPaintManagerUI::MessageLoop();
         delete pFrame;
        return 0;
    }

    在CMyWnd类中增加了两个成员属性m_PaintMgr和m_pCloseBtn,它们分别为CPaintManagerUI 类的对象和CControlUI对象指针。在CMyWnd类中我们重写父类的HandleMessage函数处理Windows窗口消息,重写Notify函数来处理自绘控件相关的消息。

    在窗口创建消息WM_CREATE中调用CPaintManagerUI 类的Init函数初始化m_PaintMgr对象并创建按钮对象,將按钮附加到m_PaintMgr对象中。在CMyWnd 的Notify函数中处理按钮的点击事件。

    编译运行效果如下:

    这里写图片描述

    博文源码:https://github.com/rongbo-j/duilib-tutorial

  • 相关阅读:
    限制泛型可用类型
    泛型的常规用法(声明两个类型)
    一个类似于金字塔的图形
    Fibonacci数
    快来秒杀我
    奇偶数分离
    Background
    Financial Management
    HangOver
    Binary String Matching
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468646.html
Copyright © 2020-2023  润新知