Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подскажите как рисовать в диалоговом окне при нажатии клавиши.

4.8K
03 марта 2004 года
disorder
17 / / 17.02.2004
Понимаю, что вопрос очень примитивный, но я только начал изучать 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???

Заранее благодарен!
527
03 марта 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by disorder
Понимаю, что вопрос очень примитивный, но я только начал изучать 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/
Только не всегда удобно рисовать прямо в окне -- график может выйти за пределы

4.8K
04 марта 2004 года
disorder
17 / / 17.02.2004
Огромное спасибо.:)
319
04 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by disorder
Огромное спасибо.:)


Теперь перекрой график другим окном, а потом убери второе окно, и посмотри что получится :):)

2.1K
09 марта 2004 года
cozy
69 / / 11.01.2004
Цитата:
Originally posted by xelos

Теперь перекрой график другим окном, а потом убери второе окно, и посмотри что получится :):)


Во-во! ;)
Просто надо в обработцике кнопки каждый раз вызывать функцию Invalidate()
Она как раз перерисовывает окно.

Так что:

void CPetlDlg::OnBnClickedDrawbutton()
{
CClientDC dc(this);
...
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
Invalidate();
}

4.8K
10 марта 2004 года
disorder
17 / / 17.02.2004
Цитата:
Originally posted by cozy

Во-во! ;)
Просто надо в обработцике кнопки каждый раз вызывать функцию Invalidate()
Она как раз перерисовывает окно.

Так что:

void CPetlDlg::OnBnClickedDrawbutton()
{
CClientDC dc(this);
...
dc.Ellipse(i*2-1,y*50+299,i*2+1,y*50+301);
Invalidate();
}



Спасибо.
Учиться, учится и еще раз учиться!!! :)

319
10 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by disorder


Спасибо.
Учиться, учится и еще раз учиться!!! :)


ИМХО, грамотней будет создать контекст уствройства, на котором рисуешь в памяти. рисовать в этом виртуальном контексте а в OnPaint поставить копирование виртуального контекста в реальный. Где-то это уже было здесь на форуме.

527
11 марта 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by xelos

ИМХО, грамотней будет создать контекст уствройства, на котором рисуешь в памяти. рисовать в этом виртуальном контексте а в OnPaint поставить копирование виртуального контекста в реальный. Где-то это уже было здесь на форуме.


В данном случае это бессмысленно, так как это все равно не уменьшит flicking эффект. А в samples для Visual C это вообще везде бездарно сделано. Для диалогов я делаю так:
Сначала создаю класс от CWnd, создаю внутри него буфферное изображение в bitmap, переписываю OnEraseBackground, чтобы возвращала TRUE, в обработчике OnPaint просто отображаю bitmap, в котором рисую при любых событиях и вызываю функцию Invalidate(FALSE) (не стирая содержимого окна)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог