На главную Наши проекты:
Журнал   ·   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
  
> Изменение цвета грида в лист контроле
    Как поменять цвет grid lines в лист контроле имеющем стиль LVS_EX_GRIDLINES?
      1. Переопределяешь класс CListCtrl.
      2. Добавляешь в него метод
      ExpandedWrap disabled
        afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);

      3. добавляешь в карту сообщений
      ExpandedWrap disabled
        ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

      4. описываешь сам метод
      ExpandedWrap disabled
        void CExtListCtrl ::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
        {
            LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
         
            if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
            {
                *pResult = CDRF_NOTIFYITEMDRAW;
            }
            else if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
            {
                *pResult = CDRF_NOTIFYSUBITEMDRAW;
            }
            else if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
            {
                COLORREF crText, crBkgnd;
                
                if ( 0 == lplvcd->iSubItem )
                {
                    crText = RGB(255,0,0);
                    crBkgnd = RGB(128,128,255);
                }
                else if ( 1 == lplvcd->iSubItem )
                {
                    crText = RGB(0,255,0);
                    crBkgnd = RGB(255,0,0);
                }
                else
                {
                    crText = RGB(128,128,255);
                    crBkgnd = RGB(0,0,0);
                }
         
                lplvcd->clrText = crText;
                lplvcd->clrTextBk = crBkgnd;
                *pResult = CDRF_DODEFAULT;
            }
        }


      Вот и все!

      з.ы. навсякий случай набросал тебе махонький проектик по этому поводу, смотри аттач.
      Прикреплённый файлПрикреплённый файлCustomList.rar (9.27 Кбайт, скачиваний: 164)
        Для смены цвета фона используешь метод:
        Цитата
        CListCtrl::SetBkColor

        BOOL SetBkColor(
        COLORREF cr
        );
        Parameters
        cr
        Background color to set, or the CLR_NONE value for no background color. List view controls with background colors redraw themselves significantly faster than those without background colors. For information, see COLORREF in the Platform SDK.
        Return Value
        Nonzero if successful; otherwise zero.

        Example
        // The pointer to my list view control.
        extern CListCtrl* pmyListCtrl;

        // Use the 3D button face color for the background.
        COLORREF crBkColor = ::GetSysColor(COLOR_3DFACE);
        pmyListCtrl->SetBkColor(crBkColor);
        ASSERT(pmyListCtrl->GetBkColor() == crBkColor);


        Для смены цвета фона под текстом используешь метод:
        Цитата
        CListCtrl::SetTextBkColor

        BOOL SetTextBkColor(
        COLORREF cr
        );
        Parameters
        cr
        A COLORREF specifying the new text background color. For information, see COLORREF in the Platform SDK.
        Return Value
        Nonzero if successful; otherwise zero.

        Example
        // The pointer to my list view control.
        extern CListCtrl* pmyListCtrl;

        // Use the 3D button face color for the text background.
        COLORREF crBkColor = ::GetSysColor(COLOR_3DFACE);
        pmyListCtrl->SetTextBkColor(crBkColor);
        ASSERT(pmyListCtrl->GetTextBkColor() == crBkColor);

        Для смены цвета текста используешь метод:
        Цитата
        CListCtrl::SetTextColor

        BOOL SetTextColor(
        COLORREF cr
        );
        Parameters
        cr
        A COLORREF specifying the new text color. For information, see COLORREF in the Platform SDK.
        Return Value
        Nonzero if successful; otherwise zero.

        Example
        // The pointer to my list view control.
        extern CListCtrl* pmyListCtrl;

        // Use the window text color for
        // the item text of the list view control.
        COLORREF crTextColor = ::GetSysColor(COLOR_WINDOWTEXT);
        pmyListCtrl->SetTextColor(crTextColor);
        ASSERT(pmyListCtrl->GetTextColor() == crTextColor);
        :D
        Если, что-то другое то как предлагает ViGOur,
        Сообщение отредактировано: IEZ -
          IEZ, ты забыл сказать, что это для VC 7! ;)
            ViGOur, Конечно может ты и прав. Но меня все же терзают смутные сомнения о правильности твоих утверждений. :D
            Но в крайнем случае Explorer, может воспользоваться аналогичными макросами, которые уж точно были
            в VC 6. А именно:
            Цитата
            ListView_SetBkColor Macro

            --------------------------------------------------------------------------------

            Sets the background color of a list-view control. You can use this macro or send the LVM_SETBKCOLOR message explicitly.

            Syntax

            BOOL ListView_SetBkColor(
            HWND hwnd,
            COLORREF clrBk
            );

            Parameters

            hwnd
            Handle to the list-view control.
            clrBk
            Background color to set or the CLR_NONE value for no background color. List-view controls with background colors redraw themselves significantly faster than those without background colors.
            Return Value

            Returns TRUE if successful, or FALSE otherwise.



            Цитата
            ListView_SetTextBkColor Macro

            --------------------------------------------------------------------------------

            Sets the background color of text in a list-view control. You can use this macro or send the LVM_SETTEXTBKCOLOR message explicitly.

            Syntax

            BOOL ListView_SetTextBkColor(
            HWND hwnd,
            COLORREF clrText
            );

            Parameters

            hwnd
            Handle to the list-view control.
            clrText
            New text background color. This can be CLR_NONE for no background color.
            Return Value

            Returns TRUE if successful, or FALSE otherwise.



            Цитата
            ListView_SetTextColor Macro

            --------------------------------------------------------------------------------

            Sets the text color of a list-view control. You can use this macro or send the LVM_SETTEXTCOLOR message explicitly.

            Syntax

            BOOL ListView_SetTextColor(
            HWND hwnd,
            COLORREF clrText
            );

            Parameters

            hwnd
            Handle to the list-view control.
            clrText
            New text color.
            Return Value

            Returns TRUE if successful, or FALSE otherwise.

            :tong: :D

            P.S. Хотя методы указанные в посте №3, по моему были в VS 6.
            Сообщение отредактировано: IEZ -
              Я уже как-то проверял эти методы!
              Пытался перенести на VC 6 макросы и тд., все отрабатывало замечательно, но цветов не было.
              Вполне вероятно что дело конечно в кривых руках :whistle: :) .
              Но помнится я в конце концов плюнул на эти методы и стал использовать NM_CUSTOMDRAW.

              p.s.
              Цитата
              Microsoft Windows CE 3.0
              ListView_SetTextColor

              :)
                ViGOur, Я их так пользовал и все работало:

                ExpandedWrap disabled
                  void CМойКласс::OnTextColor()
                  {
                      CColorDialog clrDlg;
                      static COLORREF rgbResult;
                      static COLORREF rgbCust;
                   
                      INT iReturn=0;
                   
                      memset(&rgbResult, '\0', sizeof(COLORREF));
                      rgbResult=RGB(0, 128, 192);
                      memset(&rgbCust, '\0', sizeof(COLORREF));
                   
                      clrDlg.m_cc.lStructSize=sizeof(clrDlg.m_cc);
                      clrDlg.m_cc.rgbResult=rgbResult;
                      clrDlg.m_cc.lpCustColors=&rgbCust;
                      clrDlg.m_cc.Flags=CC_ENABLEHOOK | CC_FULLOPEN | CC_RGBINIT;
                   
                      if(clrDlg.DoModal()==IDOK)
                      {
                          memset(&rgbCust, '\0', sizeof(COLORREF));
                          rgbCust=clrDlg.GetColor();
                   
                          m_wndListCtrl.SetTextColor(rgbCust);
                          m_wndListCtrl.RedrawWindow();
                      }
                  }
                   
                  void CМойКласс::OnBkColor()
                  {
                      CColorDialog clrDlg;
                      static COLORREF rgbResult;
                      static COLORREF rgbCust;
                   
                      INT iReturn=0;
                   
                      memset(&rgbResult, '\0', sizeof(COLORREF));
                      rgbResult=RGB(0, 128, 192);
                      memset(&rgbCust, '\0', sizeof(COLORREF));
                   
                      clrDlg.m_cc.lStructSize=sizeof(clrDlg.m_cc);
                      clrDlg.m_cc.rgbResult=rgbResult;
                      clrDlg.m_cc.lpCustColors=&rgbCust;
                      clrDlg.m_cc.Flags=CC_ENABLEHOOK | CC_FULLOPEN | CC_RGBINIT;
                   
                      if(clrDlg.DoModal()==IDOK)
                      {
                          memset(&rgbCust, '\0', sizeof(COLORREF));
                          rgbCust=clrDlg.GetColor();
                   
                          m_wndListCtrl.SetBkColor(rgbCust);      
                          m_wndListCtrl.SetTextBkColor(rgbCust);
                          m_wndListCtrl.RedrawWindow();
                      }
                  }

                Эти изменения выполняются из меню, вызывается цветовой диалог и там пользователь выбирает цвет текста и фона
                в зависимости от выбора пользователя. :D
                Сообщение отредактировано: IEZ -
                  Вот держи контрол, который я сабклассил, там все ясно и понятно, есть метоод SetStripesColor, чтоб задать звет полосок фона листа...
                  Прикреплённый файлПрикреплённый файлCtrls.rar (5.07 Кбайт, скачиваний: 168)
                    ViGOur, IEZ, Metatron, спасибо за обсуждение и примеры, но вопрос был именно о цвете линий, которые рисуются стилем LVS_EX_GRIDLINES. С цветами бэкграунда и текста айтемов у меня проблем не было
                      Тогда OwnerDraw нужно делать для твоего CListXtrl... :)
                        С OWNERDRAW понятно: отменяем стиль LVS_EX_GRIDLINES и добросовестно обводим каждый subitem прямоугольником нужного цвета :D
                          Зачем же отменять стиль LVS_EX_GRIDLINES!?
                          Он тебе понадобится, а именно в методе перерисовки думаю должно быть что-то типа:
                          ExpandedWrap disabled
                            DWORD dwStyle = GetExtendedStyle();
                            if(dwStyle & LVS_EX_GRIDLINES)
                            {
                               // Добросовестно обводим каждый item и(или) subitem прямоугольником нужного цвета
                            }


                          Да и как ты наверное заметил, сос стилем LVS_EX_GRIDLINES, сетка рисуется и для тех итемов, которых еще нет.
                          А именно для всей видимой области... ;)
                            Всем привет! Так что получилось поменять именно цвет линий? У меня они по умолчанию рисуются белым. Менять цвет фона на другой (не белый) цвет выглядит убого. Пишут переопределить CUSTOMDRAW, но я не знаю что именно там надо написать (
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0374 ]   [ 17 queries used ]   [ Generated: 18.04.24, 22:57 GMT ]