|
15.07.2010, 22:52
|
#1
|
Дэвелопер
Регистрация: 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
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Удаление рисунка
ээээ... а ты дописал необходимое в обработчик события WM_PAINT?
прога должна знать, откуда ей брать информацию, после того как часть окна бала стёрта вышележащим.
апд
почитай для начал Скисова, если так хочешь МФЦ. Про кодогенераторы забудь навремя - чего не понимают, тем не владеют (с)Гёте
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
16.07.2010, 00:18
|
#3
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Удаление рисунка
а ты дописал необходимое в обработчик события WM_PAINT?
|
Ну я вот дописал етот код в конец PAINT, квадрат не стирается, но он рисуется сразу, а мне надо шоб по нажатию кнопки ( void CkkkvvvaaaDlg::OnBnClickedButton1() ). Пытался завести глобальную переменую = 0 . Если нажимаем на кнопку то 1. Если 1 то рисуем квадрат. Но чтото он не рисуется. Как быть?
|
(Offline)
|
|
16.07.2010, 00:25
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Удаление рисунка
ну значит чтото надо поправить в коде
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
16.07.2010, 00:34
|
#5
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Удаление рисунка
ну значит чтото надо поправить в коде
|
А что?
|
(Offline)
|
|
16.07.2010, 00:35
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Удаление рисунка
ты пропускаешь реализацию за терминами "что-то", а телепаты в отпуску..
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
16.07.2010, 00:53
|
#7
|
Дэвелопер
Регистрация: 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
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Удаление рисунка
надо дописать необходимое в обработчик события WM_PAINT
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
16.07.2010, 00:59
|
#9
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Удаление рисунка
Вот сюды чтоли?
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
|
Unity/C# кодер
Регистрация: 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; } }
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.07.2010, 01:02
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Удаление рисунка
да. здесь заведи реацию на флаг.
флаг поднимай при нажатии кнопки.
если флаг поднят, то рисуешь что-то там из поста №7
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
16.07.2010, 01:14
|
#12
|
Дэвелопер
Регистрация: 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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Удаление рисунка
Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.
|
(Offline)
|
|
16.07.2010, 01:22
|
#14
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Удаление рисунка
Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.
|
Придется.
----------------------
А вот если отказатся от Sleep(100); да ещё в функции обработки кнопки написать this->OnPaint(); то тогда всё фурычит!
|
(Offline)
|
|
16.07.2010, 01:56
|
#15
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Удаление рисунка
А вот что я придумал, но незнаю как сделать:
При каждом нажатии на кнопку выполнять код рисования, а сам рисунок CClientDC dc(this); сохранить как нибуть в переменую какую нибуть графическую. А потом в WM_PAINT (OnPain) просто отрисовывать эту переменую.
Вот что я не могу сделать:
1) как CClientDC dc сохранить в какую нибуть графическую переменую.
2) как нарисивать данную переменую.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:03.
|