Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рисование в dialog box, сохранение нарисованного,очистка диалога 
:(
    Опции темы
alya
Дата 11.3.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



привет, народ!

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

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

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

скажите ответы на мои вопросы пожалуйста, т.к. я сама не сообразила...
спасибо
PM MAIL   Вверх
korian
Дата 11.3.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Рисование делать в памяти, используя 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;
...
}

PM   Вверх
Earnest
Дата 14.3.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
korian
Дата 14.3.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



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

создавать массив и запоминать то, что было нарисовано мышью, а потом воспроизводить? особенно, если это не имеет смысла...
PM   Вверх
Earnest
Дата 14.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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



--------------------
...
PM   Вверх
Gongex
Дата 14.4.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 1.1.2008

Репутация: нет
Всего: 0



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

Это сообщение отредактировал(а) Gongex - 14.4.2008, 00:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.