Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > рисование в dialog box


Автор: alya 11.3.2008, 19:03
привет, народ!

есть MFC проект, dialog окно
происходит рисование мышью по окну

1) правильно я понимаю, что в диалог боксе не удастся сделать так, чтобы после сворачивания-разворачивания окна отобразились нарисованные каракули?

2) как можно почистить диалог бокс от всего, чтобы было нарисовано?

скажите ответы на мои вопросы пожалуйста, т.к. я сама не сообразила...
спасибо

Автор: korian 11.3.2008, 19:54
Рисование делать в памяти, используя memory dc.
На OnDraw копировать из памяти на экран.

примерная реализация:
Код

class CMyDialog
{
...
    OnCreate(...)
    {
        CDC* pDC = GetDC();
        m_memoryDC.CreateCompatibleDC(pDC);

        CRect clientRect;
        GetClientRect(&clientRect);
        m_cx = clientRect.Width();
        m_cy = clientRect.Height();

        m_memBitmap.CreateCompatibleBitmap(pDC, m_cx, m_cy);
        m_oldBitmap = m_memoryDC.SelectObject(&m_memBitmap);
        ReleaseDC(pDC);
    }
    OnDestroy()
    {
        m_memoryDC.SelectObject(m_oldBitmap);
        memBitmap.DeleteObject()
        m_memoryDC.DeleteDC();
    }
    OnReSize()
    {
        ...
        m_memoryDC.SelectObject(m_oldBitmap);
        memBitmap.DeleteObject()

        CDC* pDC = GetDC();

        CRect clientRect;
        GetClientRect(&clientRect);
        m_cx = clientRect.Width();
        m_cy = clientRect.Height();

        m_memBitmap.CreateCompatibleBitmap(pDC, m_cx, m_cy);
        m_oldBitmap = m_memoryDC.SelectObject(&m_memBitmap);
        ReleaseDC(pDC);
    }
     OnDraw()
     {
          CPaintDC dc(this);
          dc.BitBlt(0, 0, m_cx, m_cy, &m_memoryDC, 0, 0, SRCCOPY);
     }
      ClearPicture()
      {
          m_memBitmap.FillSolidRect(0, 0, m_cx, m_cy, 0xFFFFFF);
          Invalidate();
      }
...
private:
   CDC m_memoryDC;
   CBitmap m_memBitmap;
   CBitmap* m_oldBitmap;
   int m_cx, m_cy;
...
}

Автор: Earnest 14.3.2008, 10:03
Вовсе не обязательно в мемори-контексте.
Достаточно рисовать как положено в OnPaint... диалог, он тоже окно

Автор: korian 14.3.2008, 11:59
Цитата(Earnest @  14.3.2008,  09:03 Найти цитируемый пост)
Вовсе не обязательно в мемори-контексте.
Достаточно рисовать как положено в OnPaint... диалог, он тоже окно 

создавать массив и запоминать то, что было нарисовано мышью, а потом воспроизводить? особенно, если это не имеет смысла...

Автор: Earnest 14.3.2008, 12:17
А зачем тогда вообще экран пачкать? Кроме того, ты ведь как раз и предлагаешь помнить накаляканное - целый внеэкранный буфер под это дело создавать. А если там прокрутка и масштабирование? Короче, очевидно, что чтобы воспроизводить - надо помнить, а как и в каком виде - от задачи зависит. По большому счету, вариантов 2: растр или вектор. 

Автор: Gongex 14.4.2008, 00:06
Ответ на вопрос 2
Аля,я делал,рисунки на диалоге.Мне тут подсказали и у мну получилось.
Рисовать надо только в OnPaint а от мышки надо делать Invalidate(TRUE);
если нарисовать от левой кнопки на диалоге то никак не стереть оказываеся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)