forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Удаление рисунка (http://forum.boolean.name/showthread.php?t=12930)

den 15.07.2010 22:52

Удаление рисунка
 
Всем привет!
Вот есть простенький код рисования (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);
}
но почемуто если этот зелёный квадрат перекрыть другим окном то перекрытая часть удалится. (если перекрыть полностью - то и удалится полностью). Как этого избежать?

impersonalis 15.07.2010 23:10

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

апд
почитай для начал Скисова, если так хочешь МФЦ. Про кодогенераторы забудь навремя - чего не понимают, тем не владеют (с)Гёте

den 16.07.2010 00:18

Ответ: Удаление рисунка
 
Цитата:

а ты дописал необходимое в обработчик события WM_PAINT?
Ну я вот дописал етот код в конец PAINT, квадрат не стирается, но он рисуется сразу, а мне надо шоб по нажатию кнопки ( void CkkkvvvaaaDlg::OnBnClickedButton1() ). Пытался завести глобальную переменую = 0 . Если нажимаем на кнопку то 1. Если 1 то рисуем квадрат. Но чтото он не рисуется. Как быть?

impersonalis 16.07.2010 00:25

Ответ: Удаление рисунка
 
Цитата:

Но чтото он не рисуется.
ну значит чтото надо поправить в коде

den 16.07.2010 00:34

Ответ: Удаление рисунка
 
Цитата:

ну значит чтото надо поправить в коде
А что? :)

impersonalis 16.07.2010 00:35

Ответ: Удаление рисунка
 
ты пропускаешь реализацию за терминами "что-то", а телепаты в отпуску..

den 16.07.2010 00:53

Ответ: Удаление рисунка
 
Код:

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).
Когда всё дорисуется, если рисунок закрыть другим окном, то та закрытая часть сотрётся. Что делать?

impersonalis 16.07.2010 00:54

Ответ: Удаление рисунка
 
надо дописать необходимое в обработчик события WM_PAINT

den 16.07.2010 00:59

Ответ: Удаление рисунка
 
Цитата:

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();
        }
}


pax 16.07.2010 01:02

Ответ: Удаление рисунка
 
WM_PAINT отрисовывает текущий контент. Введи переменную - флаг, означающую нажатие кнопки, а дальше так:
PHP код:

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;
    }



impersonalis 16.07.2010 01:02

Ответ: Удаление рисунка
 
да. здесь заведи реацию на флаг.
флаг поднимай при нажатии кнопки.
если флаг поднят, то рисуешь что-то там из поста №7

den 16.07.2010 01:14

Ответ: Удаление рисунка
 
Всё бы ничего, да в MFC нет даже строчки case WM_PAINT:
Есть только функция OnPaint().
Можно конешно добавить код из поста №7 туда, но в коде из поста №7 можно увидеть строчку Sleep(100); . Это получается что каждый раз при отресовки окна, прога будет "спать" 100*7 = 700 милесикунд !
Как быть при этом?

pax 16.07.2010 01:18

Ответ: Удаление рисунка
 
Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.

den 16.07.2010 01:22

Ответ: Удаление рисунка
 
Цитата:

Ну для этого надо создать таймер, который будет каждые 100 мс делать вызов OnPaint. В Net перерисовка формы вызывается функцией Invalidate. Поищи, может тоже самое есть и в MFC.
Придется.
----------------------
А вот если отказатся от Sleep(100); да ещё в функции обработки кнопки написать this->OnPaint(); то тогда всё фурычит!

den 16.07.2010 01:56

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot