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


Автор: Nikkiforum 27.2.2006, 11:59
Вообщем у меня есть Tab Control, и CPage1, CPage2, CPage3 - его закладки. На первой закладке размещаю кнопку и пытаюсь при нажатии на неё нарисовать елипс - не получается!
void CPage1::OnButton2()
{
// TODO: Add your control notification handler code here
CBrush CirclePoint(RGB(0, 50, 250));
CPen LineForPoint(PS_SOLID,0,RGB(255, 0, 0));
CPaintDC dc(this);
CDC memDC1;
memDC1.CreateCompatibleDC(&dc);
CBitmap bm1;
bm1.CreateCompatibleBitmap(&dc, 1000, 1000);
memDC1.SelectObject(&bm1);
memDC1.SelectObject(&LineForPoint);
memDC1.SelectObject(&CirclePoint);
memDC1.Ellipse(0, 0,1000, 1000);
dc.BitBlt(0, 0, 1000, 1000, &memDC1, 0, 0, SRCCOPY);
this->InvalidateRect(CRect(0, 0, 1000, 1000), FALSE); // îáíîâëåíèå ýêðàíà
}
Не могу понять почему? smile

Автор: Coocky 27.2.2006, 12:03
Nikkiforum,
рисовать нужно в методе OnPaint() ообщения WM_PAINT для CPage1
Добавлено @ 12:07
Код

void CPage1::OnPaint() 
{
CPaintDC dc(this);
CDC memDC1;
memDC1.CreateCompatibleDC(&dc);
CBitmap bm1;
bm1.CreateCompatibleBitmap(&dc, 1000, 1000);
memDC1.SelectObject(&bm1);
memDC1.SelectObject(&LineForPoint);
memDC1.SelectObject(&CirclePoint);
memDC1.Ellipse(0, 0,1000, 1000);
dc.BitBlt(0, 0, 1000, 1000, &memDC1, 0, 0, SRCCOPY);
}


void CPage1::OnButton2() 
{

InvalidateRect(CRect(0, 0, 1000, 1000), FALSE); 

}




Добавлено @ 12:08
Типа так. Правильность кода не гарантирую, так как содрал с твоего кода.. smile

Автор: Nikkiforum 27.2.2006, 12:20
Ура - получилось! Но не могу понять почему надо обязательно рисовать в методе OnPaint() ообщения WM_PAINT для CPage1, например, когда я точно так же делал для главного окна моей программы то всё нормально работало, а для окна вкладки - не работает! - почему?

Автор: Coocky 27.2.2006, 12:35
Цитата(Nikkiforum @ 27.2.2006, 12:20 Найти цитируемый пост)
Но не могу понять почему надо обязательно рисовать в методе OnPaint() ообщения WM_PAINT для CPage1, например, когда я точно так же делал для главного окна моей программы то всё нормально работало, а для окна вкладки - не работает! - почему?

Сообщение WM_PAINT приходит каждый раз, когда окно требует перерисовки (ты его сворачиваешьБ перекрываешь другим окном и т.д.). Твой метод InvalidateRect(CRect(0, 0, 1000, 1000), FALSE); заставляет принудительно перерисовать окно-т.е. вызвать OnPaint()
Добавлено @ 12:37
Цитата

, например, когда я точно так же делал для главного окна моей программы то всё нормально работало


Это не имеет значение, для какого окна-просто любой Invalidate() вызывает OnPaint()
и если WM_PAINT не ловится, тогда ничего не перерисуется

Автор: Nikkiforum 27.2.2006, 12:38
Но почему для главного окна такой способ работает!!!

Автор: Coocky 27.2.2006, 12:43
Цитата(Nikkiforum @ 27.2.2006, 12:38 Найти цитируемый пост)
Но почему для главного окна такой способ работает!!!

Какой? smile
Добавлено @ 12:44
Код покажи... smile Для главного окна smile

Автор: Nikkiforum 27.2.2006, 13:11
Примерно в таком стиле:
CDC p1memDC1;
void CPage1::OnButton2()
{
// TODO: Add your control notification handler code here
p1memDC1.Ellipse(0, 0,1000, 1000);
this->InvalidateRect(CRect(0, 0, 1000, 1000), FALSE); // îáíîâëåíèå ýêðàíà
}

void CPage1::OnPaint()
{
CPaintDC dc(this); // device context for painting

CBrush CirclePoint(RGB(0, 50, 250));
CPen LineForPoint(PS_SOLID,0,RGB(255, 0, 0));
p1memDC1.CreateCompatibleDC(&dc);
CBitmap bm1;
bm1.CreateCompatibleBitmap(&dc, 1000, 1000);
p1memDC1.SelectObject(&bm1);
p1memDC1.SelectObject(&LineForPoint);
p1memDC1.SelectObject(&CirclePoint);
dc.BitBlt(0, 0, 1000, 1000, &p1memDC1, 0, 0, SRCCOPY);

// TODO: Add your message handler code here

// Do not call CDialog::OnPaint() for painting messages
}

Автор: Coocky 27.2.2006, 13:14
Nikkiforum, ну и? smile
У тебя ж есть void CPage1::OnPaint() ?
Там и рисуется
А в начальном коде не было, поэтому при InvalidateRect(CRect(0, 0, 1000, 1000), FALSE); перерисовывалось неизвестно что..


Автор: Nikkiforum 27.2.2006, 13:19
Да так проблема в том что этот код не работает, хотя для главного окна аналогичный код впорядке! Наверно я где-то глючу smile

Автор: Coocky 27.2.2006, 13:29
Не знаю..
Я тебе написал, как правильно рисовать.. smile Так и делай..

Автор: Nikkiforum 27.2.2006, 13:50
Спасибо за советы smile

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