mfc中为什么使用Edit Control插入汉字会乱码。

mfc中为什么使用Edit Control插入汉字会乱码。

img


```c++

void GXNR::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    HRESULT hr;                 //用来判断
    hr = CoInitialize(NULL);   //初始化COM支持库

    if (FAILED(hr))
    {
        MessageBox(_T("初始化失败"));
    }
    else
    {
        //MessageBox(_T("初始化成功"));
    }

    CApplication m_app;  //应用程序对象
    CWorkbooks books;    //所有的工作簿
    CWorkbook book;      //工作簿
    CWorksheets sheets;  //所有的工作表
    CWorksheet sheet;    //工作表
    CRange range;        //单元格
    LPDISPATCH lpDisp;
    COleVariant vResult;   //结果集
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);    //false读取一次后按钮变灰,true不变灰
                                                    //GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
                                                    //打开Excel应用程序
    if (!m_app.CreateDispatch(_T("Excel.Application"), NULL))
    {
        MessageBox(_T("无法启动"));
        return;
    }
    else
    {
        //MessageBox(_T("启动成功"));        
    }
    CFileDialog filedlg(TRUE, L"*.xls ", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"xlsx文件(*.xls)|*.xlsx");                //打开所有的excel文件
    filedlg.m_ofn.lpstrTitle = L" 打开文件";
    CString strFilepath;

    if (IDOK == filedlg.DoModal())
    {
        strFilepath = filedlg.GetPathName();      //保存路径
        strNewFilepath = strFilepath;
        SetWindowText(strFilepath);
        delete filedlg;
    }
    else
    {
        return;
    }

    //打开路径下的xlsx文件
    books.AttachDispatch(m_app.get_Workbooks());    //打开工作簿集
                                                    //book = books.Add(covOptional);     创建一个新的表
    lpDisp = books.Open(strFilepath, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
        covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);   //打开路径下的工作簿                                                                                                           //得到工作簿
    book.AttachDispatch(lpDisp);
    //得到表
    sheets.AttachDispatch(book.get_Worksheets());
    //得到当前活跃的表,若有单元格正处于编辑状态,此操作不能反回
    sheet.AttachDispatch(sheets.get_Item(_variant_t((short)(1))));  //获取第一个表
                                                                    //m_app.put_Visible(TRUE);    //表格可见
                                                                    //m_app.put_UserControl(TRUE);   //控制权限

    range.AttachDispatch(sheet.get_UsedRange());
    range.AttachDispatch(range.get_Rows());
    int irownum = range.get_Count();      //已使用的行数
    range.AttachDispatch(range.get_Columns());
    int icolnum = range.get_Count();    //使用的列数
    int istartrow = range.get_Row();    //起始行
    int istartcol = range.get_Column();    //起始列
    m_list.DeleteAllItems();    //删除列表项
    for (int mrow = 2; mrow < irownum + 1; mrow++)
    {
        range.AttachDispatch(sheet.get_Cells());  //获取所有的单元格
        range.AttachDispatch(range.get_Item(COleVariant((long)mrow), COleVariant((long)1)).pdispVal);//获取选定的单元格信息
        vResult = range.get_Value2();
        CString str0;
        str0 = vResult.bstrVal;
        m_list.InsertItem(mrow - 2, str0);
        //表格中第一行是标题,所以我从第二行开始
        for (int j = 2; j < icolnum + 1; j++)
        {
            range.AttachDispatch(sheet.get_Cells());
            range.AttachDispatch(range.get_Item(COleVariant((long)mrow), COleVariant((long)j)).pdispVal);
            vResult = range.get_Value2();
            CString str;
            if (vResult.vt == VT_BSTR)  //字符串
            {
                str = vResult.bstrVal;
            }
            else if (vResult.vt == VT_R8)
            {
                str.Format(L"%.0f", vResult.dblVal);
            }
            else if (vResult.vt == VT_I4)
            {
                str.Format(_T("%ld"), (int)vResult.lVal);
            }
            m_list.SetItemText(mrow - 2, j - 1, str);

        }

    }
    //books.Close();  //关闭工作簿
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    m_app.Quit();    //程序退出
}


void GXNR::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    int delnum;    //接收要删除的行号
    int getcunt = m_list.GetItemCount();
    for (int i = 0; i < getcunt; i++)
    {
        if (m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED)
        {
            delnum = i;
            m_list.DeleteItem(i);   //控件中删除数据
        }
    }

    //excel中删除数据并保存
    HRESULT hr;
    hr = CoInitialize(NULL);   //初始化COM支持库

    if (FAILED(hr))
    {
        MessageBox(_T("初始化失败"));
    }
    else
    {
        //MessageBox(_T("初始化成功"));
    }



    CApplication m_app;  //应用程序对象
    CWorkbooks books;    //所有的工作簿
    CWorkbook book;      //工作簿
    CWorksheets sheets;  //所有的工作表
    CWorksheet sheet;    //工作表
    CRange range;        //单元格
    LPDISPATCH lpDisp;
    COleVariant vResult;
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);    //false读取一次后按钮变灰,true不变灰

                                                    //打开Excel应用程序
    if (!m_app.CreateDispatch(_T("Excel.Application"), NULL))
    {
        MessageBox(_T("无法启动"));
        return;
    }
    else
    {
        //MessageBox(_T("启动成功"));        
    }

    books.AttachDispatch(m_app.get_Workbooks());
    //book = books.Add(covOptional);     创建一个新的表

    CString efile = strNewFilepath;
    //_T("D:\\lianxi\\Text1.xlsx");

    lpDisp = books.Open(efile, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
        covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
    //得到工作簿
    book.AttachDispatch(lpDisp);
    //得到表
    sheets.AttachDispatch(book.get_Worksheets());
    //sheet = sheets.get_Item(COleVariant(short)1);
    //得到当前活跃的表,若有单元格正处于编辑状态,此操作不能反回
    lpDisp = book.get_ActiveSheet();
    sheet.AttachDispatch(lpDisp);
    m_app.put_Visible(FALSE);    //表格可见
    m_app.put_UserControl(TRUE);   //控制权限

    range.AttachDispatch(sheet.get_UsedRange());
    range.AttachDispatch(range.get_Rows());
    long irownum = range.get_Count();      //已使用的行数
    range.AttachDispatch(range.get_Columns());
    long icolnum = range.get_Count();    //使用的列数
    long istartrow = range.get_Row();    //起始行
    long istartcol = range.get_Column();    //起始列

    range.AttachDispatch(sheet.get_Cells());
    CString startcell;
    CString endcell;
    startcell.Format(_T("A%d"), (delnum + 2));
    endcell.Format(_T("C%d"), (delnum + 2));
    range.AttachDispatch(sheet.get_Range(COleVariant(startcell), COleVariant(endcell)));
    range.Delete(COleVariant((long)(-4162)));   //删除后表格往上提
    book.Save();

    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();

    m_app.ReleaseDispatch();
}


void GXNR::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(true);
    CRect rc;
    CString strtemp;

    NM_LISTVIEW *pNMListCtrl = (NM_LISTVIEW*)pNMHDR;   //结构体保存双击的行号列号
    m_row = pNMListCtrl->iItem;
    m_col = pNMListCtrl->iSubItem;

    if (pNMListCtrl->iItem == -1)    //在头文件中定义m_row,m_col = -1,若为-1则在空白区域
    {
        m_row = m_list.GetItemCount();//获得控件项目的个数
        strtemp.Format(_T("%d"), m_row + 1);//在个数下一行进行编辑
        m_list.InsertItem(m_row, strtemp);//插入正文的第一列的内容
        m_list.SetItemState(m_row, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);//设置行的状态
        m_list.EnsureVisible(m_row, FALSE);//使列表视图项至少部分可视。如果必要,可以滚动列表视图控件,此处是项部分可视时,将不发生滚动
    }
    else
    {
        m_list.GetSubItemRect(m_row, m_col, LVIR_LABEL, rc);//获取整个单元格的矩形区域,最后一个参数包含子项绑定矩形坐标的CRect对象的参考CRect
        m_edit.SetParent(&m_list);  //包含子项绑定矩形坐标的CRect对象的参考
        m_edit.MoveWindow(rc);   //指定这个窗口的位置和大小
        m_edit.SetWindowTextW(m_list.GetItemText(m_row, m_col));   //窗口为一个控件,获取列表视图项或子项的文本,设置为控件内的文本。
        m_edit.ShowWindow(SW_SHOW);  //窗口可见
        m_edit.SetFocus();//设置edit焦点,这个函数要求得到输入焦点。输入焦点将随后的所有键盘输入定向到这个窗口
        m_edit.ShowCaret();//这个函数在屏幕上当前插字符位置显示插字符
        m_edit.SetSel(0, -1);//单元格里的数据全选中
    }
    *pResult = 0;
}


void GXNR::OnEnKillfocusEdit2()
{
    // TODO: 在此添加控件通知处理程序代码
    CString str;
    m_edit.GetWindowTextW(str);   //获取edit控件里的内容
    m_list.SetItemText(m_row, m_col, str);//往列表里设置内容

    m_edit.ShowWindow(SW_HIDE);  //隐藏edit控件

    HRESULT hr;
    hr = CoInitialize(NULL);   //初始化COM支持库

    if (FAILED(hr))
    {
        MessageBox(_T("初始化失败"));
    }
    else
    {
        //MessageBox(_T("初始化成功"));
    }

    CApplication m_app;  //应用程序对象
    CWorkbooks books;    //所有的工作簿
    CWorkbook book;      //工作簿
    CWorksheets sheets;  //所有的工作表
    CWorksheet sheet;    //工作表
    CRange range;        //单元格
    LPDISPATCH lpDisp;
    COleVariant vResult;
    COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);    //false读取一次后按钮变灰,true不变灰

                                                    //打开Excel应用程序
    if (!m_app.CreateDispatch(_T("Excel.Application"), NULL))
    {
        MessageBox(_T("无法启动"));
        return;
    }
    else
    {
        //MessageBox(_T("启动成功"));        
    }

    books.AttachDispatch(m_app.get_Workbooks());
    //book = books.Add(covOptional);     创建一个新的表

    CString efile = strNewFilepath;
    //_T("D:\\lianxi\\Text1.xlsx");

    lpDisp = books.Open(efile, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
        covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
    //得到工作簿
    book.AttachDispatch(lpDisp);
    //得到表
    sheets.AttachDispatch(book.get_Worksheets());
    //sheet = sheets.get_Item(COleVariant(short)1);
    //得到当前活跃的表,若有单元格正处于编辑状态,此操作不能反回
    lpDisp = book.get_ActiveSheet();
    sheet.AttachDispatch(lpDisp);
    m_app.put_Visible(FALSE);    //表格可见
    m_app.put_UserControl(TRUE);   //控制权限

    range.AttachDispatch(sheet.get_UsedRange());
    range.AttachDispatch(range.get_Rows());
    long irownum = range.get_Count();      //已使用的行数
    range.AttachDispatch(range.get_Columns());
    long icolnum = range.get_Count();    //使用的列数
    long istartrow = range.get_Row();    //起始行
    long istartcol = range.get_Column();    //起始列

    range.AttachDispatch(sheet.get_Cells());
    range.put_Item(_variant_t((long)(m_row + 2)), _variant_t((long)(m_col + 1)), _variant_t(str));
    book.Save();

    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    m_app.Quit();
    m_app.ReleaseDispatch();
}


BOOL GXNR::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // TODO:  在此添加额外的初始化
    m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);

    m_list.InsertColumn(0, _T("工序号"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(1, _T("工序名称"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(2, _T("设备"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(3, _T("工艺装备名称"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(4, _T("工艺装备编码"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(5, _T("工时定额h-准结"), LVCFMT_LEFT, 80);
    m_list.InsertColumn(6, _T("工时定额h-单件"), LVCFMT_LEFT, 80);
    m_edit.ShowWindow(SW_HIDE);
    return TRUE;  // return TRUE unless you set the focus to a control
                  // 异常: OCX 属性页应返回 FALSE
}

```

在SetWindow Text的时候使用SetWindowTexeA函数,强迫使用ANSI格式

CEdit* pBoxOne;
pBoxOne = (CEdit*) GetDlgItem(ID_VIEW_LIST);
SetWindowTextA(pBoxOne->m_hWnd,rec_result);