Закраска фона CWnd
От: Brun  
Дата: 22.08.06 07:12
Оценка:
Создал своё класс окошка на котором создаю COM врапер (визуальный компонент) сам компонент перерисовывается, а вот фон моего окошка нет, не знаю как с этим бороться, но наверное есть какой то совсем простой способ


Создание компонента:
CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    AfxEnableControlContainer();
    m_mapCtrl.Create( NULL, NULL, WS_CHILD|WS_OVERLAPPED|WS_VISIBLE, CRect( 0,0, 0, 0), this, 0 );

        return 0;
}


Создание окошка:
BOOL CMyWnd::CreateMap( CWnd* pWnd, const CRect& rect)
{
    return this->CreateEx( NULL, NULL, " ", WS_POPUP | WS_CHILD | WS_BORDER | WS_THICKFRAME | WS_VISIBLE, rect, pWnd, 0);
}


А теперь как я пытаюсь закрашивать фон:
void CMyWnd::OnPaint()
{
    CBrush backBrush(RGB(0, 128, 128));

    CRect rect;
    GetUpdateRect( &rect, true );

    CPaintDC dc(this);

    dc.FillRect( &rect, &backBrush );
}


Фон то так закрашивается, но есть одна проблема: если необходимо часто очищать фон (у меня прописана процедура ресайзинга окна с изменением размера компонента) то видно мерцание.... я пытался сделать через Rng но тут вообще ничего не получается, т.к. GetUpdateRng выдаёт ERROR_RNG...

ну конечно можно вычислять фрагмент который занимает компонент и его вычитать, но это тупо и если компонентов много вообще плохо

плиз, если кто знает, подскажите как сделать грамотную перерисовку фона
Re: Закраска фона CWnd
От: Master Yoda Великобритания  
Дата: 22.08.06 07:38
Оценка:
Здравствуйте, Brun, Вы писали:

B>Фон то так закрашивается, но есть одна проблема: если необходимо часто очищать фон (у меня прописана процедура ресайзинга окна с изменением размера компонента) то видно мерцание


BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    ON_WM_ERASEBKGND(OnEraseBkgnd)
END_MESSAGE_MAP()

BOOL CMyWnd::OnEraseBkgnd(CDC* pDC) {
    return TRUE;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Закраска фона CWnd
От: Brun  
Дата: 23.08.06 12:22
Оценка:
Здравствуйте, Master Yoda, Вы писали:

MY>Здравствуйте, Brun, Вы писали:


B>>Фон то так закрашивается, но есть одна проблема: если необходимо часто очищать фон (у меня прописана процедура ресайзинга окна с изменением размера компонента) то видно мерцание


MY>
MY>BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
MY>    ON_WM_ERASEBKGND(OnEraseBkgnd)
MY>END_MESSAGE_MAP()

MY>BOOL CMyWnd::OnEraseBkgnd(CDC* pDC) {
MY>    return TRUE;
MY>}
MY>


неа, не катит, всё то же, окно не закрашивается...
Re: Закраска фона CWnd
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 23.08.06 12:43
Оценка:
Здравствуйте, Brun, Вы писали:

B>Фон то так закрашивается, но есть одна проблема: если необходимо часто очищать фон (у меня прописана процедура ресайзинга окна с изменением размера компонента) то видно мерцание.... я пытался сделать через Rng но тут вообще ничего не получается, т.к. GetUpdateRng выдаёт ERROR_RNG...


flicker free drawing In MFC
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Закраска фона CWnd
От: Brun  
Дата: 25.08.06 12:06
Оценка:
- Доктор, меня не понимают?
— О чем вы говорите?



мне не нужно эфективно буферизовать и рисовать на CWnd мне просто нужен простой способ закрасить его не трогая территорию своих компонентов так как делает финда и например класс CDialog
Re[3]: Закраска фона CWnd
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 25.08.06 12:10
Оценка:
Здравствуйте, Brun, Вы писали:

B>мне не нужно эфективно буферизовать и рисовать на CWnd мне просто нужен простой способ закрасить его не трогая территорию своих компонентов так как делает финда и например класс CDialog


В диалогах обычно используют стиль WS_CLIPCHILDREN:

Excludes the area occupied by child windows when you draw within the parent window. Used when you create the parent window.

[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.