ListCtrl能否显示UNICODE

huaboy408 2004-03-29 02:45:33
我的程序改为UNICODE版本后,ListCtrl中的汉字显示为乱码,程序应该没有什么问题,现在我考虑是不是ListCtrl不支持UNICODE,需要做什么设置或用代码控制,希望大家鼎力帮助
...全文
79 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
primen 2004-05-12
  • 打赏
  • 举报
回复
MFC类都支持BSTR及LPSTR的,你一般不需要特别的进行字串转换。MS提倡用TCHAR。
zuoke 2004-05-12
  • 打赏
  • 举报
回复
TO: lygfqy(风清扬)
-----------------------------------------------
注:unicode是看不到字符内容的
———————————————————————

怎么看不到字符内容呢?可以在调试中看到啊
huaboy408 2004-04-09
  • 打赏
  • 举报
回复
怎么这么久都没人顶一下啊,这个问题搞的我难过死了。
我在ConvertPatientNameFromDicom(szText, szText);前后各测试了szText= _T("试验");的情况,发现在这个函数前加上这句话,调试时这个函数会出错,而加在这个函数后面,没有出错情况,且LISTCTRL中各项均为“试验”,看起来是ConvertPatientNameFromDicom(szText, szText);搞的鬼,我把这个函数贴上来,大家一起看看有什么问题,谢谢了
void ConvertPatientNameFromDicom( LPCTSTR in, LPTSTR out )
{
for( int i = 0; i < _tcslen(in); i++)
{
if(in[i] == _T('^'))
*out++ = _T(' ');
else
*out++ = in[i];
}
*out = _T('\0');
}
huaboy408 2004-04-08
  • 打赏
  • 举报
回复
TO: lygfqy(风清扬)

我用的是2000系统
因为查询到记录——添加到LISTCTRL控件中的这个过程都是通过Active X控件(*.dll)来实现的,而主程序和实现*.dll的程序不在一个WORKSPACE里面,我在*.dll程序里设置断点,根本不执行,这怎么办?
我觉得就是我说的那个字符串操作szText= OLE2T(bstrText);,这个就是加载前的字符串操作,不知道是不是正确?
lygfqy 2004-04-08
  • 打赏
  • 举报
回复
支持是肯定的
如果是2000以上版本系统,
系统内部都是unicode方式操作的
建议你跟一下代码
找到从载入字符串开始的地方看看是不是unicode形式
并到最后加载的时候
注:unicode是看不到字符内容的
huaboy408 2004-04-08
  • 打赏
  • 举报
回复
谢谢大家的帮助,我仔细看了代码,没有发现问题到底出在哪里,我把填充LISTCTRL控件的代码贴上,大家帮忙看一下,谢谢了。
void CEvent::SetOnlineItemToListView( long lIndex, IItem* pItem )
{
HRESULT hr = S_OK;
BOOL bRes = TRUE;

TCHAR szMsg[MAX_MSG_LEN+1];
LoadString(_Module.m_hInstResource, IDS_ERRORGETATTR, szMsg, MAX_MSG_LEN);

// Retrieve attributes and set it to the list view
try
{
for( int i = 0; i < MWL_LV_COLUMN_NUMCOLUMNS; i++ )
{
_variant_t var;
long lVal;
MWL_LV_COLUMNS_FLAGS nFlag = (MWL_LV_COLUMNS_FLAGS)(MWL_LV_COLUMN_PATIENTNAME+i);
m_pPMWLCtrl->GetColumnQueryParameterID(nFlag, &lVal);
if ( FAILED( (hr = pItem->raw_GetAttribute( (ID)lVal, &var )) ) )
{
lstrcat(szMsg, _T(" raw_GetAttribute"));
bRes = FALSE;
}
if( var.vt == VT_BSTR && var.bstrVal != NULL )
m_pPMWLCtrl->ListViewAddItem(var.bstrVal, lIndex, nFlag);

}

}
catch ( _com_error &e )
{
USES_CONVERSION;
#if _UNICODE
std::string errmsg( W2A(e.ErrorMessage()) );
#else
std::string errmsg( e.ErrorMessage() );
#endif
lstrcat(szMsg, (LPCTSTR)errmsg.c_str());
bRes = FALSE;
}
catch ( LPCTSTR perror )
{
lstrcat(szMsg, perror);
bRes = false;
}

if( !bRes )
{
LOG_ERROR(szMsg, hr );
}

}

STDMETHODIMP CPMWLCtrl::ListViewAddItem(BSTR bstrText, int iItem, MWL_LV_COLUMNS_FLAGS nColumn)
{
// TODO: Add your implementation code here

if( ! m_pColumnConfig || !m_hListView ) return S_OK;

TCHAR* szText;
USES_CONVERSION;
szText= OLE2T(bstrText);

colConfig* pColumns = (colConfig*)(m_pColumnConfig);
for ( int i = 0; i < MWL_LV_COLUMN_NUMCOLUMNS; i++)
{
if ( pColumns[i].nFlag == nColumn && pColumns[i].nVis && pColumns[i].nPos != -1 )
{
if( nColumn == MWL_LV_COLUMN_PATIENTNAME ||
nColumn == MWL_LV_COLUMN_PERFORMPHYSICIAN ||
nColumn == MWL_LV_COLUMN_REFERRINGPHYSICIAN
)
{
//Convert patient name from DICOM format (with '^' to replace ' ') to normal name string
ConvertPatientNameFromDicom(szText, szText);
}
//Add to list view
LV_ITEM item;
item.iItem = iItem;
item.iSubItem = pColumns[i].nPos;
item.pszText = szText;
item.cchTextMax = lstrlen ( szText );
BOOL iRet;
if ( pColumns[i].nPos == 0 )
{
//Remember the original item index in online query result.
item.mask = LVIF_TEXT|LVIF_PARAM;
item.lParam = iItem;
iRet = ListView_InsertItem ( m_hListView, &item );
ATLTRACE("\nInsertItem iRet=%d", iRet );
}
else
{
item.mask = LVIF_TEXT;
iRet=ListView_SetItem ( m_hListView, &item );
ATLTRACE("\nSetItem iRet=%d", iRet );
}
return S_OK;
}
}
return S_OK;
}

唯一对字符串进行操作的就szText= OLE2T(bstrText);这一句,不知道在UNICODE下是不是有问题,我对COM编程不了解,这些字符串的转换搞的我头疼,发现网上很少有这方面的介绍,哪位有了解多多指教,或者哪里有这方面的知识,谢谢大家了。
小李匪盗 2004-03-29
  • 打赏
  • 举报
回复
支持是毫无疑问的。我也出现过这种情况,是读的时候读错了。
蒋晟 2004-03-29
  • 打赏
  • 举报
回复
ListCtrl支持UNICODE
你的问题可能是错误的传递了非Unicode字符串到控件
huaboy408 2004-03-29
  • 打赏
  • 举报
回复
我现在需要确切的说法,ListCtrl是否支持UNICODE
马丁当 2004-03-29
  • 打赏
  • 举报
回复
你搞错了吧,怎么会不支持??
huaboy408 2004-03-29
  • 打赏
  • 举报
回复
这样说来,LISTCTRL就不支持UNICODE了?
那么多字段,我每个都转换,是不是太麻烦了,有没有其他好方法
fzd999 2004-03-29
  • 打赏
  • 举报
回复
#ifdef UNICODE
WideCharToMultiByte(……)
#endif
……

进行Unicode到多字节文本的转换

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧