Информация об изменениях

Сообщение Re[4]: Как сделать текст в некоторых клетках в таблице (CLis от 13.06.2020 10:17

Изменено 13.06.2020 10:25 RussianFellow

Re[4]: Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
Я написал:

BEGIN_MESSAGE_MAP(CMyListCtrl4, CListCtrlEx2)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
END_MESSAGE_MAP()

void  CMyListCtrl4::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    int  length, row, column;
    LPCTSTR  pzText;
    LVITEM *pItem;
    bool  getItemRes;
    char  s[80], s1[5];
    CString  mystr;
    NMLVCUSTOMDRAW* pLVCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    NMCUSTOMDRAW  pLV = (NMCUSTOMDRAW)pLVCustomDraw->nmcd;
    *pResult = CDRF_DODEFAULT;
    row = pLVCustomDraw->nmcd.dwItemSpec;
    column = pLVCustomDraw->iSubItem;
    mystr = GetItemText(row,column);
    mystr = mystr.Trim();
    length = mystr.GetLength();
    pzText = mystr.GetBuffer();
    if (length==0)
        strcpy(s1,"");
    else
    {
        length = WideCharToMultiByte(CP_UTF8,0,pzText,-1,0,0,0,0);
        WideCharToMultiByte(CP_UTF8,0,pzText,-1,s,length,0,0);
        strncpy(s1,s,3);    s1[3] = '\0';
    }
    switch (pLVCustomDraw->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
        *pResult |= CDRF_NOTIFYITEMDRAW;
        break;
    case CDDS_ITEMPREPAINT:
        if ((strcmp(s1,"Дат")==0)||(strcmp(s1,"НИП")==0)||(strcmp(s1,"---")==0))
        {
            SelectObject(pLVCustomDraw->nmcd.hdc,m_FontBold);
        }
        break;
    }
}

void  CMyListCtrl4::PreSubclassWindow()
{
    LOGFONT  lf;
    memset(&lf,0,sizeof(LOGFONT));
    lf.lfHeight = 13;
    lf.lfWeight = FW_BOLD;
    wcscpy(lf.lfFaceName,L"MS Sans Serif");
    m_FontBold.CreateFontIndirect(&lf);
    CListCtrl::PreSubclassWindow();
}


Внутри функции OnCustomDraw считывается текст из клетки таблицы в переменную mystr, потом текст из переменной mystr благополучно преобразуется в переменную pzText, но потом в результате выполнения функции WideCharToMultiByte у меня в строке s вместо нормального текста получается какая-то абракадабра. То есть у меня было

2021.07.10

, а стало

Дата: 2021.07.10

.
Как мне исправить эту ошибку? Как сделать так, чтобы преобразование в строку s стало правильным?
Re[4]: Как сделать текст в некоторых клетках в таблице (CLis
Я написал:

BEGIN_MESSAGE_MAP(CMyListCtrl4, CListCtrlEx2)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
END_MESSAGE_MAP()

void  CMyListCtrl4::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    int  length, row, column;
    LPCTSTR  pzText;
    LVITEM *pItem;
    bool  getItemRes;
    char  s[80], s1[5];
    CString  mystr;
    NMLVCUSTOMDRAW* pLVCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    NMCUSTOMDRAW  pLV = (NMCUSTOMDRAW)pLVCustomDraw->nmcd;
    *pResult = CDRF_DODEFAULT;
    row = pLVCustomDraw->nmcd.dwItemSpec;
    column = pLVCustomDraw->iSubItem;
    mystr = GetItemText(row,column);
    mystr = mystr.Trim();
    length = mystr.GetLength();
    pzText = mystr.GetBuffer();
    if (length==0)
        strcpy(s1,"");
    else
    {
        length = WideCharToMultiByte(CP_UTF8,0,pzText,-1,0,0,0,0);
        WideCharToMultiByte(CP_UTF8,0,pzText,-1,s,length,0,0);
        strncpy(s1,s,3);    s1[3] = '\0';
    }
    switch (pLVCustomDraw->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
        *pResult |= CDRF_NOTIFYITEMDRAW;
        break;
    case CDDS_ITEMPREPAINT:
        if ((strcmp(s1,"Дат")==0)||(strcmp(s1,"НИП")==0)||(strcmp(s1,"---")==0))
        {
            SelectObject(pLVCustomDraw->nmcd.hdc,m_FontBold);
        }
        break;
    }
}

void  CMyListCtrl4::PreSubclassWindow()
{
    LOGFONT  lf;
    memset(&lf,0,sizeof(LOGFONT));
    lf.lfHeight = 13;
    lf.lfWeight = FW_BOLD;
    wcscpy(lf.lfFaceName,L"MS Sans Serif");
    m_FontBold.CreateFontIndirect(&lf);
    CListCtrl::PreSubclassWindow();
}


Внутри функции OnCustomDraw считывается текст из клетки таблицы в переменную mystr, потом текст из переменной mystr благополучно преобразуется в переменную pzText, но потом в результате выполнения функции WideCharToMultiByte у меня в строке s вместо нормального текста получается какая-то абракадабра. То есть у меня было

Дата: 2021.07.10

, а стало

Дата: 2021.07.10

.
Как мне исправить эту ошибку? Как сделать так, чтобы преобразование в строку s стало правильным?