字母表导航条示例(08_AlphabetBar)

字母表导航条

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

字母表导航条 UiAlphabetBar使用流程

08_AlphabetBar.png
08_AlphabetBar2.png

使用字母导航条快速定位列表内容:

  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    if (LOWORD(wParam) == MZ_IDC_ALPBAR && m_AlpBar.GetCurLetter())
    {
      for (int i=0;i<m_List.GetItemCount();i++)
      {
      MyListItemData* itemData = (MyListItemData*)m_List.GetItem(i)->Data;
      wchar_t* fLetter = itemData->m_cfirstLetter;
      //将找到的列表项显示在屏幕顶端。
        if (wcscmp(m_AlpBar.GetCurLetter(),itemData->m_cfirstLetter) == 0)
        {
          int topPos = m_List.CalcItemTopPos(i);
          m_List.SetTopPos(m_List.GetTopPos()-topPos);
          m_List.Invalidate();
          m_List.Update();
          break;
        }
      }
    }
  }

完整示例:

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

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

//包含头文件
#include "mzfc_inc.h"

//此代码演示了:
//创建和初始化应用程序
//创建和初始化窗体
//如何使用字母表导航条
//通过使用字母导航条快速定位列表内容。

#define                     MZ_IDC_ALPBAR               201
#define                     MZ_IDC_LIST                               202
//自定义的列表项数据
typedef struct CMyListItemData
{
  wchar_t     m_szContent[50];            //列表项显示的内容
  wchar_t     m_cfirstLetter[2];          //列表项内容的首字母,用于快速定位列表内容。
}MyListItemData;

//从UiList中派生出的自定义列表
class CMyList:public UiList
{
public:
  //重写DrawItem方法。当列表更新时重画,调用此方法。
  virtual void DrawItem(HDC hdcDst, int nIndex, RECT* prcItem, RECT *prcWin, RECT *prcUpdate)
  {
    ListItem* pItem = GetItem(nIndex);
    if (pItem)
    {
      MzDrawText(hdcDst,((MyListItemData*)pItem->Data)->m_szContent,prcItem,DT_VCENTER|DT_LEFT);
    }
  }
  //重写OnRemoveItem,当删除某一项时基类调用此方法。-1表示删除所有列表项数据。
  virtual void OnRemoveItem(int nIndex)
  {
    ListItem* pItem;
    if (nIndex == -1)
    {
      for (int i = 0; i< GetItemCount(); i++)
      {
        pItem = GetItem(i);
        if (pItem->Data)
        {
          delete (MyListItemData*)pItem->Data;
        }
      }
    }
    else
    {
      pItem = GetItem(nIndex);
      if (pItem->Data)
      {
        delete (MyListItemData*)pItem->Data;
      }
    }
  }
};
class CSampleWnd_AlpBar:public CMzWndEx
{
public:
  UiAlphabetBar m_AlpBar;
  CMyList m_List;
protected:
  virtual BOOL OnInitDialog()
  {
    if (!CMzWndEx::OnInitDialog())
    {
                  return FALSE;
    }
    m_List.SetID(MZ_IDC_LIST);
    m_List.SetPos(0,0,480,GetHeight());
    m_List.SetFocus(false);
    AddUiWin(&m_List);

    m_AlpBar.SetPos(430,0,50,GetHeight());
    m_AlpBar.SetID(MZ_IDC_ALPBAR);
    m_AlpBar.EnableZoomAlphabet(true);
    m_AlpBar.EnableNotifyMessage(true);
    AddUiWin(&m_AlpBar);

    //向list中添加15条数据数据
    ListItem item[15];
    for (int i=0;i<15;i++)
    {
      MyListItemData* itemData = new MyListItemData();
      int asciiFLetter = (i/3)*5+'A';
      wsprintf(itemData->m_cfirstLetter,L"%c",asciiFLetter);
      wsprintf(itemData->m_szContent,L"%c%.4d",asciiFLetter,i);
      item[i].Data = itemData;
      m_List.AddItem(item[i]);

    }

    return TRUE;
  }

  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  {
    if (LOWORD(wParam) == MZ_IDC_ALPBAR && m_AlpBar.GetCurLetter())
    {
      for (int i=0;i<m_List.GetItemCount();i++)
      {
        MyListItemData* itemData = (MyListItemData*)m_List.GetItem(i)->Data;
        wchar_t* fLetter = itemData->m_cfirstLetter;
        //将找到的列表项显示在屏幕顶端。
        if (wcscmp(m_AlpBar.GetCurLetter(),itemData->m_cfirstLetter) == 0)
        {
          int topPos = m_List.CalcItemTopPos(i);
          m_List.SetTopPos(m_List.GetTopPos()-topPos);
          m_List.Invalidate();
          m_List.Update();
          break;
        }
      }
    }

  }
};

class CSampleApp: public CMzApp
{

public:
  //主窗体
  CSampleWnd_AlpBar m_MainWnd;
  //初始化应用程序
  virtual BOOL Init()
  {
    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();

    return TRUE;
  }
};

// 全局应用程序变量
CSampleApp theApp;

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