DirectUI介面程式設計(二)繪製一個按鈕

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