其他控件示例(05_Miscellaneous)

其他控件示例

此示例展示以下控件的使用方法:

自定义列表控件UiList样式的流程

按钮扩展控件UiButtonEx使用流程

弹出菜单CPopupMenu使用流程

示例代码展示:

05_Miscellaneous.jpg
05_Miscellaneous_1.jpg

UiList 派生的自定义列表类:

  class MyList:
  public UiList
  {
    public:
    protected:
    private:
  };

重载DrawItem,自定义每一项的绘制:

  void DrawItem(HDC hdcDst, int nIndex, RECT* prcItem, RECT *prcWin, RECT *prcUpdate)
  {
    // 绘制选中项的高亮背景
    if (nIndex == GetSelectedIndex())
    {
      MzDrawSelectedBg(hdcDst, prcItem);
    }

    // 加载小图标
    ImagingHelper *pimg = m_container.LoadImage(MzGetInstanceHandle(), IDR_PNG_SMS, true);
    RECT rcImg = *prcItem;
    rcImg.right = rcImg.left + MZM_MARGIN_MAX*2;
    if (pimg)
    {
      // 在左边画一个小图标
      pimg->Draw(hdcDst, &rcImg, false, false);
    }

    // 绘制文本
    RECT rcText = *prcItem;
    rcText.left = rcImg.right;
    ListItem* pItem = GetItem(nIndex);
    if (pItem)
    {
      MzDrawText(hdcDst, pItem->Text.C_Str(), &rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
    }
  }

完整示例:

/************************************************************************/
/*
 * Copyright (C) Meizu Technology Corporation Zhuhai China
 * All rights reserved.
 * 中国珠海, 魅族科技有限公司, 版权所有.
 *
 * This file is a part of the Meizu Foundation Classes library.
 * Author:    Michael
 * Create on: 2008-12-22
 */
/************************************************************************/

//请按照以步骤运行此实例代码:
//首先, 打开VS2005/2008创建一个Win 32智能设备项目
//在项目向导中选择M8SDK, 并勾选空项目
//然后,在项目中新建一个cpp文件,将此处代码拷贝到cpp文件中
//最后,按照M8SDK的帮助文档,配置项目属性
//现在,可以运行此程序了

//包含MZFC库的头文件
#include <mzfc_inc.h>

//此代码演示了:
//  创建和初始化应用程序
//  创建和初始化窗体
//  控件的显示、隐藏,
//  文字按钮工具条、弹出菜单、消息框的使用
//  列表控件的使用(从 UiList 派生),并处理它的鼠标通知消息MZ_WM_MOUSE_NOTIFY
//  扩展按钮 UiButtonEx 的使用
//  图像的加载与绘制(使用ImagingHelper)
//  窗口切换动画的使用
//  UiList派生类的使用
//  UiScrollWin滚动容器控件的使用

#define MZ_IDC_LIST      101
#define MZ_IDC_TOOLBAR1    102
#define IDC_PPM_OK      103
#define IDC_PPM_CANCEL    104
#define MZ_IDC_SCROLLWIN  105

#include "resource.h"

// 从 UiList 派生的自定义列表类
class MyList:
  public UiList
{
public:

  // 重载DrawItem,自定义每一项的绘制
  void DrawItem(HDC hdcDst, int nIndex, RECT* prcItem, RECT *prcWin, RECT *prcUpdate)
  {
    // 绘制选中项的高亮背景
    if (nIndex == GetSelectedIndex())
    {
      MzDrawSelectedBg(hdcDst, prcItem);
    }

    // 加载小图标
    ImagingHelper *pimg = m_container.LoadImage(MzGetInstanceHandle(), IDR_PNG_SMS, true);
    RECT rcImg = *prcItem;
    rcImg.right = rcImg.left + MZM_MARGIN_MAX*2;
    if (pimg)
    {
      // 在左边画一个小图标
      pimg->Draw(hdcDst, &rcImg, false, false);
    }

    // 绘制文本
    RECT rcText = *prcItem;
    rcText.left = rcImg.right;
    ListItem* pItem = GetItem(nIndex);
    if (pItem)
    {
      MzDrawText(hdcDst, pItem->Text.C_Str(), &rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
    }
  }
protected:
private:
    ImageContainer m_container;
};

// 从 CMzWndEx 派生的弹出窗口
class MyWnd:
  public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(MyWnd);
public:
protected:
  UiScrollWin m_ScrollWin;
  UiToolbar_Text m_Toolbar;
  UiCaption m_Caption1;
  UiCaption m_Caption2;

  UiButtonEx m_BtnSetting1;
  UiButtonEx m_BtnSetting2;
  UiButtonEx m_BtnSetting3;
  
  UiButtonEx m_BtnSetting4;
  UiButtonEx m_BtnSetting5;
  UiButtonEx m_BtnSetting6;
  UiButtonEx m_BtnSetting7;
  UiButtonEx m_BtnSetting8;
  UiButtonEx m_BtnSetting9;
  UiButtonEx m_BtnSetting10;

  ImageContainer m_ImageContainer;
  
  // 窗口的初始化
  virtual BOOL OnInitDialog()
  {
    // 必须先调用基类的初始化
    if (!CMzWndEx::OnInitDialog())
    {
      return FALSE;
    }

              // 初始化窗口中的控件

              m_ScrollWin.SetPos(0,0,GetWidth(),GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR);
    m_ScrollWin.SetID(MZ_IDC_SCROLLWIN);
    m_ScrollWin.EnableScrollBarV(true);
    AddUiWin(&m_ScrollWin);

    int y = 0;
    m_Caption1.SetPos(0,y,GetWidth(),MZM_HEIGHT_CAPTION);
    m_Caption1.SetText(L"Basic settings");
    m_ScrollWin.AddChild(&m_Caption1);

    y+=MZM_HEIGHT_CAPTION;
    m_BtnSetting1.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting1.SetText(L"Property 1");
    m_BtnSetting1.SetText2(L"Property value 1");
    m_BtnSetting1.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting1);

    // 扩展按钮 m_BtnSetting1 右边的小图标
    ImagingHelper *imgArrow = m_ImageContainer.LoadImage(GetMzResModuleHandle(), MZRES_IDR_PNG_ARROW_RIGHT, true);
    m_BtnSetting1.SetImage2(imgArrow);
    m_BtnSetting1.SetImageWidth2(imgArrow->GetImageWidth());
    m_BtnSetting1.SetShowImage2(true);

    // 扩展按钮 m_BtnSetting1 左边的小图标
    ImagingHelper *imgVCARD = m_ImageContainer.LoadImage(MzGetInstanceHandle(),IDR_PNG_VCARD, true);
    m_BtnSetting1.SetImage1(imgVCARD);
    m_BtnSetting1.SetImageWidth1(imgVCARD->GetImageWidth());
    m_BtnSetting1.SetShowImage1(true);


    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting2.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting2.SetText(L"Property 2");
    m_BtnSetting2.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting2);

    // 扩展按钮 m_BtnSetting2 左边的小图标
    ImagingHelper *imgSMS2 = m_ImageContainer.LoadImage(MzGetInstanceHandle(),IDR_PNG_SMS2, true);
    m_BtnSetting2.SetImage1(imgSMS2);
    m_BtnSetting2.SetImageWidth1(imgSMS2->GetImageWidth());
    m_BtnSetting2.SetShowImage1(true);


    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting3.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting3.SetText(L"Property 3");
    m_BtnSetting3.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting3);

    y+=MZM_HEIGHT_BUTTONEX;
    m_Caption2.SetPos(0,y,GetWidth(),MZM_HEIGHT_CAPTION);
    m_Caption2.SetText(L"Advanced settings");
    m_ScrollWin.AddChild(&m_Caption2);

    y+=MZM_HEIGHT_CAPTION;
    m_BtnSetting4.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting4.SetText(L"Property 4");
    m_BtnSetting4.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting4);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting5.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting5.SetText(L"Property 5");
    m_BtnSetting5.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting5);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting6.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting6.SetText(L"Property 6");
    m_BtnSetting6.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting6);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting7.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting7.SetText(L"Property 7");
    m_BtnSetting7.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting7);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting8.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting8.SetText(L"Property 8");
    m_BtnSetting8.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting8);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting9.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting9.SetText(L"Property 9");
    m_BtnSetting9.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting9);

    y+=MZM_HEIGHT_BUTTONEX;
    m_BtnSetting10.SetPos(0,y,GetWidth(),MZM_HEIGHT_BUTTONEX);
    m_BtnSetting10.SetText(L"Property 10");
    m_BtnSetting10.SetButtonType(MZC_BUTTON_LINE_BOTTOM);
    m_ScrollWin.AddChild(&m_BtnSetting10);

    m_Toolbar.SetPos(0,GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR,GetWidth(),MZM_HEIGHT_TEXT_TOOLBAR);
    m_Toolbar.SetButton(0, true, true, L"Cancel");
    m_Toolbar.EnableLeftArrow(true);
    m_Toolbar.SetButton(2, true, true, L"Save");
    m_Toolbar.SetID(MZ_IDC_TOOLBAR1);
    AddUiWin(&m_Toolbar);

    return TRUE;
  }

  // 重载 MZFC 的命令消息处理函数
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    UINT_PTR id = LOWORD(wParam);
    switch(id)
    {
    case MZ_IDC_TOOLBAR1:
      {
        int nIndex = lParam;
        if (nIndex==0)
        {
          // 退出模态对话框
          EndModal(ID_CANCEL);
          return ;
        }

        if (nIndex==2)
        {
          //保存设置...
          
          // 退出模态对话框
          EndModal(ID_OK);
          return;
        }
      }
    }
  }
private:
};
MZ_IMPLEMENT_DYNAMIC(MyWnd)

// 从 CMzWndEx 派生的主窗口类
class CSample1MainWnd: public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(CSample1MainWnd);
public:
  UiToolbar_Text m_Toolbar;
  
  // 列表控件
  MyList m_List;

protected:
  // 窗口的初始化
  virtual BOOL OnInitDialog()
  {
    // 必须先调用基类的初始化
    if (!CMzWndEx::OnInitDialog())
    {
      return FALSE;
    }

              // 初始化窗口中的控件

    m_List.SetPos(0,0,GetWidth(),GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR);
    m_List.SetID(MZ_IDC_LIST);
    m_List.EnableScrollBarV(true);
    m_List.EnableNotifyMessage(true);
    m_List.SetItemHeight(90);
    m_List.SetTextColor(RGB(255,0,0));
    AddUiWin(&m_List);

    // 往列表控件添加项
    CMzString str(128);
    wchar_t *buf = L"List item %d";
    ListItem li;
    for (int i=0;i<50;i++)
    {
      wsprintf(str.C_Str(), buf, i);
      li.Text = str;
      m_List.AddItem(li);
    }

    m_Toolbar.SetPos(0,GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR,GetWidth(),MZM_HEIGHT_TEXT_TOOLBAR);
    m_Toolbar.SetButton(0, true, true, L"Exit");
    m_Toolbar.SetButton(1, true, true, L"Delete");
    m_Toolbar.SetButton(2, true, true, L"Setting");
    m_Toolbar.SetID(MZ_IDC_TOOLBAR1);
    AddUiWin(&m_Toolbar);


    return TRUE;
  }

  // 重载 MZFC 的消息处理函数
  LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
    switch(message)
    {
    case MZ_WM_MOUSE_NOTIFY:
      {
        int nID = LOWORD(wParam);
        int nNotify = HIWORD(wParam);
        int x = LOWORD(lParam);
        int y = HIWORD(lParam);

        // 处理列表控件的鼠标按下通知
        if (nID==MZ_IDC_LIST && nNotify==MZ_MN_LBUTTONDOWN)
        {
          if (!m_List.IsMouseDownAtScrolling() && !m_List.IsMouseMoved())
          {
            int nIndex = m_List.CalcIndexOfPos(x, y);
            m_List.SetSelectedIndex(nIndex);
            m_List.Invalidate();
            m_List.Update();
          }
          return 0;
        }

        // 处理列表控件的鼠标移动通知
        if (nID==MZ_IDC_LIST && nNotify==MZ_MN_MOUSEMOVE)
        {
                              if(m_List.GetSelectedIndex()!=-1)
                              {
            m_List.SetSelectedIndex(-1);
            m_List.Invalidate();
            m_List.Update();
                              }
          return 0;
        }
        //if (nID==MZ_IDC_LIST && nNotify==MZ_MN_LBUTTONDOWN)
        //{
        //  if (!m_List.IsMouseDownAtScrolling() && !m_List.IsMouseMoved())
        //  {
        //    m_List.SetSelectedIndex(-1);
        //    m_List.Invalidate();
        //    m_List.Update();
        //  }
        //  return 0;
        //}
      }
      return 0;
    }
    return CMzWndEx::MzDefWndProc(message,wParam,lParam);
  }

  // 重载 MZFC 的命令消息处理函数
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    UINT_PTR id = LOWORD(wParam);
    switch(id)
    {
    case MZ_IDC_TOOLBAR1:
      {
        int nIndex = lParam;
        if (nIndex==0)
        {
          //CMzString str(128);
          //wsprintf(str.C_Str(), L"You pressed the %s button!", m_Toolbar.GetButtonText(0).C_Str());
          //MzMessageBoxEx(m_hWnd, str.C_Str(), L"Test", MB_OK);
          PostQuitMessage(0);
          return;
        }
        if (nIndex==1)
        {
          // 弹出菜单
          CPopupMenu ppm;
          struct PopupMenuItemProp pmip;      

          pmip.itemCr = MZC_BUTTON_PELLUCID;
          pmip.itemRetID = IDC_PPM_CANCEL;
          pmip.str = L"Cancel";
          ppm.AddItem(pmip);

          pmip.itemCr = MZC_BUTTON_ORANGE;
          pmip.itemRetID = IDC_PPM_OK;
          pmip.str = L"OK";
          ppm.AddItem(pmip);  

          RECT rc = MzGetWorkArea();      
          rc.top = rc.bottom - ppm.GetHeight();
          ppm.Create(rc.left,rc.top,RECT_WIDTH(rc),RECT_HEIGHT(rc),m_hWnd,0,WS_POPUP);      
          int nID = ppm.DoModal();
          if (nID==IDC_PPM_OK)
          {
            // do what you want...
            int nSel = m_List.GetSelectedIndex();
            m_List.RemoveItem(nSel);
            m_List.SetSelectedIndex(-1);
            m_List.Invalidate();
            m_List.Update();
          }
          if (nID==IDC_PPM_CANCEL)
          {
            // do what you want...
          }
          return;
        }
        if (nIndex==2)
        {
          MyWnd dlg;
          RECT rcWork = MzGetWorkArea();
          dlg.Create(rcWork.left,rcWork.top,RECT_WIDTH(rcWork),RECT_HEIGHT(rcWork),
            m_hWnd, 0, WS_POPUP);
          // 设置窗口切换动画(弹出时的动画)
          dlg.SetAnimateType_Show(MZ_ANIMTYPE_SCROLL_BOTTOM_TO_TOP_2);
          // 设置窗口切换动画(结束时的动画)
          dlg.SetAnimateType_Hide(MZ_ANIMTYPE_SCROLL_TOP_TO_BOTTOM_1);
          int nRet = dlg.DoModal();
          if (nRet==ID_OK)
          {
            //...
          }
          return;
        }
      }
      break;
    }
  }
};

MZ_IMPLEMENT_DYNAMIC(CSample1MainWnd)

// 从 CMzApp 派生的应用程序类
class CSample1App: public CMzApp
{
public:
  // 应用程序的主窗口
  CSample1MainWnd m_MainWnd;

  // 应用程序的初始化
  virtual BOOL Init()
  {
              // 初始化 COM 组件
    CoInitializeEx(0, COINIT_MULTITHREADED);

              // 创建主窗口
    RECT rcWork = MzGetWorkArea();
    m_MainWnd.Create(rcWork.left,rcWork.top,RECT_WIDTH(rcWork),RECT_HEIGHT(rcWork), 0, 0, 0);
    m_MainWnd.SetBgColor(MzGetThemeColor(TCI_WINDOW_BG));
    m_MainWnd.Show();

              // 成功则返回TRUE
    return TRUE;
  }
};

// 全局的应用程序对象
CSample1App theApp;


Generated at Tue Feb 9 15:09:53 2010 for Meizu M8 SDK Documentation by  doxygen 1.6.1