Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 05.03.2019, 10:52   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 81
Репутация: 10
По умолчанию Не перерисовываются линии в CListCtrl

Я создал класс ClistCtrlEx2, который является потомком класса CListCtrl.
В этом классе я переопределил метод OnPaint--в нём рисуются только вертикальные линии в таблице:

Код:
void CListCtrlEx2::OnPaint()
{
    int  i, n, m, nItem;
    RECT  rect;

    const MSG *msg = GetCurrentMessage();
    DefWindowProc(msg->message,msg->wParam,msg->lParam);
    if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
    {
        CClientDC  dc(this);
        dc.SetDCBrushColor(RGB(255,0,0));
        CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
        int  nColumnCount = pHeader->GetItemCount();
        RECT  rect;
        pHeader->GetClientRect(&rect);
        int  top = rect.bottom;
        GetClientRect(&rect);
        int  borderx = 0 - GetScrollPos(SB_HORZ);
        for (int i=0; i<nColumnCount; i++)
        {
            borderx += GetColumnWidth(i);
            if (borderx>=rect.right)  break;
            dc.MoveTo(borderx-1,top);
            dc.LineTo(borderx-1,rect.bottom);
        }
        if (!GetItemRect(0,&rect,LVIR_BOUNDS))
            return;
        int  height = rect.bottom - rect.top;
        GetClientRect(&rect);
        int  width = rect.right;
    } 
    //CListCtrl::OnPaint();
}

Также в этом классе есть поле flagsVector, являющееся вектором (динамическим массивом) типа int (то есть std::vector<int> flagsvector), элементы которого имеют значения 0 или 1.
Есть и функция setFlagsVector, которая устанавливает значения элементов этого вектора:

Код:
void  CListCtrlEx2::setFlagsVector(vector<int> flagsVector)
{
    this->flagsVector = flagsVector;
}

Есть также функция PaintLines, которая рисует вертикальные линии всегда и горизонтальные линии в зависимости от того, чему равно значение соответствующего элемента в векторе flagsVector--если значение элемента вектора равно 0, то горизонтальная линия рисуется, если же она равна 1, то горизонтальная линия не рисуется:

Код:
void CListCtrlEx2::PaintLines()
{
    int  i, n, m, nItem;
    RECT  rect;

    const MSG *msg = GetCurrentMessage();
    DefWindowProc(msg->message,msg->wParam,msg->lParam);
    if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
    {
        CClientDC  dc(this);
        dc.SetDCBrushColor(RGB(255,0,0));
        CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
        int  nColumnCount = pHeader->GetItemCount();
        RECT  rect;
        pHeader->GetClientRect(&rect);
        int  top = rect.bottom;
        GetClientRect(&rect);
        int  borderx = 0 - GetScrollPos(SB_HORZ);
        for (int i=0; i<nColumnCount; i++)
        {
            borderx += GetColumnWidth(i);
            if (borderx>=rect.right)  break;
            dc.MoveTo(borderx-1,top);
            dc.LineTo(borderx-1,rect.bottom);
        }
        if (!GetItemRect(0,&rect,LVIR_BOUNDS))
            return;
        int  height = rect.bottom - rect.top;
        GetClientRect(&rect);
        int  width = rect.right;
        m = flagsVector.size();
        if (m==0)
        {
            for (int i=1; i<=GetCountPerPage();i++)
            {
            dc.MoveTo(0,top+height*i);
            dc.LineTo(width,top+height*i);
                }
        }
        else
        {
            for (int i=1; i<=GetCountPerPage();i++)
            {
                if (i<=m)
                            // если i не превышает m--число элементов в векторе flagsVector
                {
                if ((int)(flagsVector.at(i-1))==0)
                {
                    dc.MoveTo(0,top+height*i);
                        dc.LineTo(width,top+height*i);
                    }
                }
                else
                            // если i больше m, то рисуется горизонтальная линия без всяких условий
                {
                dc.MoveTo(0,top+height*i);
                    dc.LineTo(width,top+height*i);
                }
            }
        }
    } 
    //CListCtrl::OnPaint();
}

В вызывающей функции код выглядит так:

Код:
m_IDC_LIST1.setFlagsVector(flagsVector);
m_IDC_LIST1.PaintLines();
m_IDC_LIST1.UpdateWindow();
m_IDC_LIST1.RedrawWindow();

Но в программе почему-то не происходит перерисовка линий в этом m_IDC_LIST1 (типа CListCtrlEx2)--в таблице рисуются только вертикальные линии, а горизонтальные линии не рисуются. В чём причина этого? Как сделать так, чтобы работала перерисовка линий в CListCtrlEx2 ?
erslgoeirjh вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть макет photoshop psd, на нем линии(разметка). Как узнать, сколько пиксилей до сторон(от указанной линии)? Gefo HTML и CSS 1 17.01.2013 07:54
MFC, CListCtrl и Колбэки psycho-coder Visual C++ 2 13.01.2013 16:43
Получение указателя на CListCtrl Kh_Shad Visual C++ 13 22.10.2011 17:57
Иногда не перерисовываются Label'ы bro Компоненты Delphi 2 16.12.2010 15:32
Delphi: не перерисовываются окна. chaostalker Помощь студентам 4 20.01.2010 10:19


22:28.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.