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;
}
然后编译之后就显示成这样了:
我在属性中也改成了“使用多字节字符集”,但还是不对
麻烦哪个巨巨解决一下我的问题,谢谢啦