Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]Объясните про контекст памяти 
:(
    Опции темы
yngwie19
Дата 30.5.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я до сих пор не могу понять, почему мы не можем обойтись без совместимого контекста памяти при выводе изображения. Из всего того что Я прочитал, Я понял следующее:
1) Мы не сожем выбрать в контекст дисплея получаемого с помощью BeginPaint() или CreateDC(), т.к формат изображения не соответствует формату вывода контекста устройства, привильно ли Я понял?
2) Для этого нам нужно создать совместимый контекст памяти с помощью CreateCompatibleDC(), выбрать в него хэндл картинки и с помощью BitBlt() блочно спопировать растровое изображение из совместимого контекста в контекст дисплея, так ?
Подскажите что не так в моих рассуждениях, и в каком плане не совпадаю форматы из п.1 если Я правильно понял.
PM MAIL   Вверх
GremlinProg
Дата 30.5.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(yngwie19 @  30.5.2009,  14:00 Найти цитируемый пост)
Мы не сожем выбрать в контекст дисплея получаемого с помощью BeginPaint() или CreateDC(), т.к формат изображения не соответствует формату вывода контекста устройства, привильно ли Я понял?

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

привожу, надеюсь, доходчивый пример на абстракциях:
Код

char screenBitmap;// это аналог экранного буфера (он не доступен пользователю напрямую)
char pictureBitmap;// это аналог буфера, который будет загружен из файла

pictureBitmap = 123;// это аналог загрузки картинки из файла, или ресурсов: LoadImage

char*DC = &screenBitmap;// аналог GetDC

char*PicDC;// аналог CreateCompatibleBitmap, смотри на типы для PicDC и DC, они равны, т.е. так имитируется совместимость контекстов

PicDC = &pictureBitmap;// аналог SelectObject(PicDC,pictureBitmap);

*DC = *PicDC;// аналог BitBlt(DC,...,PicDC,...);

print(screenBitmap);// имитация работы адаптера + монитора


а теперь то же самое, только без комментариев:
Код

char screenBitmap;
char pictureBitmap;
char*DC,*PicDC;

pictureBitmap = 123;

DC     = &screenBitmap;
PicDC = &pictureBitmap;

*DC = *PicDC;

print(screenBitmap);

теперь попробуй выбрать в DC свой битмап, что получится?
Код

char screenBitmap;
char pictureBitmap;
char*DC;

pictureBitmap = 123;

DC     = &screenBuffer;// аналог GetDC
DC     = &pictureBuffer;//аналог SelectObject(DC,pictureBitmap);

print(screenBitmap);

смысл понятен?
подсказка: в обоих случаях достаточно определить, будет ли выводить print загруженную картинку, т.е. число 123

Это сообщение отредактировал(а) GremlinProg - 30.5.2009, 15:34


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 30.5.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Смысл понятен как это делается, но мне не понятно почему не будет работать так:
Код

HDC hdc = GetDC(hwnd)
    SelectObject(hdc,hBitmap);                     // hBitmap - хэндл на растр. картинку
ReleaseDC(hwnd,hdc);


Почему hBitmap нельзя напримую загрузить в hdc 
PM MAIL   Вверх
GremlinProg
Дата 30.5.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(yngwie19 @  30.5.2009,  15:34 Найти цитируемый пост)
Смысл понятен как это делается, но мне не понятно почему не будет работать так

Цитата(yngwie19 @  30.5.2009,  15:34 Найти цитируемый пост)
Почему hBitmap нельзя напримую загрузить в hdc 

видимо смысл все таки не был понятен
пересмотри последний пример и объясни своими словами, почему 123 не поступит в метод print

Добавлено через 2 минуты и 4 секунды
если не получится, то придется тему перенести в другой раздел

Добавлено через 3 минуты и 55 секунд
поправочка:
Цитата(GremlinProg @  30.5.2009,  15:09 Найти цитируемый пост)
DC     = &screenBuffer;// аналог GetDC

Код

DC     = &screenBitmap;


Добавлено через 5 минут и 8 секунд
аналогично и с picture:
Цитата(GremlinProg @  30.5.2009,  15:09 Найти цитируемый пост)
DC     = &pictureBuffer;//аналог SelectObject(DC,pictureBitmap);

Код

DC     = &pictureBitmap;


Добавлено через 6 минут и 34 секунды
Цитата(GremlinProg @  30.5.2009,  15:09 Найти цитируемый пост)
теперь попробуй выбрать в DC свой битмап, что получится?

лучше перепишу:
Код

char screenBitmap;
char pictureBitmap;
char*DC;

pictureBitmap = 123;

DC     = &screenBitmap;// аналог GetDC
DC     = &pictureBitmap;//аналог SelectObject(DC,pictureBitmap);

print(screenBitmap);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 30.5.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GremlinProg @  30.5.2009,  13:39 Найти цитируемый пост)
пересмотри последний пример и объясни своими словами, почему 123 не поступит в метод print

Видимо потому что формат хранения битового растра картинки несовместим с форматом отображения растрового изображения контекста экрана.
PM MAIL   Вверх
GremlinProg
Дата 30.5.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



нет
Цитата(GremlinProg @  30.5.2009,  15:39 Найти цитируемый пост)

DC     = &screenBitmap;
DC     = &pictureBitmap;

потому что этот код не производит ни каких операций с памятью


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 30.5.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GremlinProg, Мог бы ты дать ссылку на русском языке, чтобы Я мог почитать про это и больше не спрашивать на форуме ? 
PM MAIL   Вверх
GremlinProg
Дата 30.5.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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

pictureBitmap = LoadImage(...);
DC = GetDC(hwnd);
PicDC = CreateCompatibleBitmap(DC,...);
SelectObject(PicDC,pictureBitmap);
BitBlt(DC,...,PicDC,...);
ReleaseDC(hwnd,DC);

а для второго примера, ты и сам уже приводил:
Код

pictureBitmap = LoadImage(...);
DC = GetDC(hwnd);
SelectObject(DC,pictureBitmap);
ReleaseDC(hwnd,DC);

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

оригинал тут


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
nefton
Дата 28.3.2013, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кажется до меня дошло.
Есть где-то память. Конкретные ячейки, с которых системно-аппаратно считывается картинка в монитор.
И есть образно-указатель на эту память - контекст рабочего стола к примеру.
Поскольку память у нас физически жёстко привязана к определённым ячейкам - то логично что и указатель указывает в одно и тоже место всегда и его менять смысла нету. (наверное и возможности нету smile )

Теперь почему мы создаём в памяти картинку. Наверное так просто удобнее. Теоретически конечно можно писать прям в ту самую память контекста рабочего стола, но либо это неудобно либо виндовс вообще не даст этого сделать кроме как BitBlt из совместимой памяти. 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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