MFC在使用Windows 7的CListCtrl中使用Unicode和字体

时间:2012-01-22 00:51:11

标签: windows-7 unicode mfc clistctrl

我正在使用需要能够处理Unicode字符的MFC在C ++中开发应用程序。每当我尝试在CListCtrl中查看Unicode字符时,它们总是显示为正方形,但我可以在CEdit和CRichEdit中看到它们。我使用以下代码保存了一个我试图查看文件的字符列表:

bool CFileIO::writeStringToFile(CString str, CString filepath)
{
    FILE* outFile = _tfopen(filepath, _T("wb"));
    if(outFile == NULL)
    {
        return false;
    }

#ifdef _UNICODE
    int markerBits = 0xFEFF;
    fwrite(&markerBits, 2, 1, outFile);
#endif
    fwrite(str.GetBuffer(), sizeof(TCHAR), str.GetLength(), outFile);
    fclose(outFile);

    return true;
}

其中定义了_UNICODE,CString只是由换行符分隔的字符列表。当我在Notepad ++中打开这个文件时,我无法查看Unicode字符(它们显示为正方形),但是也是ASCII字符的字符显示得很好(这与我从CListCtrl获得的行为相同)。由于我能够将方块复制粘贴到Google Chrome的搜索栏中并且它们会在那里正确显示,我认为Notepad ++必须正确读取字符,它无法显示它们。经过一些互联网调查后,我认为问题可能是字体问题,所以在Notepad ++中,我将字体更改为Arial Unicode MS,瞧!有效!我可以看到所有的Unicode字符(和ASCII字符)就好了。

所以我决定将我的CListCtrl的字体更改为Arial Unicode MS只是为了看看是否能解决问题(因为它适用于Notepad ++),但我有疑虑,因为我所有的CListCtrl和CEdit的/ CRichEdit都使用相同的字体。正如我所担心的那样,更改字体并没有将Unicode字符从正方形改变(它们现在只是略微不同的正方形)。

这是踢球者:我在Windows 7上开发,而我的客户端使用Windows XP。他说他从来没有遇到过我所描述过的任何问题。所以,我在我的电脑上设置了一个XP虚拟机,而且看起来很不错。 XP和7之间唯一的区别在于我可以想到的是,在XP上你必须明确启用Unicode(我想安装一些额外的内容),而在7上它应该默认启用。

最后一件事:当我说它在XP中运行时,这并不完全准确。尽管大多数Unicode字符都正确显示,但有一些仍然在CListCtrl中显示为正方形(但在XP中的Notepad ++和7中它们正确显示)。我打印出他们的无符号字符值,只是为了看看它们是否溢出了TCHAR变量或其他东西。它们的值都在8212-8226范围内(不一定是全面的,只是我试图打印的范围)。我不知道为什么他们不出现。

我一直在互联网上搜索一段时间,我不知道这里发生了什么。我能想到的唯一一件事就是它可能与CRichEdit之前的那个问题类似(他们也没有将Unicode字符显示为除了正方形以外的任何东西,所以我不得不进入.rc文件并更改控制从“RichEdit”到“RichEdit20W”)。但我无法找到与CListCtrl相关的任何内容。有没有人对MFC及其如何处理可能指向正确方向的Unicode有任何见解?

更新:遵循DavidK的建议(在下面的评论中),我创建了一个测试MFC应用程序,它只是一个带有CListCtrl的对话框。启动时,它会在上述文件中读取Unicode和ASCII字符的混合,并且所有内容都正确显示(根本没有框)。我回去运行原始程序,一切都正常工作(XP中不显示的字符也显示为黑盒子,但其他一切都正确显示)。我将程序复制到一台单独的Windows 7机器(不是我的开发机器)并运行它。我遇到了和以前一样的问题(CListCtrl中的所有Unicode字符都是框)。我应该提一下,测试应用程序与主项目处于同一解决方案中,但我不确定这是否重要。

我将测试应用程序复制到我的非开发机器上,当我运行它时,它显示所有Unicode字符的框,就像主程序在该机器上所做的那样。我很困惑。我唯一的猜测是应用程序链接到不同机器上的不同DLL和/或机器上的字体存在一些问题。

0 个答案:

没有答案