SilverLight技术的Listbox控件的使用

WINCE 6.0 R3:SilverLight技术的Listbox控件的使用
要求:用SE工程实现按序显示播放列表的功能。涉及到的控件类型是Listbox。


说明:用VS2005开发此应用程序。SDK为自己的SDK(Handinfo SDK)。应用程序类型为Win32 smartphone device。


思路:从一个文件夹中读出所有音频文件,然后按照某种顺序排序。排序好了之后,将每个音频文件名称传给Sliverlight的Listbox控件的每一个item。既而实现功能。


代码:
test_main.h文件如下:
#include <vector>
#include <algorithm>
#include <functional>


//文件信息结构体
struct FileNameInformation
{
std::wstring FullName; //文件全名
std::wstring Prefix; //去掉后缀名的文件名
std::wstring Suffix; //文件后缀名,例如:.mp3
};


//按照名称进行排序的函数
struct NameForSort : std::binary_function< FileNameInformation , FileNameInformation, bool >
{
bool operator () (const FileNameInformation &a1,const FileNameInformation &a2) const
{
  if ( a1.Prefix < a2.Prefix ) //& (a1.Suffix <= a2.Suffix) )
  { 
  return true;
  }
  else if ( (a1.Prefix == a2.Prefix) & (a1.Suffix < a2.Suffix) )
  {
  return true;
  }
  else return false;
}
};


//用于控件交互事件处理的类
class BtnEventHandler
{
public:
//ListBox使用示范
HRESULT ListBox_SelChange(IXRDependencyObject* source,XRSelectionChangedEventArgs* args)   
{     
  RETAILMSG(1, (TEXT("12/r/n")));
  //
  /*int index=0;
  ListBox->GetSelectedIndex(&index);

  IXRItemCollection* ppItemsList;
  ListBox->GetItems(&ppItemsList);
  IXRListBoxItemPtr  ListBoxItem;
  ppItemsList->GetItem(index,&ListBoxItem);
  XRValue*  XValueListBox;
  ListBoxItem->GetContent(XValueListBox);
  WCHAR wchar[MAX_PATH];
  memcpy(wchar,XValueListBox->pReadOnlyStringVal,sizeof(WCHAR)*MAX_PATH);
  std::wstring str = wchar;*/
  //std::wstring str = XValueListBox->pReadOnlyStringVal;
  //MessageBox(NULL,str,NULL,MB_OK);
  //
  MessageBox(NULL,TEXT("ListBox_SelChange!"),TEXT("Silverlight for Windows Embedded test"),MB_OK); 
  RETAILMSG(1,(TEXT("++++BtnEventHandler( )----ListBox_SelChange!/r/n")));
  return S_OK;   
}
//private:
//IXRListBoxPtr  ListBox;
};



test_main.cpp文件如下:
#include "test_main.h"
#pragma comment(lib, "xamlruntime.lib")

int WINAPI WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPTSTR    lpCmdLine,
      int      nCmdShow)
{
RETAILMSG(1, (TEXT("1/r/n")));

// 如果XamlRuntimeInitialize执行成功,SE的运行时会被你的应用程序加载并准备好处理UI。
if (!XamlRuntimeInitialize())
{
  return -1;
}

RETAILMSG(1, (TEXT("2/r/n")));
// 每个SE应用程序只有一个”Application”对象让我们用来访问全局应用程序的属性和特性。
// 为了访问它们,我们需要使用GetXRApplicationInstance API。
HRESULT retcode;
IXRApplicationPtr app;
if (FAILED(retcode=GetXRApplicationInstance(&app)))
{
  return -1;
}

RETAILMSG(1, (TEXT("3/r/n")));
// 现在我们已经初始化了Application对象,我们可以创建主窗口并让SE管理它的内容:
XRWindowCreateParams wp;
ZeroMemory(&wp, sizeof(XRWindowCreateParams));
wp.Style      = WS_OVERLAPPED | WS_SYSMENU;
wp.pTitle      = L"S4E Test";
wp.Left        = 0;
wp.Top        = 0;

XRXamlSource xamlsrc;
//xamlsrc.SetResource(hInstance,TEXT("XAML"),MAKEINTRESOURCE(IDR_XAML1));
xamlsrc.SetFile(L"
//MicroSD Card//Page_listbox.xaml");
//xamlsrc.SetFile(L"
//Page.xaml ");
//xamlsrc.SetFile(L"
//nand//Page.xaml ");
IXRVisualHostPtr vhost;
if (FAILED(retcode=app->CreateHostFromXaml(&xamlsrc, &wp, &vhost)))
{
  return -1;
}

RETAILMSG(1, (TEXT("4/r/n")));
// VisualHost对象"hosts"运行时并让我们可以访问它的内容,以及从资源中加载我们的XAML(使用XRXamlSource对象)。
// SE应用程序中的对象以对象树的方式组织起来。访问对象树中的对象,我们需要得到指向这棵树根部(root)的指针:
IXRFrameworkElementPtr root;
if (FAILED(retcode=vhost->GetRootElement(&root)))
{
  return -1;
}

RETAILMSG(1, (TEXT("5/r/n")));
//从Music文件夹下读出所有文件的名称
TCHAR tcSearchFile[ MAX_PATH ];
memcpy(tcSearchFile,_T("
//MicroSD Card//Music//*.*"),MAX_PATH);
std::wstring wsSearchFile = tcSearchFile;

RETAILMSG(1, (TEXT("6/r/n")));
HANDLE hFile;
WIN32_FIND_DATA fileinfo;

std::vector<FileNameInformation> s_vecMusic;
std::wstring wsFileFullName;
std::wstring wsFilePrefix;
std::wstring wsFileSuffix;
FileNameInformation stFileName;

if ((hFile= FindFirstFile(wsSearchFile.c_str(),&fileinfo)) != INVALID_HANDLE_VALUE)
{
  RETAILMSG(1, (TEXT("7/r/n")));

  do
  {
  wsFileFullName = fileinfo.cFileName;
  RETAILMSG(1, (TEXT("wsFileFullName=%s /r/n"),wsFileFullName.c_str()));
  int ipos=wsFileFullName.rfind('.');
  RETAILMSG(1, (TEXT("ipos=%d /r/n"),ipos));
  wsFilePrefix=wsFileFullName.substr(0,ipos);
  wsFileSuffix=wsFileFullName.substr(ipos);
  RETAILMSG(1, (TEXT("wsFilePrefix=%s /r/n"),wsFilePrefix.c_str()));
  RETAILMSG(1, (TEXT("wsFileSuffix=%s /r/n"),wsFileSuffix.c_str()));

  stFileName.FullName=wsFileFullName;
  stFileName.Prefix=wsFilePrefix;
  stFileName.Suffix=wsFileSuffix;

  s_vecMusic.push_back(stFileName);
  } while (FindNextFile(hFile,&fileinfo) != 0);

  RETAILMSG(1, (TEXT("8/r/n")));
  FindClose(hFile);
}

//将文件按照名称排序
sort(s_vecMusic.begin(),s_vecMusic.end(),NameForSort());

RETAILMSG(1, (TEXT("9/r/n")));
int vecLength;
vecLength = s_vecMusic.size();

RETAILMSG(1, (TEXT("10/r/n")));
//ListBox使用示范
//将读到的文件名称传给控件Listbox,作为每一项的内容,显示出来
IXRListBoxPtr  ListBox;
IXRListBoxItemPtr  *ListBoxItem = new IXRListBoxItemPtr[vecLength];
XRValue*  XValueListBox = new XRValue[vecLength];
//IXRListBoxItem *  ListBoxItem[vecLength]={NULL};
//XRValue          XValueListBox[vecLength]={NULL};

HRESULT hr;
if (FAILED(hr=root->FindName(TEXT("ListBox"), &ListBox)))       
  return -1;

for (int i=0;i<vecLength;i++)
{
  XValueListBox.vType=VTYPE_READONLY_STRING;
  XValueListBox.pReadOnlyStringVal=s_vecMusic.FullName.c_str();
  app->CreateObject(IID_IXRListBoxItem,&ListBoxItem);
  hr=ListBoxItem->SetContent(&XValueListBox);
}

int *pIndexList=NULL;
IXRItemCollection* ppItemsList;
ListBox->GetItems(&ppItemsList);
for (int i=0;i<vecLength;i++)
{
  ppItemsList->Add((IXRDependencyObject*)ListBoxItem,pIndexList);
}

//初始状态默认第一项被选中
ListBox->SetSelectedIndex(0);
//ListBox->SetSelectedItem(ListBoxItem);

// 当按钮被点击时我们的事件处理器(event handler)仅仅是简单的显示一个消息框。
// 正如你看到的事件处理器(event handler)有2个参数:一个指向产生事件(我们的按钮)的对象的指针和一个包含事件参数的结构体的指针。
// 为了连接事件处理器(event handler)和按钮,我们需要创建一个委托对象:
BtnEventHandler handlerListBox;
//handlerListBox.ListBox = ListBox;
IXRDelegate<XRSelectionChangedEventArgs>* clickdelegateListbox;

if (FAILED(hr=CreateDelegate(&handlerListBox,&BtnEventHandler:istBox_SelChange,&clickdelegateListbox)))       
  return -1;

//注册交互事件
//ListBox->AddSelectionChangedEventHandler(clickdelegateListbox);

RETAILMSG(1, (TEXT("11/r/n")));
//事件处理器已经连上我们的按钮了,现在只需要等待用户去点击我们漂亮的按钮并显示我们的UI:
UINT exitcode;
if (FAILED(retcode=vhost->StartDialog(&exitcode)))
{
  RETAILMSG(1, (TEXT("13/r/n")));
  return -1;
}

//指向委托对象的指针并不是一个智能指针(smart pointer),我们需要显式释放它:
clickdelegateListbox->Release();

RETAILMSG(1, (TEXT("14/r/n")));
return 0;
delete [] ListBoxItem ;
delete [] XValueListBox ;
}



总结:
功能如下:对所有读取到的文件按照名称排序,准确地讲是将文件全名去掉后缀名后按照名称排序,如果文件名称相同,则再将后缀名进行按名称排序。排序结束之后,就可以利用Sliverlight中的Listbox控件将文件全名显示出来。

你可能感兴趣的:(SilverLight技术的Listbox控件的使用)