秋月白xixi 2023-11-06 20:43 采纳率: 58.3%
浏览 27
已结题

mfc编译之后list control中文结果乱码,为什么?

mfc编译之后list control中文结果乱码,为什么?
以下是MainFramDlg.cpp的代码:

// MainFramDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Ex_ADO.h"
#include "MainFramDlg.h"

// CMainFramDlg 对话框

IMPLEMENT_DYNAMIC(CMainFramDlg, CDialog)

CMainFramDlg::CMainFramDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMainFramDlg::IDD, pParent)
    , m_strDate(_T(""))
    , m_strProject(_T(""))
    , m_fMoney(0)
    , m_strNote(_T(""))
    , m_strInOut(_T(""))
{

}

CMainFramDlg::~CMainFramDlg()
{
}

void CMainFramDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_Date, m_strDate);
    DDX_Text(pDX, IDC_EDIT_Project, m_strProject);
    DDX_Text(pDX, IDC_EDIT_Money, m_fMoney);
    DDX_Text(pDX, IDC_EDIT_Note, m_strNote);
    DDX_CBString(pDX, IDC_COMBO_InOut, m_strInOut);
    DDX_Control(pDX, IDC_COMBO_InOut, c_ComBoInOut);
    DDX_Control(pDX, IDC_LIST_Detail, c_listDetail);
}


BEGIN_MESSAGE_MAP(CMainFramDlg, CDialog)
    ON_WM_DESTROY()
    ON_BN_CLICKED(IDOK, &CMainFramDlg::OnBnClickedOk)
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_Detail, &CMainFramDlg::OnLvnItemchangedListDetail)
END_MESSAGE_MAP()


// CMainFramDlg 消息处理程序

BOOL CMainFramDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO:  在此添加额外的初始化
    // 初始化Connection指针
    m_pConnection.CreateInstance(__uuidof(Connection)); 
    // 初始化Recordset指针
    m_pRecordset.CreateInstance(__uuidof(Recordset));    
    // 初始化Command指针
    m_pCommand.CreateInstance(__uuidof(Command));    
    // 连接数据源
    m_pConnection->ConnectionString = "DSN=BanFeiDSN";
    // 允许连接超时时间,单位为秒
            m_pConnection->ConnectionTimeout = 30;     
    HRESULT  hr = m_pConnection->Open("","","",0); 
    if (hr != S_OK) MessageBox("无法连接指定的数据库!");
    //list设置
    // 删除列表中所有行和列表头
    c_listDetail.DeleteAllItems();
    int nColumnCount = c_listDetail.GetHeaderCtrl()->GetItemCount();
    for (int i=0; i<nColumnCount; i++)
      c_listDetail.DeleteColumn(0);
    //连接
     m_pCommand->ActiveConnection=m_pConnection;
    //查询记录
    m_pCommand->CommandText=_bstr_t("select *from BanFeiInfo");
    m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText);
    while (m_pRecordset->adoEOF)
    {
     MessageBox("没有记录!");
     return 0;
    }
    m_pRecordset->MoveFirst();
    // 建立列表控件的列表头
    FieldsPtr flds = m_pRecordset->GetFields();    

// 获取当前表的字段指针
    _variant_t Index;
      Index.vt = VT_I2;
    c_listDetail.InsertColumn(0, LPCTSTR("序号"),LVCFMT_LEFT, 40 );
    for (int i = 0; i < (int)flds->GetCount(); i++) 
      {
        Index.iVal=i;
        c_listDetail.InsertColumn(i+1,flds->GetItem(Index)->GetName(),LVCFMT_LEFT, 100 );
     }
    //显示记录
    //_bstr_t str, value;
    _variant_t var1;
    _bstr_t str,value;
    CString value2;
    int nItem = 0;
    CString strItem;
    while (!(m_pRecordset->adoEOF))
    {
       strItem.Format("%d", nItem+1);
        c_listDetail.InsertItem(nItem, strItem);
        for (int i = 0; i < (int)flds->GetCount();i++)  
               {
            Index.iVal=i;
            str = flds->GetItem(Index)->GetName();
            var1 = m_pRecordset->GetCollect(str);           
            if(var1.vt != VT_NULL)
            {
            value = m_pRecordset->GetCollect(str);
            value2 = (char*)_bstr_t(m_pRecordset->GetCollect(str));
            if (value2.IsEmpty())        

c_listDetail.SetItemText( nItem, i+1, LPCTSTR("-"));
            else
            {
                if (value2=="Y")                  

c_listDetail.SetItemText( nItem, i+1, LPCTSTR("已读"));
                else if (value2=="N")
                  

c_listDetail.SetItemText( nItem, i+1,  LPCTSTR("未读"));
                else
                    

c_listDetail.SetItemText( nItem, i+1,  LPCTSTR(value));
            }
            }
        }
        m_pRecordset->MoveNext();
        nItem++;

    } 
    //c_listDetail.SetColumnWidth(0,0);

     m_pRecordset->Close();
    //关闭记录集
    return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
}

void CMainFramDlg::OnDestroy()
{
    CDialog::OnDestroy();

    // TODO: 在此处添加消息处理程序代码
    if (m_pConnection)
    m_pConnection->Close();        // 关闭连接

}

void CMainFramDlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    //因为登录界面隐藏了,退出主界面时,要把隐藏界面也关闭
    PostQuitMessage(0);
    OnOK();
}

void CMainFramDlg::OnLvnItemchangedListDetail(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;

}

然后编译之后就显示成这样了:

img

我在属性中也改成了“使用多字节字符集”,但还是不对
麻烦哪个巨巨解决一下我的问题,谢谢啦

  • 写回答

15条回答 默认 最新

  • 小明爱吃火锅 2023-11-07 12:03
    关注

    引用文心一言以及思考:
    MFC(Microsoft Foundation Classes)是微软提供的一组用于创建基于Windows的应用程序的类库。在MFC应用程序中,List Control常常被用来显示数据。如果编译后List Control中的中文显示乱码,可能是由于字符集编码问题导致的。

    以下是一些可能导致问题的原因和解决方法:

    1. 字符集编码不匹配:如果你的代码文件和List Control使用的字符集编码不匹配,中文就可能显示为乱码。检查你的代码文件和List Control的字符集编码是否一致。在MFC中,可以通过在List Control的属性对话框中设置“字体”来指定字符集编码。
    2. 资源文件错误:如果你的List Control是用来显示从资源文件中读取的字符串,确保资源文件是以正确的编码方式保存的。资源文件通常使用UTF-8编码,如果使用其他编码方式,可能会导致显示乱码。
    3. 字体问题:如果List Control使用的字体不支持中文字符,可能会导致乱码。尝试更换支持中文字符的字体,如“宋体”或“微软雅黑”。
    4. 代码问题:如果你的代码中使用了宽字符或Unicode字符串,确保在显示之前已经正确地转换为List Control可以接受的字符集编码。
    5. 环境问题:如果你的开发环境或运行环境与目标环境不一致,可能会导致字符集编码问题。确保开发环境和目标环境使用相同的字符集编码。

    以上是一些可能的原因和解决方法,根据具体情况进行排查和修复。如果问题仍然存在,建议查阅相关文档或寻求专业人士的帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 Fatal error in Process MEMORY
  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统