Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.48.135] |
|
Сообщ.
#1
,
|
|
|
Есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, тип--его потомок). Размером, допустим, 10 на 10.
И как мне сделать текст в некоторых клетках этой таблице (например, в клетке с номером (3,4) ) жирным? И чтобы этот жирный текст в этой клетке соблюдался при прокрутке? Я понимаю, что для этого придётся создавать класс-потомок от CListCtrl, но как это сделать? Что нужно будет написать в этом классе-потомке? |
Сообщ.
#3
,
|
|
|
Я создал класс 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 Error 1696 error C2144: syntax error : 'void' should be preceded by '}' c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp Error 1697 error C2144: syntax error : 'void' should be preceded by ';' c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp Error 1695 error C2065: 'END_MESSAGE_MAP' : undeclared identifier c:\lunarmissionorbits2\lunarmissionorbits2\mylistctrl4.cpp 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. |
Сообщ.
#4
,
|
|
|
Я исправил ошибки--теперь программа компилируется и запускается.
Но как мне получить текст в текущей клетке таблицы внутри функции OnCustomDraw? Этот текст потом у меня обрабатывается. |
Сообщ.
#5
,
|
|
|
Я написал:
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 стало правильным? |
Сообщ.
#6
,
|
|
|
Цитата erslgoeirjh @ Как мне исправить эту ошибку? Как сделать так, чтобы преобразование в строку s стало правильным? Никакой ошибки нет. Ты преобразовал строку в формат UTF-8. Нетрудно выяснить, что "Дата: 2021.07.10" это "Дата: 2021.07.10" в формате UTF-8. |