Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с контекстом в памяти, Обмен изображения между контекстамами 
:(
    Опции темы
Gorbatovsky
Дата 29.9.2003, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите как создать CDC контекст в памяти для вывода графики.
А потом перенести это изображение на экран.
Типа как в OpenGL. Рисую сцену в задний буфер, а потом SwapBuffers().
PM MAIL ICQ   Вверх
DENNN
Дата 29.9.2003, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Взять CDC окна, CreateCompatibleDC а потом Bitblt
PM ICQ   Вверх
Gorbatovsky
Дата 29.9.2003, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за подсказку.
Я нашел несколько примеров на форуме CodeGuru.com.
Первый пример
Код

void CView2d::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);

CRect rect_mem;
GetClientRect(&rect_mem);

// draw something (stupid) to MeinDc
MemDC.DrawText();


// copy it to screen:
dc.BitBlt(0,0,rect_mem.Width(),rect_mem.Height(),&MemDC,0,0,SRCCOPY );
}

Второй пример
Код

CDC MemDC;
CBitmap m_BitMap;
MemDC.CreateCompatibleDC(NULL);

CRect rect_mem;
GetClientRect(&rect_mem);

m_BitMap.CreateCompatibleBitmap(pDC,rect_mem.Width(),rect_mem.Height());
MemDC.SelectObject(&m_BitMap);
MemDC.FillSolidRect(rect_mem,RGB(255,255,255));

// draw something (stupid) to MeinDc
MemDC.DrawText();


// copy it to screen:
pDC->BitBlt(0,0,rect_mem.Width(),rect_mem.Height(),&MemDC,0,0,SRCCOPY );
m_BitMap.DeleteObject();


Но у меня нижего не рисуется. Белый экран.

PM MAIL ICQ   Вверх
Ars
Дата 29.9.2003, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Цитата
Но у меня нижего не рисуется. Белый экран

Чтобы увидеть что-нибудь не белое, надо сначала нарисовать что-нибудь не белое...


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Gorbatovsky
Дата 29.9.2003, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Чтобы увидеть что-нибудь не белое, надо сначала нарисовать что-нибудь не белое...

Дорогой ценитель классики. С юмором у Вас все OK.
А я, иногда, не понимаю оного.
Почему я должен терять время на Ваши шутки.
Для этого есть специальные чаты.
PM MAIL ICQ   Вверх
Ars
  Дата 29.9.2003, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



В каждой шутке есть доля шутки... А все остальное - рациональное зерно, просто надо уметь его видеть.
Я вот и говорю, что в контекст надо что-нибудь нарисовать, причем цветом, отличным от белого.
А если написал что-то для Вас обидное, то нижайше прошу прощения butbut.gif .


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
DENNN
Дата 29.9.2003, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Это маленькое умалчивание простого факта, о котором забывают явно упомянуть 50% "маститых писателей", а 6-ой MSDN пишет очень мелким шрифтом smile.gif
Когда ты создаешь графический котекст (именно создаешь а не используешь чей-то, невважно в памяти или как-то иначе), то в нем необходимо выбрать битмап тех размеров, какое "окно" отображает твой контекст. По умолчанию контекст сожержит битмап 1*1 пиксел.

А во втром примере попробуй сделать не MemDC.FillSolidRect(rect_mem,RGB(255,255,255)); а какой-нибудь другой цвет.
PM ICQ   Вверх
mr.DUDA
Дата 29.9.2003, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата
Это маленькое умалчивание простого факта

Истинно так !!!!!!!!! smile.gif


--------------------
user posted image
PM MAIL WWW   Вверх
Gorbatovsky
Дата 30.9.2003, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за советы Ars, DENN и mr.DUDA.
Я увидел, наконец картинку на экране, предварительно подготовленную в памяти.
Но, только комментируя строку //MemDC.SetMapMode(MM_LOMETRIC);
Но она тоже мигает, правда по другому, если рисовать прямо на экран.
Если заполнять растр цветом отличным от белого, то мигает и фон.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 30.9.2003, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Не будет мигать, если определить обработчик WM_ERASEBKGND сообщения для окна, в котором рисуешь, и сделать его пустым, т.е. "return FALSE".


--------------------
user posted image
PM MAIL WWW   Вверх
Gorbatovsky
Дата 30.9.2003, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Отлично mr.DUDA.
В текстовом режиме все OK. Не мигает.
Но, когда делаю SetMapMode(MM_LOMETRIC), то вместо картинки тоненькая полоска внизу окна.
Мне кажется, что для этого режима нужно по другому делать BitBlt
PM MAIL ICQ   Вверх
Ars
Дата 30.9.2003, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Цитата
когда делаю SetMapMode(MM_LOMETRIC), то вместо картинки тоненькая полоска внизу окна

Начало координат для режима MM_LOMETRIC находится в левом нижнем углу


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Ars
Дата 30.9.2003, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Цитата
Начало координат для режима MM_LOMETRIC находится в левом нижнем углу

Вернее, не так, а вот как: x-координата возрастает при движении вправо, y-координата возрастает при движении вверх. Поэтому, когда начало координат лежит в левом верхнем углу контекста, все, что будет нарисовано с положительной координатой y, будет нарисовано где-то вверху и видно не будет. Для пересчета координат нужно использовать ф-цию LPtoDP


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Gorbatovsky
Дата 30.9.2003, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за подсказку Ars.
Но, ведь для функции BitBlt() не нужны координаты.
Попробую перенести изображение при помощи ::StretchDIBits().
Но, нужно еще заполнить структуру LPBITMAPINFO.

PM MAIL ICQ   Вверх
mr.DUDA
Дата 30.9.2003, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата
Но, ведь для функции BitBlt() не нужны координаты

Это как это не нужны ? А ?? ?
Цитата
BOOL BitBlt(
  int x,
  int y,
  int nWidth,
  int nHeight,
  CDC* pSrcDC,
  int xSrc,
  int ySrc,
  DWORD dwRop
);

Цитата
x - Specifies the logical x-coordinate of the upper-left corner of the destination rectangle.
y - Specifies the logical y-coordinate of the upper-left corner of the destination rectangle

Логические координаты, заметь !
Цитата
GDI transforms nWidth and nHeight, once by using the destination device context, and once by using the source device context. If the resulting extents do not match, GDI uses the Windows StretchBlt function to compress or stretch the source bitmap as necessary.

И зачем тогда вызывать ::StretchDIBits() ?


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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