На главную Наши проекты:
Журнал   ·   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
  
> Отдельные строки ListCtrl жирным шрифтом
    У меня есть массив объеков собственного класса. Я отображаю весь массив в ListCtrl (для каждого объекта своя строка). У меня в классе есть переменная (поле) типа BOOL. Я хочу так сделать. Чтоб если она =TRUE строка выводилась жирной, иначе обычной. Ну ListCtrl стандартные какие нибудь средства имеет для этого. И вообще объясните как это сделать. По возможности ссылку на русскую инфу.
      ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

      ExpandedWrap disabled
        // **** OnCustomDraw ****
        void CMyListView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
        {
            NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
            NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd;
            CListCtrl &Ctrl = GetListCtrl();
            
            *pResult = CDRF_DODEFAULT;    
            switch(pLVCustomDraw->nmcd.dwDrawStage)
            {
            case CDDS_PREPAINT:
                *pResult |= CDRF_NOTIFYITEMDRAW;
                break;
            case CDDS_ITEMPREPAINT:
                if (Ctrl.GetItemText(pLV.dwItemSpec, 8) == "Привет")
                {
                    SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold);
                    pLVCustomDraw->clrText = RGB(0, 0, 160);
                }
                break;
            }
        }


      Думаю, все понятно... Рыть надо по методу OnCustomDraw
        Я новичок. Можно поподробнее. К сожалению не все понятно.
        ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) где распологать? В карте сообщений главного окна?
        CMyListView это что класс унаследованный от ClistCtrl?
        И самое главное
        Цитата SexGenius, 13.10.03, 14:10:50
        У меня в классе есть переменная (поле) типа BOOL. Я хочу так сделать. Чтоб если она =TRUE строка выводилась жирной, иначе обычной.

        Я имел ввиду что в классе главного окна она есть. Так как же будет происходить проверка и вывод в ListControl с учетом значения этой переменной?
          Много писать..

          В кратце ты должен создать новый класс от CListCtrl, переопределить OnCustomDraw,
          а в методе:

          ExpandedWrap disabled
            BEGIN_MESSAGE_MAP(CMyListCtrl, CMyListCtrl)
                //{{AFX_MSG_MAP(CMyListCtrl)
                ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
               //}}AFX_MSG_MAP
            END_MESSAGE_MAP()


          ExpandedWrap disabled
                 h файл
                //{{AFX_MSG(CMyListCtrl)
                ...
                afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
                ...
                //}}AFX_MSG


          ExpandedWrap disabled
            // **** OnCustomDraw ****
            void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
            {
                NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
                NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd;
                
                *pResult = CDRF_DODEFAULT;    
                switch(pLVCustomDraw->nmcd.dwDrawStage)
                {
                case CDDS_PREPAINT:
                    *pResult |= CDRF_NOTIFYITEMDRAW;
                    break;
                case CDDS_ITEMPREPAINT:
                    if (m_ModeBold) // твоя переменная
                    {
                        SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold);
                        // m_FontBold - твой жирный шрифт, которые ты должен создать заранее
                    }
                    break;
                }
            }


          это Notify NM_CUSTOMDRAW
            Ладно, надо помагать людям, сам таким был.. Вот щас наваял и выкладываю решение твоей проблемы.
            Это класс:

            ExpandedWrap disabled
               h файл
              class CMyListCtrl : public CListCtrl
              {
              // Construction
              public:
                    CMyListCtrl();
               
              // Attributes
              public:
               
              // Operations
              public:
               
              // Overrides
                    // ClassWizard generated virtual function overrides
                    //{{AFX_VIRTUAL(CMyListCtrl)
                    protected:
                    virtual void PreSubclassWindow();
                    //}}AFX_VIRTUAL
               
              // Implementation
              public:
                    virtual ~CMyListCtrl();
               
                    // Generated message map functions
              protected:
               
                    CFont m_FontBold;
                    BOOL m_ModeBold;
               
                    //{{AFX_MSG(CMyListCtrl)
                  afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
                    //}}AFX_MSG
               
                    DECLARE_MESSAGE_MAP()
              };



            ExpandedWrap disabled
              cpp файл
               
              /////////////////////////////////////////////////////////////////////////////
              // CMyListCtrl
               
              CMyListCtrl::CMyListCtrl()
              {
                    m_ModeBold = TRUE;
              }
               
              CMyListCtrl::~CMyListCtrl()
              {
              }
               
               
              BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
                    //{{AFX_MSG_MAP(CMyListCtrl)
                  ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
                    //}}AFX_MSG_MAP
              END_MESSAGE_MAP()
               
              /////////////////////////////////////////////////////////////////////////////
              // CMyListCtrl message handlers
               
              // **** OnCustomDraw ****
              void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
              {
                  NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
                  NMCUSTOMDRAW pLV = (NMCUSTOMDRAW) pLVCustomDraw->nmcd;
                  
                  *pResult = CDRF_DODEFAULT;    
                  switch(pLVCustomDraw->nmcd.dwDrawStage)
                  {
                  case CDDS_PREPAINT:
                      *pResult |= CDRF_NOTIFYITEMDRAW;
                      break;
                  case CDDS_ITEMPREPAINT:
                          if (m_ModeBold)
                          {
                                SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold);
                                pLVCustomDraw->clrText = RGB(0, 0, 160);
                      }
                      break;
                  }
              }
               
              void CMyListCtrl::PreSubclassWindow()
              {
                  LOGFONT lf;
                  memset(&lf, 0, sizeof(LOGFONT));
                  lf.lfHeight = 13;
                  lf.lfWeight = FW_BOLD;
                  strcpy(lf.lfFaceName, "Tahoma");
                  VERIFY(m_FontBold.CreateFontIndirect(&lf));          
               
                    CListCtrl::PreSubclassWindow();
              }
              Забыл добавить, написал только что и проверил. Все работает..
                Уважаемый, CasperJr. Спасибо! Но понемая сколь много для меня было сделано я все же извиняюсь за свою тупизну и хочу спросить.
                Ну вот есть у нас этот новый класс. Есть ListCtrl в ресурсах на диалоге. Есть связаная с ним переменная. И есть массив объектов некого класса MyRecord. В этом классе есть поле (пусть VarZirny) типа BOOL. Я перебираю все элементы массива, и в каком элементе VarZirny==TRUE, я отображаю строку этого элемент а жирным. Если FALSE то обычным. Мне для этого надо что? В CMyListCtrl добавить метод CMyListCtrl::SetFont(CFont) который изменяет
                protected:
                      CFont m_FontBold;
                поле? Да? И если VarZirny==TRUE, то вызывать MyListCtrl.SetFont(<Жирный>)? Так я понял? И в результате в моем ListCtrl будут как жирные строки так и обычные (в зависимости от элементов моего массива)?
                Я все правильно понял?
                  При заполении делай так:

                  ExpandedWrap disabled
                     int nItem = m_List.InsertItem(....);
                     if (MyRecord[i].VarZirny) m_List.SetItemData(nItem, 1) // веделять жирным
                      else m_List.SetItemData(nItem, 0) // не выделять жирным
                     ...
                     MyRecord[i] написал от руки, я не знаю как ты хранишь список MyRecord.
                     Сам добавишь...


                  ExpandedWrap disabled
                     ....
                     case CDDS_ITEMPREPAINT:
                            // pLV.dwItemSpec - номер item'а
                            if (Ctrl.GetItemData(pLV.dwItemSpec) == 1) // Нужно выделить строку жирным
                            {
                                SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold);
                                pLVCustomDraw->clrText = RGB(0, 0, 160);
                            }


                  Удачи
                    СПАСИБО!! CasperJr !
                    ГВОЗДИ БЫ ДЕЛАТЬ ИЗ ЭТИХ ЛЮДЕЙ!!!!!  
                    ;))))))))))))


                    Только сдесь вот так:
                    case CDDS_ITEMPREPAINT:
                           // pLV.dwItemSpec - номер item'а
                           if (GetItemData(pLV.dwItemSpec) == 1) // Здесь была ошибочка!!!!!
                           {
                               SelectObject(pLVCustomDraw->nmcd.hdc, m_FontBold);
                               pLVCustomDraw->clrText = RGB(0, 0, 160);
                           }

                    Это я для тех у кого та же проблема возникнет....
                    Еще раз спасибо!
                      ExpandedWrap disabled
                         [b]
                          ...
                          if ((int) GetItemData(pLV.dwItemSpec) == (int) 1) [/b]
                          ...


                      Ну забыл преобразование типов... От руки писал
                      Удачи всем !
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0415 ]   [ 16 queries used ]   [ Generated: 2.05.24, 10:34 GMT ]