Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемма с CDC 
V
    Опции темы
ShurikA
Дата 22.3.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Есть вот такой код:
При загрузки картинки из фаила:
Код

void CChildView::ReloadDC()
{
    CDC* dcMemory = CDC::FromHandle(imgOriginal.GetDC());

    dcMain.DeleteDC();
    m_Bitmap.Detach();
    
    dcMain.CreateCompatibleDC(dcMemory);
    m_Bitmap.CreateCompatibleBitmap(dcMemory,imgOriginal.GetWidth(),imgOriginal.GetHeight());
    dcMain.SelectObject(&m_Bitmap);
    //dcMain.BitBlt(0, 0, imgSize.cx, imgSize.cy, dcMemory, 0, 0, SRCCOPY);
    dcMain.StretchBlt(0, 0, imgSize.cx, imgSize.cy, dcMemory, 0, 0, imgSize.cx, imgSize.cy, SRCCOPY);
    imgOriginal.ReleaseDC();

    dcFull.CreateCompatibleDC(dcMemory);
    bitmapFull.CreateCompatibleBitmap(dcMemory,imgOriginal.GetWidth(),imgOriginal.GetHeight());
    dcFull.SelectObject(&bitmapFull);
}

при том что:
Код

CDC dcFull;    // Full offscreen DC
CBitmap bitmapFull;    // Full offscreen Bitmap
CDC dcMain;    // Offscreen Image DC
CBitmap  m_Bitmap;    // Offscreen Image bitmap


При прорисовке:
Код

void CChildView::OnPaint() 
{
    this->GetClientRect(&mainRect);

    ooPoint.x = mainRect.left;
    ooPoint.y = mainRect.top;
    
    CPaintDC dc(this); // device context for painting

    if (!imgOriginal.IsNull()) 
    {
        dcFull.BitBlt(ooPoint.x, ooPoint.y, imgSize.cx, imgSize.cy, &dcMain, 0, 0, SRCCOPY);
        measureMgr->Paint(&dcFull);
        dc.BitBlt(ooPoint.x, ooPoint.y, imgSize.cx, imgSize.cy, &dcFull, 0, 0, SRCCOPY);

        //measureMgr->Paint(&dc);


        CString str;

        str.Format("Field of View: %4.2f | Apperture: %4.2f | Date: %s", imgData.fieldOfView, imgData.apperture, imgData.date);
        dc.DrawText(str, mainRect, DT_SINGLELINE);

        str.Empty();
    }
}


и так...
Когда я поднимаю любую картинку, поднимается чёрный квадрат на котором прекрасно бырисовывается measureMgr->Paint(&dcFull); но правда белого цвета а не того как я задаь (зелёного)... smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 22.3.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не вижу, что у тебя там зеленое должно быть?
Если то, что рисует measureMgr->Paint, так приведи его код.


--------------------
...
PM   Вверх
ShurikA
Дата 22.3.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Цитата(Earnest @ 22.3.2006, 15:13 Найти цитируемый пост)
Не вижу, что у тебя там зеленое должно быть?
Если то, что рисует measureMgr->Paint, так приведи его код.

Это пол беды,
Почему не вижу картинку, а просто чёрный квадрат?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 22.3.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сразу сложно сказать. Попробуй сначала локализовать проблему: где пропадает картинка в dcFull или dcMain.
А еще есть одна ошибка: перед созданием CompatibleBitmap ты делаешь старому Detach. Это нехорошо - чревато утечкой GDI-ресурсов. Делать надо DeleteObject().
Добавлено @ 18:34
И еще: создавал бы ты контексты, совместимые с экраном, а не с твоим растром. Тебе ведь на экран выводить надо, а растр модет попасться, например, черно-белый.


--------------------
...
PM   Вверх
ShurikA
Дата 22.3.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Цитата(Earnest @ 22.3.2006, 17:30 Найти цитируемый пост)
И еще: создавал бы ты контексты, совместимые с экраном, а не с твоим растром.

если так то всё работает, но мне удобнее было бы со всем этим монипулировать (зум, сдвиги и т.д.) если это двумя разными контекстами.


Цитата(Earnest @ 22.3.2006, 17:30 Найти цитируемый пост)
а растр модет попасться, например, черно-белый.

что значит попасться???
Разве я не могу его сам определить? и разве вот это его не определяет:
Код

dcFull.CreateCompatibleDC(dcMemory);
bitmapFull.CreateCompatibleBitmap(dcMemory,imgOriginal.GetWidth(),imgOriginal.GetHeight());
dcFull.SelectObject(&bitmapFull);
?

Это сообщение отредактировал(а) ShurikA - 22.3.2006, 21:04


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 22.3.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ShurikA @ 22.3.2006, 20:35 Найти цитируемый пост)
если так то всё работает, но мне удобнее было бы со всем этим монипулировать (зум, сдвиги и т.д.) если это двумя разными контекстами.

И чему это противоречит? Создавай оба контекста по экранному, а не по растровому.

Дело в том, что именно копирование между совместимыми контекстами происходит быстро (т.к. у них одинаковый формат памяти). А если контексты имеют разную цветность, то нужен дополнительный маппинг цветов. Так что нет особого смысла создавать совместимые контексты не по экрану.

Цитата(ShurikA @ 22.3.2006, 20:35 Найти цитируемый пост)
и разве вот это его не определяет:

По идее должен создасться контекст такой же цветности, как растр... Это значит, если растр серый, то ты не сможешь цветом рисовать.

У меня есть некоторые сомнения, что в качестве параметра CreateCompatibleDC можно использовать контекст, полученный от растра... Для проверки запроси у совместимого битмапа сразу после создания...


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


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



УРААААААААААААААААА!!!!!!!!!!!!!!!!!!!!!
Решилось вот так:
Код

void CChildView::ReloadDC()
{
     CDC* dcMemory = CDC::FromHandle(imgOriginal.GetDC());

     dcMain.DeleteDC();
     m_Bitmap.Detach();
    
     dcMain.CreateCompatibleDC(dcMemory);
     m_Bitmap.CreateCompatibleBitmap(dcMemory,imgOriginal.GetWidth(),imgOriginal.GetHeight());
     dcMain.SelectObject(&m_Bitmap);
     //dcMain.BitBlt(0, 0, imgSize.cx, imgSize.cy, dcMemory, 0, 0, SRCCOPY);
     dcMain.StretchBlt(0, 0, imgSize.cx, imgSize.cy, dcMemory, 0, 0, imgSize.cx, imgSize.cy, SRCCOPY);
     //imgOriginal.ReleaseDC();

    dcFull.CreateCompatibleDC(dcMemory);
    bitmapFull.CreateCompatibleBitmap(dcMemory,imgOriginal.GetWidth(),imgOriginal.GetHeight());
    dcFull.SelectObject(&bitmapFull);
    imgOriginal.ReleaseDC();
}



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 28.3.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Цитата(Earnest @ 22.3.2006, 20:25 Найти цитируемый пост)
Создавай оба контекста по экранному, а не по растровому.

Как это правильно сделать? размер окна может меняться...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 28.3.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В качестве аргумента для CreateCompatibleDC и CreateCompatibleBitmap используй контекст окна или всего дисплея, а не контекст растра. И какая разница, какие там размеры.


--------------------
...
PM   Вверх
ShurikA
Дата 28.3.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Цитата(Earnest @ 28.3.2006, 17:07 Найти цитируемый пост)
И какая разница, какие там размеры.

Потом обьясню


Цитата(Earnest @ 28.3.2006, 17:07 Найти цитируемый пост)
В качестве аргумента для CreateCompatibleDC и CreateCompatibleBitmap используй контекст окна или всего дисплея, а не контекст растра

В таком лучае мне надо создавать этот самый контекст каждую перерисовку... Это не есть хорошо!!!


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 29.3.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вовсе нет... кто мешает создать один раз? От того, что ты освободишь экранный контекст, созданный по нему совместимый контекст не протухнет. При создании совместимого контекста всего лишь копируются некоторые параметры исходного (к битмэпу это тоже относится). Кроме того, наиболее емкая операция - это выделение и копирование битмэпа. Так что можно хранить только битмэп, а контекст создавать каждый раз заново - по времени это семечки. А вот куча лишних переменных, хранимых в классе, засоряет его определение... ИМХО.



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


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Earnest,
Я не об этом, а о том что если создать контекст один раз по размеру окна то он и быдет в размер окна в момент создания.
А что будет если юзер делает переразмерку самого окна?
Скажем так: Имеет ли смысл делать контекст в который при прорисовке быдет всё копироваться, и только потом на экран?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 29.3.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ShurikA @ 29.3.2006, 10:41 Найти цитируемый пост)
создать контекст один раз по размеру окна

Не контекст в размер экрана, а битмэп... но в вобщем я поняла...

Можно, конечно, ловить WM_SIZE и инициализировать контекст заново. Но если включена опция "показывать содержимое окна во время ресайза", то, наверное, может притормаживать... Не знаю, не пробовала. Я обычно использую совместимые контексты двумя способами:
1) для самопальных контролов, чтобы избежать мерцания. Тогда я просто создаю временный контекст и битмэп каждый раз на OnPaint.
2) как виртуальную подложку для "большого" рабочего экрана, чтобы ускорить вывод графики. Тогда делаю подложку на весь экран. Это больше чем нужно (есть ведь еще рамки-заголовки-скроллы), но так проще, и чего ее (память) жалеть. Потом нужно только ловить сообщение об изменении размеров дисплея (если по-хорошему).

Цитата(ShurikA @ 29.3.2006, 10:41 Найти цитируемый пост)
Имеет ли смысл делать контекст в который при прорисовке быдет всё копироваться, и только потом на экран?

Конечно, имеет - это борьба с мерцанием.



--------------------
...
PM   Вверх
ShurikA
Дата 29.3.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

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



Цитата(Earnest @ 29.3.2006, 15:00 Найти цитируемый пост)
Тогда я просто создаю временный контекст и битмэп каждый раз на OnPaint

Вот этого я и хотел избежать, ведь это долго. Но я так понимаю что ето довольно таки геморойно.
Добавлено @ 16:32
И ещё вопрос:
Как запросить у окна его DC?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 29.3.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ShurikA @ 29.3.2006, 16:31 Найти цитируемый пост)
Вот этого я и хотел избежать, ведь это долго

Нет, это как раз довольно быстро. Я имею в виду только создание. StretchBlt - уже относительно долго (зависит от размеров, конечно).
Но твой случай, конечно, второй, когда нужна постоянная подложка - растр ведь может быть довольно большим, да и еще какая-то графика у теюя есть.

Цитата(ShurikA @ 29.3.2006, 16:31 Найти цитируемый пост)
Как запросить у окна его DC?

CDC* CWnd::GetDC() (потом не забудь сделать ReleaseDC).
Или просто CWindowDC dc(CWnd*); или CClientDC dc(CWnd*);


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


 




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


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

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