Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Ребятушки выручайте надо CSplitterWnd раскрасить


Автор: Torrero20 22.5.2006, 12:37
В общем в проге на Visual С++ главное окно разбито на 4 фрейма 3 мя сплиттерами (CSplitterWnd ) между этими фреймами остаються небольшие полоски вот их то и надо перекрасить....
Я его и так и эдак..... Создал дочерний класс, FillRect - ю весь Сплиттер в OnPaint e . Он конечно Эрэктиться smile но вместе с полосками ещё закрашиваються части окон по не понятному мне закону..... 
ВоД коД создания сплиттера в OnCreateClient MainWindow:

Код

m_Splitter.CreateStatic(this,1,2);

m_Splitter3.CreateStatic(&m_Splitter,2,1,WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE ,m_Splitter.IdFromRowCol(0,1));

m_Splitter2.CreateStatic(&m_Splitter,2,1, WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE,m_Splitter.IdFromRowCol(0,0));

m_Splitter2.CreateView(0,0,RUNTIME_CLASS(CTreeSearchView),CSize(500,400),pContext);
m_Splitter2.CreateView(1,0,RUNTIME_CLASS(CPreview),CSize(500,200),pContext);

m_Splitter3.CreateView(0,0,RUNTIME_CLASS(CFolderView),CSize(500,400),pContext);
m_Splitter3.CreateView(1,0,RUNTIME_CLASS(CReady),CSize(500,200),pContext);


А вот код раскраски в дочернем классе: (MySplitter производный от CSplitterWnd)

Код

void MySplitter::OnPaint()
{        
    CRect rect;
    CDC* pDC;
    pDC = GetWindowDC();
    CBrush newBr( RGB(255,0,0) );    
    GetWindowRect(&rect);        
    pDC->FillRect(&rect, &newBr);    
    
    CWnd::OnPaint();
}


ПомогЫыте! Плз....  

Автор: Earnest 22.5.2006, 14:21
Не надо переопределять OnPaint. Сначала хоть бы посмотрел на родную реализацию...
Переопредели OnDrawSplitter (это виртуальная функция). Но сначала разберись в ней. Навскидку, тебе нужно сначала вызвать родную версию, а потом зарисовать серединку нужным цветом. Но не всегда, а только в тех случаях, когда управление попадает на последнюю строку "родной" версии. Т.е. не в случае splitBorder.
 

Автор: Torrero20 22.5.2006, 16:48
Почти всё круто... покрасил splitBar - спасибо smile ... Но в основном мне надо перекрасить splitBar + splitBorder. В общем и по краям тоже надо. Что бы вообще не было рамки и этой пресловутой тени и как бы вдавленности фреймов. 

Если ставлю обрабатываться и splitBorder... все нормально если не начинаешь предвигать сплиттер. Вот тут то и начинаеться непонятная закраска почти всех фремов полностью. Такая же чушь и с OnPaint ом была всё красилось, но если передвинешь....приплыли :-) !
 Может не правильно крашу воД коТ:
Код

void MySplitter::OnDrawSplitter (CDC *pDC,ESplitType nType,const CRect &rect)
{
    CSplitterWnd::OnDrawSplitter(pDC,nType,rect);
        
    if (nType == ESplitType::splitBar || nType == ESplitType::splitBorder )
    {
        CBrush br(RGB(255,255,255));    
        if (pDC )
            pDC->FillRect(&rect,&br);        
    }
}

<< -- Вот так корректно не работает, в чём тута дело??? 

Автор: Earnest 22.5.2006, 17:51
Если splitBorder, то просто сразу return (без вызова базового метода). Именно там 3D рамки рисуются.
Ну код-то посмотри как следует. Этот OnDrawSplitter из нескольких мест вызывается, иногда с довольно большими прямоугольниками. 

Автор: Torrero20 23.5.2006, 13:57
Пасибуськи большушие ! Всё помогло smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)