1. 程式人生 > >SkinUI入門教程(十) SkinUI自定義控制元件和常用元件

SkinUI入門教程(十) SkinUI自定義控制元件和常用元件

10.1 自定義控制元件

View元件只是一個矩形的空白區域,沒有任何內容。對於SkinUI的其他UI元件來說,它們都繼承了View元件,然後在View元件提供的空白區域上繪製外觀。

基於SkinUI UI元件的實現原理,當SkinUI系統提供的UI元件不足以滿足專案需求時,開發者完全可以通過繼承View元件來派生自定義元件。當開發者打算派發自己的UI元件時,首先定義一個繼承View的子類,然後重寫View類的一個或多個方法。下面是一個自定義元件的原始碼:

  • 標頭檔案

    class CSkinMyButton : public CSkinButton
    {
    public:
      CSkinMyButton(CSkinView* pParent);
    public:
      virtual void DrawForeground(HDC hdc);
      SKINUI_DECLARE_DYNCREATE()
    };
  • 原始檔

    SKINUI_IMPLEMENT_DYNCREATE(CSkinMyButton)
    CSkinMyButton::CSkinMyButton(CSkinView* pParent)
    : CSkinButton(pParent)
    {
    }
    void CSkinMyButton::DrawForeground(HDC hdc)
    {
    }

    以上程式碼通過兩個巨集將自定義控制元件註冊到SkinUI的工廠函式,可以在佈局檔案裡通過【SkinMyButton】使用這個控制元件。
    給自定義控制元件增加自定義屬性,可以通過重寫以下方法:

  • 標頭檔案

    virtual void InitAttribute(const CXMLNode& node);
  • 原始檔

    void CSkinMyButton::InitAttribute(const CXMLNode& node)
    {
      CSkinButton::InitAttribute(node);
    
      tstring strAttribute;
      if(node.GetAttribute(_T("MyAttribute"), strAttribute))
      {
          m_MyAttribute = strAttribute;
      }
    }

10.2 常用元件

10.2.1 選單


選單元件
  • 呼叫以下介面彈出資源選單:

    static HWND PopupMenu(CSkinDialog* pNotifyDlg, const tstring& strMenu, const CPoint& ptPopup, const CSize& szButton, PopupDirection direction = PD_UNKNOWN, CSkinView* pNotifyView = NULL);
  • 呼叫以下介面彈出動態選單:

    static HWND PopupMenu(CSkinDialog* pNotifyDlg, const CXMLNode& xmlNode, const CPoint& ptPopup, const CSize& szButton, PopupDirection direction = PD_UNKNOWN, CSkinView* pNotifyView = NULL);

    彈出選單時,可以自適應方向彈出,也可以指定彈出方向。

    //彈出方向
    enum PopupDirection
    {
      PD_UNKNOWN = 0x0000,        //自適應
      PD_LEFT_TOP = 0x0001,        //左上彈出
      PD_RIGHT_TOP = 0x0002,        //右上彈出
      PD_LEFT_BOTTOM = 0x0004,    //左下彈出
      PD_RIGHT_BOTTOM = 0x0008    //右下彈出
    };
  • 下面是彈出選單的程式碼的示例程式碼:

    void CMainDialog::OnBtnClickedPopMenu(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      if(pView)
      {
          CRect rect = pView->GetRect();
          CPoint ptOffset = pView->GetScrollOffset(CRect());
          CPoint pt(rect.left - ptOffset.x, rect.bottom - ptOffset.y);
          pView->GetOwner()->ClientToScreen(pt);
          SkinUI::PopupMenu(this, _T("MainMenu.xml"), pt,rect.Size(), PD_UNKNOWN);
      }
    }

10.2.2 模態訊息框


模態訊息框元件
  • 呼叫以下介面彈出模態訊息框:

    static UINT MsgBox(const tstring& strText, HWND hParent = NULL, const tstring& strCaption = _T(""), UINT nType = MB_OK, const tstring& strOk = _T(""), const tstring& strCancel = _T(""), const tstring& strCheckBox = _T(""), BOOL bChecked = FALSE, tstring& strEditText = tstring(), BOOL bEditView = FALSE);
  • 或者呼叫對話方塊的方法:

    UINT MsgBox(const tstring& strText, const tstring& strCaption = _T(""), UINT nType = MB_OK, const tstring& strOk = _T(""), const tstring& strCancel = _T(""), const tstring& strCheckBox = _T(""), BOOL bChecked = FALSE, tstring& strEditText = tstring(), BOOL bEditView = FALSE);
  • nType僅支援以下型別:

    MB_OK
    MB_YESNO
    MB_ICONWARNING
    MB_ICONERROR
  • 下面是彈出模態訊息框的程式碼的示例程式碼:

    void CMainDialog::OnBtnClickedMsgBox(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      MsgBox(SkinUI::GetString(_T("IDS_CONTROL_SHOW_TEXT23")));
    }

10.2.3 非模態訊息框


非模態訊息框元件
  • 呼叫以下介面彈出非模態訊息框:

    static UINT MsgBoxModeless(const tstring& strText, HWND hParent = NULL, const tstring& strCaption = _T(""), UINT nType = MB_OK, const tstring& strOk = _T(""), const tstring& strCancel = _T(""), const tstring& strCheckBox = _T(""), BOOL bChecked = FALSE, UINT nId = 0, LPARAM lParam = NULL);
  • 或者呼叫對話方塊的方法:

    UINT MsgBoxModeless(const tstring& strText, const tstring& strCaption = _T(""), UINT nType = MB_OK, const tstring& strOk = _T(""), const tstring& strCancel = _T(""), const tstring& strCheckBox = _T(""), BOOL bChecked = FALSE, UINT nId = 0, LPARAM lParam = NULL);
  • nType僅支援以下型別:

    MB_OK
    MB_YESNO
    MB_ICONWARNING
    MB_ICONERROR
  • 下面是彈出非模態訊息框的程式碼的示例程式碼:

    void CMainDialog::OnBtnClickedMsgBoxModeless(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      MsgBoxModeless(SkinUI::GetString(_T("IDS_CONTROL_SHOW_TEXT24")));
    }

10.2.3 Alert


Alert元件
  • 呼叫以下介面彈出Alert:

    void Alert(const tstring& strTitle, const tstring& strMessage, const tstring& strButtonName);
  • 下面是彈出Alert的示例程式碼:

    void CMainDialog::OnBtnClickedAlert(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      tstring strTitle = _T("提示");
      tstring strMessage = _T("這是一個提示資訊!");
      tstring strButtonName = _T("確定");
      Alert(strMessage, strTitle, strButtonName);
    }

10.2.4 Confirm


Confirm元件
  • 呼叫以下介面彈出Confirm:

    UINT Confirm(const tstring& strTitle, const tstring& strMessage, const tstring& strButtonOK, const tstring& strButtonCancel);
  • 下面是彈出Confirm的示例程式碼:

    void CMainDialog::OnBtnClickedConfirm(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      tstring strTitle = _T("提示");
      tstring strMessage = _T("有沒有收到我的訊息?");
      tstring strButtonOK = _T("收到");
      tstring strButtonCancel = _T("沒有");
      UINT nIndex = Confirm(strMessage, strTitle, strButtonOK, strButtonCancel);
    }

10.2.5 Prompt


Prompt元件
  • 呼叫以下介面彈出Prompt:

    UINT Prompt(const tstring& strTitle, const tstring& strMessage, const tstring& strButtonOK, const tstring& strButtonCancel, tstring& strEditText);
  • 下面是彈出Prompt的示例程式碼:

    void CMainDialog::OnBtnClickedPrompt(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      tstring strTitle = _T("提示");
      tstring strMessage = _T("有沒有收到我的訊息?");
      tstring strButtonOK = _T("收到");
      tstring strButtonCancel = _T("沒有");
    
      tstring strEditText;
      LONG nIndex = GetOwner()->Prompt(strMessage, strTitle, strButtonOK, strButtonCancel, strEditText);
    }

10.2.6 Toast


Toast元件
  • 呼叫以下介面彈出Toast:

    void Toast(const tstring& strText, UINT nType = TOAST_INFORMATION, int nDuration = 2, int nDelay = 0);
  • 下面是彈出Toast的示例程式碼:

    void CMainDialog::OnBtnClickedToast(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      tstring strText = _T("這是一個提示資訊!");
      UINT nType = TOAST_INFORMATION;
      int nDuration = 5;
      int nDelay = 0;
      Toast(strText, nType, nDuration, nDelay);
    }

10.2.7 ActionSheet


ActionSheet元件
  • 呼叫以下介面彈出ActionSheet:

    int ActionSheet(const list<tstring>& lstSheet, const tstring& strCaption = _T(""), const tstring& strCancel = _T(""));
  • 下面是彈出ActionSheet的示例程式碼:

    void CMainDialog::OnBtnClickedActionSheet(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      tstring strTitle = _T("誰最屌?");
      tstring strButtonCancel = _T("取消");
    
      list<tstring> lstSheet;
      lstSheet.push_back(_T("孫悟空"));
      lstSheet.push_back(_T("豬八戒"));
      lstSheet.push_back(_T("唐僧"));
      lstSheet.push_back(_T("沙和尚"));
      LONG nIndex = GetOwner()->ActionSheet(lstSheet, strTitle, strButtonCancel);
    }

10.2.8 顏色選擇對話方塊


顏色選擇對話方塊
  • 下面是彈出顏色選擇對話方塊的示例程式碼:
    void CMainDialog::OnBtnClickedColorDialog(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      CSkinColorDialog dlg(Color::Red, CC_FULLOPEN | CC_RGBINIT);
      if(dlg.DoModal(m_hWnd) == IDOK)
      {
          Color color = dlg.GetColor();
      }
    }

10.2.9 檔案選擇對話方塊


檔案選擇對話方塊
  • 下面是彈出檔案選擇對話方塊的示例程式碼:
    void CMainDialog::OnBtnClickedColorDialog(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      CSkinFileDialog dlg(SkinUI::GetString(_T("IDS_SEL_FILE")), s_lpstrAllFileFilter, 5, TRUE);
      if(dlg.DoModal(m_hWnd) == IDOK)
      {
          const list<tstring>& lstFile = dlg.GetFile();
      }
    }

10.2.10 資料夾選擇對話方塊


資料夾選擇對話方塊
  • 下面是彈出資料夾選擇對話方塊的示例程式碼:
    void CMainDialog::OnBtnClickedColorDialog(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      CSkinFolderDialog dlg(SkinUI::GetString(_T("IDS_SEL_FOLDER")), TRUE);
      if(dlg.DoModal(m_hWnd) == IDOK)
      {
          tstring strFolder = dlg.GetFolder();
      }
    }

10.2.11 另存為對話方塊


另存為對話方塊
  • 下面是彈出另存為對話方塊的示例程式碼:
    void CMainDialog::OnBtnClickedColorDialog(UINT uNotifyCode, int nID, CSkinView* pView)
    {
      CSkinSaveAsDialog dlg(_T("123.png"), s_lpstrAllFileFilter);
      if(dlg.DoModal(m_hWnd) == IDOK)
      {
          tstring strFolder = dlg.GetFile();
      }
    }

相關推薦

SkinUI入門教程 SkinUI定義控制元件常用元件

10.1 自定義控制元件 View元件只是一個矩形的空白區域,沒有任何內容。對於SkinUI的其他UI元件來說,它們都繼承了View元件,然後在View元件提供的空白區域上繪製外觀。 基於SkinUI UI元件的實現原理,當SkinUI系統提供的UI元件不足以滿足專案需求時,開發者完全可以通過繼承View元

Android學習—— Android定義控制元件

Android自定義控制元件 安卓在使用中大多數使用已有的一些控制元件,用法比較簡單,還有一部分是比較複雜的、使用者自己想的控制元件,這些就需要進行自定義控制元件,今天就來簡單說一下自定義控制元件。 1、繪製過程 建立一個類,繼承View類 onMeasure()方法,測量計算檢視的大小

MapReduce定義檔案讀取輸出元件

作用 自定義檔案讀取 讀取檔案時,預設是使用讀取器 LineRecoredReader<行首偏移量,每行內容>,每讀取一次,把key和value傳給 開發者開發的Mapper元件。現在自定義檔案讀取器,可以自定義讀取檔案的方法,這樣就可以調整傳遞給Mapper元件的

SkinUI入門教程 第六組UI元件:列表、樹、網格瀏覽器

9.1 列表Item 列表Item由CSkinListItem類代表,繼承於CSkinRelativeLayout,支援CSkinRelativeLayout的所有屬性和方法。插入列表的節點必須是CSkinListItem或其子類。 下面是CSkinListItem類特有的XML屬性和相關方法: 9.1.1

SkinUI入門教程 第四組UI元件:進度條、分割條、滾動條滑塊

7.1 進度條 進度條由CSkinProgress類來代表,繼承於CSkinView,支援CSkinView的所有屬性和方法。 通過給進度條設定不同的圖片資源,可以得到各種形態的進度條。 進度條效果圖 佈局檔案如下: <SkinDialog DefaultWidth="400" DefaultHei

Spring Boot 初級入門教程 —— 打完整 jar 包、部署測試

不知不覺都第十篇了,用了這麼久,都是在本機執行,localhost 還是不爽,加上目前 jsp 頁面已配置,可以做幾個炫一些的頁面,掛伺服器上試試。那麼問題來了,如何打包、部署呢?接下來開始嘗試打包,Spirng Boot 預設配置是 jar 包,那首先來嘗試一下 jar 包的打包、部署和測試。

Git-入門教程-常見Git報錯解決

0.摘要 本文主要介紹新手適用Git時遇到的Git報錯資訊,並提供解決方案。 本文介紹的報錯資訊有: fatal: remote origin already exists.   1.fatal: remote origin already exists. 使用gi

SDL入門教程:2、直接通過Unicode讓SDL顯示中文

作者:龍飛2.1:SDL本身可以顯示中文嗎?        SDL的擴充套件庫SDL_ttf本身具備顯示中文的功能嗎?網上很多觀點,說不能顯示的,甚至做了分析解釋了原因。但是,事實是,SDL本身就可以顯示中文。如果我們看看SDL_ttf.c的原始碼,我們可以看到,最終用於構建

cocos creator主程入門教程—— A*尋路

.com 行為樹 中間節點 取出 span 深度優先 如果 inf lose 摘要: 五邑隱俠,本名關健昌,10年遊戲生涯,現隱居五邑。本系列文章以TypeScript為介紹語言。 這一篇介紹A*尋路算法。在RPG、SLG、模擬經營類遊戲,有需要給角色尋路的需求,一

Android項目實戰定義倒計時的TextView

初始 als time class nts 時間 自定義 計時 err 原文:Android項目實戰(十):自定義倒計時的TextView項目總結 --------------------------------------------------------------

HTML5快速入門例項Canvas定義畫筆樣式

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <t

編寫Qt Designer定義控制元件——編寫定義控制元件介面

        既然是控制元件,就應該有介面,預設生成的控制元件類只是一個繼承了QWidget的類,如下: #ifndef LOGLATEDIT_H #define LOGLATEDIT_H #include <QWidget> class LogLat

Android定義控制元件-給定義控制元件新增事件

在這篇部落格中主要講解給Android自定義控制元件新增點選事件,實現可以按住百分比圓圈在螢幕上進行拖動圓圈的功能。分兩部分講,第一部分是獲取自定義控制元件的座標,第二部分是重新繪製控制元件。 第一部分:獲取自定義控制元件座標 首先看一張圖,這是自定義控制元件中獲

Spring Boot 初級入門教程 —— 整合 MyBatis 另外一種開發方式

在前面兩篇文章《Spring Boot 初級入門教程(十五) —— 整合 MyBatis》和《Spring Boot 初級入門教程(十七) —— 通過 Oracle 資料庫測試已整合 MyBatis(附原始碼)》中,介紹瞭如何在 SpringBoot 中整合 MyBatis 以及通過 MySQL

Spring Boot 初級入門教程 —— 通過 Oracle 資料庫測試已整合 MyBatis附原始碼

在文章《Spring Boot 初級入門教程(十五) —— 整合 MyBatis》中,已經對 MyBatis 進行了整合,只是當時是連 MySQL 資料庫進行的測試。這一篇簡單通過 Oracle 資料庫進行測試,確保整合的 MyBatis 在連線 Oracle 資料庫時也是有效的。 一、新增

Spring Boot 初級入門教程 —— 配置 Oracle 資料庫使用 MyBatis 測試

日常專案開發除了 MySQL 資料庫之外,用的最多的還有 Oracle 資料庫,所以這邊來說說如何在專案中配置 Oracle 資料庫,並測試是否配置成功。 一、引入依賴的 jar 包 檢視 pom.xml 檔案中是否引入了 ojdbc 的 jar 包,如果沒有引用,則需要引用才

Spring Boot 初級入門教程 —— 整合 MyBatis

基於上篇文章,這篇主要說下如何整合 MyBatis,這樣測試時也不用在像 JdbcTemplate 那樣在 java 程式碼中寫 sql 語句了。 一、新增 MyBatis 依賴包 在 pom 檔案中,新增支援 MyBatis 的依賴包,如下: <!-- myba

Spring Boot 初級入門教程 —— 配置 MySQL 資料庫使用 JdbcTemplate 測試

經過前面幾篇文章,包已經可以打了,不管是 jar 包還是 war 包都已測試通過,jsp 頁面也可以訪問了,但頁面上的資料都是在配置檔案中寫死的,不爽 ~ 到目前為止,最重要的配置還沒做,那就是連資料庫,這篇就主要說一下如何配置 MySQL 資料庫。 一、引入依賴的 jar 包 檢視

Spring Boot 初級入門教程 —— 執行、測試、打包過程中碰到的各種錯誤

錯誤一:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test-springboot: Compilation fail

Spring Boot 初級入門教程 —— 打分離 jar 包、部署測試附原始碼

分離 jar 包,也就是把工程原始碼打包到 *.jar,而把工程依賴的所有 lib 單獨生成,這樣打包的好處是,在依賴包沒有修改的情況下,部署時只需要上傳一次依賴包,每次部署的專案 jar 包很小,在伺服器網路不太好的情況下,這樣做是非常有必要的,因為上傳 20M 和 上傳 20K 的時間還是有