cocos2d-x 解决win32下 从文件对话框选择文件,显示在游戏中乱码
本文章分为三个部分: 一. 从文件对话框的调用 **//初始化配置**
OPENFILENAME opfn;
WCHAR strfilename[MAX_PATH * 100]; // strfilename用来存储API返回的用户选择的文件的文件名。如果是多选,也全部存在这个字符串中,文件中用 隔开,最后再多一个 ;其中第一个是文件夹的路径,接下去是文件名,例如:"文件夹 文件A 文件B "
ZeroMemory(&opfn,sizeof(OPENFILENAME)); // 初始化,不用改,其实调用了memset( ..,..)
opfn.lStructSize = sizeof(OPENFILENAME); // 初始化,不用改
opfn.lpstrFilter = L"jpg *.jpg "; // 格式为"显示允许的格式名 允许的格式 ",比如"全部 *.* ",也可以有多个过滤器,连接起来即可
opfn.nFilterIndex = 1; // 默认选择哪一个过滤器,一般都是第一个,不用改
opfn.lpstrFile = strfilename; // 不用改
opfn.lpstrFile[0] = ' '; // 不用改
opfn.nMaxFile = sizeof(strfilename); // 不用改
opfn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; // 多选的话一定要有OFN_ALLOWMULTISELECT,否则单选
**//调用GetOpenFileName,打开文件选择对话框**
if (!GetOpenFileName(&opfn)) { return -1;}
// 前面说了多选的存储方式,这里提供一种取出每个文件名的实现
WCHAR *filename = strfilename;
WCHAR allFileNames[MAX_PATH * 100];
allFileNames[0] = ' ';
do {
wcscat(allFileNames,filename); // wcscat是strcat的宽字符版。大家可以直接把*filename拿去用,例如放在一个vector里。我这里是连起来放在一个字符串里,方便显示
wcscat(allFileNames,",");
filename = filename + (wcslen(filename) + 1); // wcslen是strlen的宽字符版
} while (*filename);
到这里,我们就获得了allFileNames这个宽字符串!里面存储了用户选择的所有文件名的连接,用”,”隔开 二. 把WCHAR的allFileNames转换为char的c_allFileNames char c_allFileNames[MAX_PATH * 100 * (sizeof(WCHAR)/sizeof(char))]; int ulBytes = WideCharToMultiByte(CP_ACP,allFileNames,-1,NULL,NULL); // 计算出allFileNames占用的多字节字符串长度为ulBytes ulBytes = WideCharToMultiByte(CP_ACP,c_allFileNames,ulBytes,NULL); // 将宽字符字符串转换为多字节字符串 三. 把win32使用的多字节gbk字符串(char*)转换为cocos2d-x使用的多字节utf8字符串(char*) http://www.tuicool.com/articles/juaeaiR 我这边就直接调用上文中封装的iconv_convert了: char outStr[1024];
iconv_convert(&c_allFileNames,strlen(c_allFileNames),"GBK",&outStr,sizeof(outStr),"UTF-8");
auto label = Label::createWithSystemFont(outStr,"宋体",12);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |