1、unicode下的SetWindowTextW,导致char在MFC编辑框中输出非常麻烦。
需要做单字符char向双字符wchar_t转换。
可以转换,转换如下:
void CLR_ServerMFCDlg::OnBnClickedButtonBrowsePath()
{
// TODO: 在此添加控件通知处理程序代码
BROWSEINFO bi;
//浏览文件夹对话框的父窗体句柄。
bi.hwndOwner = this->GetSafeHwnd();
/*ITEMIDLIST结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。
该成员变量可以是NULL,在此时桌面目录将被使用。
*/
bi.pidlRoot = NULL;
//用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。
bi.pszDisplayName = 0;
//该浏览文件夹对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
bi.lpszTitle = _T("选择路径");
//该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合:
bi.ulFlags = 0;
//应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,该对话框将调用回调函数。该参数可用为NULL。
bi.lpfn = NULL;
//对话框传递给回调函数的一个参数指针。
bi.lParam = 0;
//与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。
bi.iImage = 0;
LPITEMIDLIST pIDList;
pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if (pIDList)
{
LPTSTR lpsBuffer = (LPTSTR)(this->m_ServerCore.save_file_dir_path);
SHGetPathFromIDList(pIDList, lpsBuffer);
//this->m_idc_edit_path_info.SetWindowTextW(_T("xxxxxxxxxx"));
this->m_idc_edit_path_info.SetWindowTextW((LPCTSTR)(this->m_ServerCore.save_file_dir_path));
//获取转换所需的目标缓存大小
int nRet = 0;
char *p_text = this->m_ServerCore.save_file_dir_path;
DWORD dBufSize = WideCharToMultiByte(CP_OEMCP, 0, lpsBuffer, -1, NULL, 0, NULL, FALSE);
nRet = WideCharToMultiByte(CP_OEMCP, 0, lpsBuffer, -1, p_text, dBufSize, NULL, FALSE);
if (nRet <= 0)
{
//printf("转换失败\n");
}
}
}
BOOL CLR_ServerMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO: 在此添加额外的初始化代码
char *p_text = this->m_ServerCore.save_file_dir_path;
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, p_text, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if (!pwText)
{
delete[]pwText;
}
MultiByteToWideChar(CP_ACP, 0, p_text, -1, pwText, dwNum);
this->m_idc_edit_path_info.SetWindowTextW(pwText);
delete[]pwText;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
2、反思
这样对于输出信息的打印,特别不方便!与C代码兼容时。