arechemist писал(а):Что делают в этой статье функции:
CreateCompatibleBitmap
DeleteObject
SelectObject
Зачем они нужны
arechemist писал(а):ps а что за API-Guide и где его скачать?
GSerg писал(а):Хм... Ну ладно
DeviceContext – это структура, формат которой объявлен закрытым с целью безболезненного изменения его в будущем. Для работы с этой структурой используются только специальные функции и никогда – напрямую.
Главное в DC – его содержимое. В изначально созданном DC ничего нет. Чтобы работать, нужно создать ещё и графические объекты, после чего создать логическую связь оных с DC (это называется «выбрать в DC», занимается этим функция SelectObject). Одновременно в одном DC может находиться только один объект данного типа (один битмап, одна кисть, одно перо...). При этом в случае с битмапом зависимость взаимно однозначная: если битмап выбран в DC, то он не может быть выбран в другой DC.
В общем случае работа с DC выглядит так: есть некий уже существующий DC, работать с которым мы хотим. При помощи CreateCompatibleDC мы создаём новый DC, совместимый со старым. Битмапа в нём пока нет, просто пустышка нулевого размера. Создаём битмап (CreateCompatibleBitmap) и выбираем его в DC (SelectObject). При этом запоминаем в переменные хэндлы и DC, и битмапа (по окончании работы нужно всё вручную удалять – DeleteDC для DC и DeleteObject для картинки).
Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it
Я не злопамятный. Я просто злой и память у меня хорошая.
Я не злопамятный, у меня просто склероз. Отомщу, забуду - и снова отомщу...
tyomitch писал(а):Ещё, мне кажется, стоит рассказать про то, зачем вообще нужны DC.
И в завершение экскурса в историю, о BitBlt. Согласно официальной трактовке, это читается "БитБлит" и означает Bit Block Transfer. В старых Виндах, которые могли работать с цветностью 4bpp или менее, для переноса куска изображения из одного DC в другое было недостаточно переноса байт; нужно было "рассекать" байты по границе области переноса и "вклеивать" их посреди байтов приёмника. Это было достаточно нетривиально и, действительно, требовало специальной функции. Сейчас же, когда цветность у всех 8bpp и более, BitBlt по сути осуществляет Byte Block Transfer - а это уже можно выполнить обычным двойным циклом. Мораль: не юзайте GetPixel, SetPixel и BitBlt, работайте сразу с данными картинки.
Вот, почти статья получилась... при воспроизведении сохранение копирайта обязательно.
Approximator писал(а):tyomitch писал(а):Ещё, мне кажется, стоит рассказать про то, зачем вообще нужны DC.
Хочется - расскажи. Кста, imo, в твоём последующем тексте "про это" почти ничего не было сказано.
Под это дело была разработана концепция DC: программист не знает, какова структура под-лежащего устройства, какая там глубина цвета, какое выравнивание строк и т.п. Он просто пишет код, оперируя понятиями "кистей" и "перьев", а ОС сама преобразует их в операции над соответствующим устройством.
Approximator писал(а):Мораль нормальная, но лишь в отношении Get/SetPixel. Ибо, Bit Blitting происходит несравненно быстрее нежели Get/SetDIBits. И это объяснимо - ведь по сути приходится сначала битовый образ форматировать, а уже затем запихивать его по месту Device контекстной памяти. Я уже не говорю про то, что может понадобиться в цикле эти байты обрабатывать... Мораль, прежде чем советовать - тестируй на производительность, то бишь не используй истины: "не верь глазам своим - поверь своей совести".
"У каждого придурка свои радости" (с)Approximator писал(а):Вот, почти статья получилась... при воспроизведении сохранение копирайта обязательно.
Вон, оказывается, как тебя сильно на этом клинит.Не сердись, nothing personal.
tyomitch писал(а):Approximator писал(а):tyomitch писал(а):Ещё, мне кажется, стоит рассказать про то, зачем вообще нужны DC.
Хочется - расскажи. Кста, imo, в твоём последующем тексте "про это" почти ничего не было сказано.
Ну как же ничего:...
tyomitch писал(а):Approximator писал(а):Мораль нормальная, но лишь в отношении Get/SetPixel. Ибо, Bit Blitting происходит несравненно быстрее нежели Get/SetDIBits. И это объяснимо - ведь по сути приходится сначала битовый образ форматировать, а уже затем запихивать его по месту Device контекстной памяти. Я уже не говорю про то, что может понадобиться в цикле эти байты обрабатывать... Мораль, прежде чем советовать - тестируй на производительность, то бишь не используй истины: "не верь глазам своим - поверь своей совести".
Get/SetDIBits здесь вообще не при чём. Я о создании битмапа из двумерного массива и работы с ним попиксельно как с двумерным массивом. Скорость этого трюка я проверял - мне понравилось.
Ещё раз, не о создании буфера битмапа в двумерном массиве, а о создании самого битмапа.
Approximator писал(а):tyomitch писал(а):Approximator писал(а):tyomitch писал(а):Ещё, мне кажется, стоит рассказать про то, зачем вообще нужны DC.
Хочется - расскажи. Кста, imo, в твоём последующем тексте "про это" почти ничего не было сказано.
Ну как же ничего:...
Я сказал почти ничего. На самом деле GDI это универсальный интерфейс и способен работать не только с монитором, при этом, работая через него вовсе не обязательно задумываться как об особенностях hardware, так и об особенностях поставляемых драйверов... Впрочем, про DC не у меня было желание рассказывать, а у тебя
вот и отдувайся. "Назвался груздём..."
Approximator писал(а):Если об ОДНОКРАНОМ заполнении битмапа - нет вопросов, если же... кста, что за "попиксельная работа", то есть, что именно необходимо было сделать с ОТДЕЛЬНЫМ пикселем (например)? Конечно, может быть сама задача не позволяла использовать стандартные процедуры (логические операции над массивом данных с использованием, пускай даже обсчитываемых, примитивов), но, что-то мне подсказывает, что ты просто на корню отверг подобную возможность (ну, не любят некоторые люди математику, что ж с того?). Разубеди.
GSerg писал(а):Видимо, имеется в виду, что когда пиксель описывается нецелым числом байт, то для работы с ним лучше использовать всё-таки функции.
tyomitch писал(а):Approximator писал(а):tyomitch писал(а):Approximator писал(а):tyomitch писал(а):Ещё, мне кажется, стоит рассказать про то, зачем вообще нужны DC.
Хочется - расскажи. Кста, imo, в твоём последующем тексте "про это" почти ничего не было сказано.
Ну как же ничего:...
Я сказал почти ничего. На самом деле GDI это универсальный интерфейс и способен работать не только с монитором, при этом, работая через него вовсе не обязательно задумываться как об особенностях hardware, так и об особенностях поставляемых драйверов... Впрочем, про DC не у меня было желание рассказывать, а у тебя
вот и отдувайся. "Назвался груздём..."
Я не говорил про монитор, я говорил про "под-лежащее устройство".
Про независимость от hardware и конкретных драйверов я писал в самом первом абзаце.
Короче, всё, что я хотел сказать - я сказал. Если кто-то чего-то не понял, или не нашёл в тексте - его проблемы. Я считаю, что зачем вообще нужны DC я рассказал достаточно полно и подробно.
Мне - ничего. Думал, что может пригодиться тебе. Если нет - ещё раз прости, видимо то, что я написал прошло "мимо бани". Не забивай голову.tyomitch писал(а):Approximator писал(а):Если об ОДНОКРАНОМ заполнении битмапа - нет вопросов, если же... кста, что за "попиксельная работа", то есть, что именно необходимо было сделать с ОТДЕЛЬНЫМ пикселем (например)? Конечно, может быть сама задача не позволяла использовать стандартные процедуры (логические операции над массивом данных с использованием, пускай даже обсчитываемых, примитивов), но, что-то мне подсказывает, что ты просто на корню отверг подобную возможность (ну, не любят некоторые люди математику, что ж с того?). Разубеди.
Короче, я ниччё не понял. Объясни, можешь личкой, что тебе надо...
GSerg писал(а):Видимо, имеется в виду, что когда пиксель описывается нецелым числом байт, то для работы с ним лучше использовать всё-таки функции.
Сейчас этот форум просматривают: AhrefsBot, The trick, Yandex-бот и гости: 12