Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 04.06.20 07:14
Оценка:
Есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, тип--его потомок). Размером, допустим, 10 на 10.
И как мне сделать текст в некоторых клетках этой таблице (например, в клетке с номером (3,4) ) жирным?
И чтобы этот жирный текст в этой клетке соблюдался при прокрутке?

Я понимаю, что для этого придётся создавать класс-потомок от CListCtrl, но как это сделать? Что нужно будет написать в этом классе-потомке?
1613 г. = 2024 г.
Re: Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
От: flаt  
Дата: 04.06.20 08:18
Оценка: +1
https://stackoverflow.com/q/31245713
Re[2]: Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 11.06.20 14:45
Оценка:
Я создал класс CMyListCtrl4 как потомок класса CListCtrl и поместил его .-файл и .cpp-файл в моё решение.

Файл MyListCtrl4.h :

#ifndef MYLISTCTRL4_H
#define MYLISTCTRL4_H

#include <afxwin.h>
#include <afxdialogex.h>

class  CMyListCtrl4 : public CListCtrl
{
protected:
    void PreSubclassWindow();
    CFont  m_Font;
    afx_msg void  OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    DECLARE_MESSAGE_MAP()
public:
    //
};


Файл MyListCtrl4.cpp :

#include "stdafx.h"
#include "windows.h"
#include "MyListCtrl4.h"

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

void  CMyListCtrl4::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    int  length;
    LPCTSTR  pzText;
    LVITEM *pItem;
    bool  getItemRes;
    char  s[80], s1[5];
    NMLVCUSTOMDRAW* pLVCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>pNHMDR;
    NMCUSTOMDRAW  pLV = (NMCUSTOMDRAW)pLVCustomDraw->nmcd;
    *pResult = CDRF_DODEFAULT;
    getItemRes = GetItem(pItem);
    if (getItemRes==false)
        strcpy(s1,"");
    else
    {
        pzText = pItem->pszText;
        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;
    strcpy(lf.lfFaceName,"MS Sans Serif");
    m_FontFold.CreateFontIndirect(&lf);
    CListCtrl::PreSubclassWindow();
}


В результате при компиляции у меня выдаются следующие ошибки:

Error 1699 error C2601: 'CMyListCtrl4::PreSubclassWindow' : local function definitions are illegal c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp
Error 1698 error C2601: 'CMyListCtrl4::OnCustomDraw' : local function definitions are illegal c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp 10
Error 1696 error C2144: syntax error : 'void' should be preceded by '}' c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp 9
Error 1697 error C2144: syntax error : 'void' should be preceded by ';' c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp 9
Error 1695 error C2065: 'END_MESSAGE_MAP' : undeclared identifier c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp 9
Error 1700 error C1075: end of file found before the left brace '{' at 'c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp(5)' was matched c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp


В чём причина этого? Как мне решить эту проблему?
Среда разработки--Visual Studio 2010.
1613 г. = 2024 г.
Re[3]: Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 12.06.20 09:29
Оценка:
Я устранил ошибки, теперь всё компилируется и программа запускается.
Но у меня вопрос: как получить текст в текущей клетке внутри функции OnCustomDraw?
Потому что этот текст у меня там обрабатывается.
1613 г. = 2024 г.
Re[4]: Как сделать текст в некоторых клетках в таблице (CLis
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 13.06.20 10:17
Оценка:
Я написал:

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 стало правильным?
1613 г. = 2024 г.
Отредактировано 13.06.2020 10:25 RussianFellow . Предыдущая версия .
Re: Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
От: The Minister Земля  
Дата: 30.07.20 10:21
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

Переходи уже на Qt.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.