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 FileName@R_468_4045@ion
{
std::wstring FullName; //文件全名
std::wstring Prefix; //去掉后缀名的文件名
std::wstring Suffix; //文件后缀名,例如:.mp3
};
//按照名称进行排序的函数
struct NameForSort : std::binary_function< FileName@R_468_4045@ion,FileName@R_468_4045@ion,bool >
{
bool operator () (const FileName@R_468_4045@ion &a1,const FileName@R_468_4045@ion &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<FileName@R_468_4045@ion> s_vecMusic;
std::wstring wsFileFullName;
std::wstring wsFilePrefix;
std::wstring wsFileSuffix;
FileName@R_468_4045@ion 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:
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控件将文件全名显示出来。
要求:用SE工程实现按序显示播放列表的功能。涉及到的控件类型是ListBox。
说明:用VS2005开发此应用程序。SDK为自己的SDK(Handinfo SDK)。应用程序类型为Win32 smartphone device。
思路:从一个文件夹中读出所有音频文件,然后按照某种顺序排序。排序好了之后,将每个音频文件名称传给Sliverlight的ListBox控件的每一个item。既而实现功能。
代码:
test_main.h文件如下:
#include <vector>
#include <algorithm>
#include <functional>
//文件信息结构体
struct FileName@R_468_4045@ion
{
std::wstring FullName; //文件全名
std::wstring Prefix; //去掉后缀名的文件名
std::wstring Suffix; //文件后缀名,例如:.mp3
};
//按照名称进行排序的函数
struct NameForSort : std::binary_function< FileName@R_468_4045@ion,FileName@R_468_4045@ion,bool >
{
bool operator () (const FileName@R_468_4045@ion &a1,const FileName@R_468_4045@ion &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<FileName@R_468_4045@ion> s_vecMusic;
std::wstring wsFileFullName;
std::wstring wsFilePrefix;
std::wstring wsFileSuffix;
FileName@R_468_4045@ion 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:
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控件将文件全名显示出来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。