Подскажите как рисовать в диалоговом окне при нажатии клавиши.
Чтобы нарисовать синусоиду при нажатии клавиши я использую обработчик события:
void CPetlDlg::OnBnClickedDrawbutton()
{
CPaintDC dc(this);
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&pen);
dc.MoveTo(0,300);
dc.LineTo(600,300);
dc.MoveTo(300,0);
dc.LineTo(300,600);
double y;
for(double i=0;i<300;i+=0.01)
{
y = sin ( (i-150)/3.1415926 );
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
}
}
При этом ничего не происходит. Если вставить этот код в OnPaint(), то все получается. Но мне хочется чтобы синусоида рисовалась при нажатии кнопки. Неужели рисовать можно только в OnPaint???
Заранее благодарен!
Понимаю, что вопрос очень примитивный, но я только начал изучать Visual C++ и столкнулся с такой проблемой:
Чтобы нарисовать синусоиду при нажатии клавиши я использую обработчик события:
void CPetlDlg::OnBnClickedDrawbutton()
{
CPaintDC dc(this);
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&pen);
dc.MoveTo(0,300);
dc.LineTo(600,300);
dc.MoveTo(300,0);
dc.LineTo(300,600);
double y;
for(double i=0;i<300;i+=0.01)
{
y = sin ( (i-150)/3.1415926 );
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
}
}
При этом ничего не происходит. Если вставить этот код в OnPaint(), то все получается. Но мне хочется чтобы синусоида рисовалась при нажатии кнопки. Неужели рисовать можно только в OnPaint???
Заранее благодарен!
Писать надо не CPaintDC, а CClientDC/
Только не всегда удобно рисовать прямо в окне -- график может выйти за пределы
Огромное спасибо.:)
Теперь перекрой график другим окном, а потом убери второе окно, и посмотри что получится :):)
Теперь перекрой график другим окном, а потом убери второе окно, и посмотри что получится :):)
Во-во! ;)
Просто надо в обработцике кнопки каждый раз вызывать функцию Invalidate()
Она как раз перерисовывает окно.
Так что:
void CPetlDlg::OnBnClickedDrawbutton()
{
CClientDC dc(this);
...
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
Invalidate();
}
Во-во! ;)
Просто надо в обработцике кнопки каждый раз вызывать функцию Invalidate()
Она как раз перерисовывает окно.
Так что:
void CPetlDlg::OnBnClickedDrawbutton()
{
CClientDC dc(this);
...
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
Invalidate();
}
Спасибо.
Учиться, учится и еще раз учиться!!! :)
Спасибо.
Учиться, учится и еще раз учиться!!! :)
ИМХО, грамотней будет создать контекст уствройства, на котором рисуешь в памяти. рисовать в этом виртуальном контексте а в OnPaint поставить копирование виртуального контекста в реальный. Где-то это уже было здесь на форуме.
ИМХО, грамотней будет создать контекст уствройства, на котором рисуешь в памяти. рисовать в этом виртуальном контексте а в OnPaint поставить копирование виртуального контекста в реальный. Где-то это уже было здесь на форуме.
В данном случае это бессмысленно, так как это все равно не уменьшит flicking эффект. А в samples для Visual C это вообще везде бездарно сделано. Для диалогов я делаю так:
Сначала создаю класс от CWnd, создаю внутри него буфферное изображение в bitmap, переписываю OnEraseBackground, чтобы возвращала TRUE, в обработчике OnPaint просто отображаю bitmap, в котором рисую при любых событиях и вызываю функцию Invalidate(FALSE) (не стирая содержимого окна)