На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как сделать текст в некоторых клетках в таблице (CListCtrl) жирным?
    Есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, тип--его потомок). Размером, допустим, 10 на 10.
    И как мне сделать текст в некоторых клетках этой таблице (например, в клетке с номером (3,4) ) жирным?
    И чтобы этот жирный текст в этой клетке соблюдался при прокрутке?

    Я понимаю, что для этого придётся создавать класс-потомок от CListCtrl, но как это сделать? Что нужно будет написать в этом классе-потомке?
        Я создал класс CMyListCtrl4 как потомок класса CListCtrl и поместил его .-файл и .cpp-файл в моё решение.

        Файл MyListCtrl4.h :

        ExpandedWrap disabled
          #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 :

        ExpandedWrap disabled
          #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.
          Я исправил ошибки--теперь программа компилируется и запускается.
          Но как мне получить текст в текущей клетке таблицы внутри функции OnCustomDraw?
          Этот текст потом у меня обрабатывается.
            Я написал:

            ExpandedWrap disabled
              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 @
              Как мне исправить эту ошибку? Как сделать так, чтобы преобразование в строку s стало правильным?

              Никакой ошибки нет.
              Ты преобразовал строку в формат UTF-8.
              Нетрудно выяснить, что "Дата: 2021.07.10" это "Дата: 2021.07.10"
              в формате UTF-8.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,6832 ]   [ 16 queries used ]   [ Generated: 18.04.24, 21:36 GMT ]