Есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, тип--его потомок). Размером, допустим, 10 на 10.
И как мне сделать текст в некоторых клетках этой таблице (например, в клетке с номером (3,4) ) жирным?
И чтобы этот жирный текст в этой клетке соблюдался при прокрутке?
Я понимаю, что для этого придётся создавать класс-потомок от CListCtrl, но как это сделать? Что нужно будет написать в этом классе-потомке?
1613 г. = 2024 г.
Я создал класс 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 г.
Я устранил ошибки, теперь всё компилируется и программа запускается.
Но у меня вопрос: как получить текст в текущей клетке внутри функции OnCustomDraw?
Потому что этот текст у меня там обрабатывается.
1613 г. = 2024 г.
Я написал:
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 г.