1. 程式人生 > >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函式中處理按鈕的點選事件。

編譯執行效果如下:

這裡寫圖片描述