Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2020, 10:31   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?

Есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, тип--его потомок). Размером, допустим, 10 на 10.
И как мне сделать текст в некоторых клетках этой таблице (например, в клетке с номером (3,4) ) жирным?
И чтобы этот жирный текст в этой клетке соблюдался при прокрутке?

Я понимаю, что для этого придётся создавать класс-потомок от CListCtrl, но как это сделать? Что нужно будет написать в этом классе-потомке?
erslgoeirjh вне форума Ответить с цитированием
Старый 05.06.2020, 13:52   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 950
По умолчанию

erslgoeirjh, субклассить, затем рисовать вручную CListCtrl::DrawItem

возможно, проканает такой трюк - доставать hDC из DRAWITEMSTRUCT , вытаскивать текущий шрифт, менять его, затем вызывать родительский обработчик. После вызова нужно вернуть шрифт, скорее всего, обратно. Но, может, и не потребуется возвращать - надо экспериментировать

если не проканает - тогда в этом обработчике выводить текст вручную через DrawState
Алексей1153 вне форума Ответить с цитированием
Старый 11.06.2020, 17:55   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Я создал класс 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\lunarmission orbits2\mylistctrl4.cpp 44
Error 1698 error C2601: 'CMyListCtrl4::OnCustomDraw' : local function definitions are illegal c:\lunarmissionorbits2\lunarmission orbits2\mylistctrl4.cpp 10
Error 1696 error C2144: syntax error : 'void' should be preceded by '}' c:\lunarmissionorbits2\lunarmission orbits2\mylistctrl4.cpp 9
Error 1697 error C2144: syntax error : 'void' should be preceded by ';' c:\lunarmissionorbits2\lunarmission orbits2\mylistctrl4.cpp 9
Error 1695 error C2065: 'END_MESSAGE_MAP' : undeclared identifier c:\lunarmissionorbits2\lunarmission orbits2\mylistctrl4.cpp 9
Error 1700 error C1075: end of file found before the left brace '{' at 'c:\lunarmissionorbits2\lunarmissio norbits2\mylistctrl4.cpp(5)' was matched c:\lunarmissionorbits2\lunarmission orbits2\mylistctrl4.cpp 53
В чём причина этого? Как мне решить эту проблему?
Среда разработки--Visual Studio 2010.
erslgoeirjh вне форума Ответить с цитированием
Старый 11.06.2020, 19:29   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 950
По умолчанию

erslgoeirjh, поработаю компилятором, но только один раз ))

1) пропущено закрытие для #ifndef
Цитата:
#ifndef MYLISTCTRL4_H
#define MYLISTCTRL4_H
...
#endif
и вообще не нужно этот мусор из трёх строк вписывать, просто в начале заголовочника напиши
Код:
#pragma once
2) "системные" заголовки - в треугольных скобках
#include "windows.h"
#include <windows.h>

3) пропущены круглые скобки
END_MESSAGE_MAP()

4) опечатка
pNHMDR

а также пропущены скобки
reinterpret_cast<NMLVCUSTOMDRAW*>(pNHMDR);

5) читать доку по WideCharToMultiByte

6) неправильно поставлена скобка
if (strcmp(s1,"Дат")==0)||(strcmp(s1,"НИП")==0)||(strcmp(s1 ,"---")==0)

Последний раз редактировалось Алексей1153; 11.06.2020 в 21:14.
Алексей1153 вне форума Ответить с цитированием
Старый 11.06.2020, 21:08   #5
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Спасибо, всё откомпилировалось!
erslgoeirjh вне форума Ответить с цитированием
Старый 12.06.2020, 12:40   #6
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

После исправления ошибок программа компилируется и запускается.
Но как мне получить текст в текущей клетке таблицы внутри функции OnCustomDraw?
Этот текст потом у меня обрабатывается.
erslgoeirjh вне форума Ответить с цитированием
Старый 12.06.2020, 18:12   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 950
По умолчанию

erslgoeirjh,

описание структуры
https://docs.microsoft.com/en-us/win...nmlvcustomdraw

в ней есть следующая структура
https://docs.microsoft.com/en-us/win...l-nmcustomdraw

и как это всё использовать (не знаю, под чем они там были, когда это придумывали :D )
http://forums.codeguru.com/showthrea...l-OnCustomDraw

Код:
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{

NMLVCUSTOMDRAW *pCD = (NMLVCUSTOMDRAW*)pNMHDR;
*pResult =CDRF_DODEFAULT ;

int iRow = pCD->nmcd.dwItemSpec;
int iColumn = pCD->iSubItem;

switch( pCD->nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
break;

case CDDS_ITEMPREPAINT:
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;;
}
break;

case CDDS_ITEMPREPAINT | CDDS_SUBITEM :
{

if (iRow == 3 && iColumn == 2)
{
CDC* pDC = CDC::FromHandle(pCD->nmcd.hdc);
CRect rect ;
GetSubItemRect( iRow,iColumn, VIR_BOUNDS, rect);
pDC->DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);

}
// ...

*pResult = CDRF_NEWFONT;
}
break;

//...
}
Алексей1153 вне форума Ответить с цитированием
Старый 12.06.2020, 19:49   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Давайте не будем путать CListCtrl и CListView.

http://forums.codeguru.com/showthrea...)-of-CListCtrl
waleri вне форума Ответить с цитированием
Старый 13.06.2020, 13:32   #9
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Я написал:

Код:
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 стало правильным?
erslgoeirjh вне форума Ответить с цитированием
Старый 13.06.2020, 16:43   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
Как мне исправить эту ошибку?
Не используйте char, используйте wchar_t.
Не используйте strcmp, используйте wcscmp и так далее.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текст в клетках таблицы не отображается по центру erslgoeirjh Visual C++ 3 07.03.2019 12:48
Как сделать заголовок из двух строк в таблице (CListCtrl) ? erslgoeirjh Visual C++ 0 26.02.2019 16:05
Вопрос по столбцам в таблице (CListCtrl) erslgoeirjh Visual C++ 1 12.02.2019 17:38
Как изменить высоту строки в таблице (CListCtrl) erslgoeirjh Visual C++ 1 15.05.2018 19:41
Как выделить в таблице (CListCtrl) всю строку, но только одну? erslgoeirjh Visual C++ 1 15.11.2016 16:02