17.9.1 相册管理模块的设计与实现(2)
相册数为1,当前活动相册的序号为0。默认对话框的名称为"主人相册",背景音乐路径为当前路径下"音乐\bk001.wav"。相册中的相片是当前路径下photo文件夹中的a.jpg~p.jpg。
(4)在对话框初始化函数中将载入默认相册中所有的相片,并初始化组合框。
- 01 BOOL CMyAlbumDlg::OnInitDialog()
- 02 {
- 03 CDialog::OnInitDialog();
- 04 m_bmBack.DeleteObject();
- 05 m_brBack.DeleteObject();
- 06 m_bmBack.LoadBitmap(IDB_BK001); //载入对户框背景图像
- 07 m_brBack.CreatePatternBrush(&m_bmBack); //初始化对画框画刷
- 08 wchar_t *wImage;
- 09 int len;
- 10 for(int i = 0; i < m_album[m_curAlbum].num_photo; i++)
- 11 { //载入当前相册中所有的相片
- 12 len = MultiByteToWideChar(CP_ACP, 0,
- 13 (LPCTSTR)m_album[m_curAlbum].str_
- photo[i],
- 14 -1, NULL, 0);
- 15 wImage = new wchar_t[len];
- 16 MultiByteToWideChar(CP_ACP, 0,
- 17 (LPCTSTR)m_album[m_curAlbum].str_ photo[i],
- 18 -1, wImage, len);
- 19 m_image[i] = Image::FromFile(wImage);
- 20 delete []wImage;
- 21 }
- 22 //初始化组合框
- 23 for(i = 0; i < m_numAlbum; i++)
- 24 {
- 25 m_comb.InsertString(i,m_album[i].name);
- 26 }
- 27 m_comb.SetCurSel(0); //选中组合框中0号项目
- 28 return TRUE;
- 29 }
【代码解析】
第4~7行载入对话框的背景图像。第8~21行载入当前活动相册中所有的相片。第23~26行初始化组合框,将当前相册名称插入组合框中。在这里用到了MultiByteToWideChar()函数,该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组,函数原型如下:
- int MultiByteToWideChar(
- UINT CodePage,
- DWORD dwFlags,
- LPCSTR lpMultiByteStr,
- int cchMultiByte,
- LPWSTR lpWideCharStr,
- int cchWideChar);
该函数有6个参数说明如下。
CodePage:指定执行转换的代码页,这个参数可以为系统已安装或有效的任何代码页所给定的值。也可以指定其为表17.1中的任意一值。
表17.1 CodePage值
|
值< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说 明 |
值 |
说 明 |
|
CP_ACP |
ANSI代码页 |
CP_THREAD_ACP |
当前线程ANSI代码页 |
|
CP_MACCP |
Macintosh代码页 |
CP_UTF7 |
使用UTF-7转换 |
|
CP_OEMCP |
OEM代码页 |
CP_UTF8 |
使用UTF-8转换 |
|
CP_SYMBOL |
符号代码页(42) |
|
|
dwFlags:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。可以指定的标记常量组合含义如表17.2所示。
表17.2 dwFlags值
|
值 |
说 明 |
|
MB_PRECOMPOSED |
通常使用预作字符,即由一个基本字符
和一个非空字符组成的字符只有一个
单一的字符值。这是默认的转换选择。
不能与MB_COMPOSITE值一起使用 |
|
MB_COMPOSITE |
通常使用组合字符,即由一个基本字符
和一个非空字符组成的字符分别
有不同的字符值。不能与
MB_PRECOMPOSED值一起使用 |
|
MB_ERR_INVALID_ CHARS |
如果函数遇到无效的输入字符,它将
运行失败,且
GetLastErro返回ERROR_NO_
UNICODE_TRANSLATION值 |
|
MB_USEGLYPHCHARS |
使用象形文字替代控制字符 |
lpMultiByteStr:指向将被转换字符串的字符。
cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果这个值为-1,字符串将被设定为以NULL为结束符的字符串,并且自动计算长度。
lpWideCharStr:指向接收被转换字符串的缓冲区。
cchWideChar:指定由参数lpWideCharStr指向的缓冲区的字节个数。若此值为0,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。
说明:将MultiByteToWideChar()的第4个形参设为-1,即可返回所需的短字符数组空间的个数。