Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 15.07.2010, 22:52   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Печаль Удаление рисунка

Всем привет!
Вот есть простенький код рисования (MFC):

void CkkkvvvaaaDlg::OnBnClickedButton1()
{
CClientDC dc(this);
CPen p(0,2,RGB(255,0,0));
CBrush b(RGB(0,255,0));
dc.SelectObject(p);
dc.SelectObject(b);
dc.Rectangle(10,10,500,500);
}
но почемуто если этот зелёный квадрат перекрыть другим окном то перекрытая часть удалится. (если перекрыть полностью - то и удалится полностью). Как этого избежать?
(Offline)
 
Ответить с цитированием
Старый 15.07.2010, 23:10   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Удаление рисунка

ээээ... а ты дописал необходимое в обработчик события WM_PAINT?
прога должна знать, откуда ей брать информацию, после того как часть окна бала стёрта вышележащим.

апд
почитай для начал Скисова, если так хочешь МФЦ. Про кодогенераторы забудь навремя - чего не понимают, тем не владеют (с)Гёте
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
den (16.07.2010), Dream (15.07.2010), is.SarCasm (15.07.2010), pax (16.07.2010)
Старый 16.07.2010, 00:18   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

а ты дописал необходимое в обработчик события WM_PAINT?
Ну я вот дописал етот код в конец PAINT, квадрат не стирается, но он рисуется сразу, а мне надо шоб по нажатию кнопки ( void CkkkvvvaaaDlg::OnBnClickedButton1() ). Пытался завести глобальную переменую = 0 . Если нажимаем на кнопку то 1. Если 1 то рисуем квадрат. Но чтото он не рисуется. Как быть?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:25   #4
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Удаление рисунка

Но чтото он не рисуется.
ну значит чтото надо поправить в коде
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:34   #5
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

ну значит чтото надо поправить в коде
А что?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:35   #6
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Удаление рисунка

ты пропускаешь реализацию за терминами "что-то", а телепаты в отпуску..
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:53   #7
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

POINT a={10,10},b={510,10},c={510,510},d={10,510},ad;
void CkvadratDlg::OnBnClickedButton1()
{
	CClientDC dc(this);
	CPen p(0,2,RGB(255,0,0));
	dc.SelectObject(p);
	for(int i=0;i<7;i++)
	{
	Sleep(100);
	dc.MoveTo(a);
	dc.LineTo(b);
	dc.LineTo(c);
	dc.LineTo(d);
	dc.LineTo(a);
	ad=a;
	a.x=(a.x+b.x)/2;
	a.y=(a.y+b.y)/2;
	b.x=(b.x+c.x)/2;
	b.y=(b.y+c.y)/2;
	c.x=(c.x+d.x)/2;
	c.y=(c.y+d.y)/2;
	d.x=(d.x+ad.x)/2;
	d.y=(d.y+ad.y)/2;
	}
}
вот код (MFC).
Когда всё дорисуется, если рисунок закрыть другим окном, то та закрытая часть сотрётся. Что делать?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:54   #8
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Удаление рисунка

надо дописать необходимое в обработчик события WM_PAINT
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 00:59   #9
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

WM_PAINT
Вот сюды чтоли?
void CkvadratDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 01:02   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Удаление рисунка

WM_PAINT отрисовывает текущий контент. Введи переменную - флаг, означающую нажатие кнопки, а дальше так:
bool buttonPressed false;
POINT a={10,10},b={510,10},c={510,510},d={10,510},ad;

void CkvadratDlg::OnBnClickedButton1()
{
   
buttonPressed = !buttonPressed;
}

...

case 
WM_PAINT:
if (
buttonPressed)
{
    
CClientDC dc(this);
    
CPen p(0,2,RGB(255,0,0));
    
dc.SelectObject(p);
    for(
int i=0;i<7;i++)
    {
    
Sleep(100);
    
dc.MoveTo(a);
    
dc.LineTo(b);
    
dc.LineTo(c);
    
dc.LineTo(d);
    
dc.LineTo(a);
    
ad=a;
    
a.x=(a.x+b.x)/2;
    
a.y=(a.y+b.y)/2;
    
b.x=(b.x+c.x)/2;
    
b.y=(b.y+c.y)/2;
    
c.x=(c.x+d.x)/2;
    
c.y=(c.y+d.y)/2;
    
d.x=(d.x+ad.x)/2;
    
d.y=(d.y+ad.y)/2;
    }

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (16.07.2010)
Старый 16.07.2010, 01:02   #11
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Удаление рисунка

да. здесь заведи реацию на флаг.
флаг поднимай при нажатии кнопки.
если флаг поднят, то рисуешь что-то там из поста №7
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 01:14   #12
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

Всё бы ничего, да в MFC нет даже строчки case WM_PAINT:
Есть только функция OnPaint().
Можно конешно добавить код из поста №7 туда, но в коде из поста №7 можно увидеть строчку Sleep(100); . Это получается что каждый раз при отресовки окна, прога будет "спать" 100*7 = 700 милесикунд !
Как быть при этом?
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 01:18   #13
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Удаление рисунка

Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 01:22   #14
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.
Придется.
----------------------
А вот если отказатся от Sleep(100); да ещё в функции обработки кнопки написать this->OnPaint(); то тогда всё фурычит!
(Offline)
 
Ответить с цитированием
Старый 16.07.2010, 01:56   #15
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Удаление рисунка

А вот что я придумал, но незнаю как сделать:
При каждом нажатии на кнопку выполнять код рисования, а сам рисунок CClientDC dc(this); сохранить как нибуть в переменую какую нибуть графическую. А потом в WM_PAINT (OnPain) просто отрисовывать эту переменую.
Вот что я не могу сделать:
1) как CClientDC dc сохранить в какую нибуть графическую переменую.
2) как нарисивать данную переменую.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 04:52.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com