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

你可能感兴趣的:(duilib)