Требуется сабж. Подскажите, как это лучше сделать?
У меня на входе есть HDC и HBITMAP. Что передавать? Догадываюсь, что нужно заполнить структуру BITMAP (через GetObject наверное) и ее передавать. А как ее потом опять нарисовать на выходе? Т.е. преобразовать обратно в HBITMAP, HDC ?
Есть мысль создавать полный bmp-файл и потом его передавать, грузить и показывать, то я думаю, это извращение
Может, есть какие то более экономные, так сказать, методы — ради скорости и экономии трафика? Устраивает некоторое потяря качетсва, или, например, сжать ее до 50% по размерам, передать в формате jpeg...
Что то я запутался
Подмогните, куда копать хотя бы.
Спасибо
Здравствуйте, elGray, Вы писали:
G>Требуется сабж. Подскажите, как это лучше сделать? G>У меня на входе есть HDC и HBITMAP. Что передавать? Догадываюсь, что нужно заполнить структуру BITMAP (через GetObject наверное) и ее передавать. А как ее потом опять нарисовать на выходе? Т.е. преобразовать обратно в HBITMAP, HDC ?
Если на входе DDB, преобразуйте в DIB и передавайте. Если на входе DIB то и преобразовывать ничего не надо. HDC не трогайте, она тут ни при чем.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, elGray, Вы писали:
G>>Требуется сабж. Подскажите, как это лучше сделать? G>>У меня на входе есть HDC и HBITMAP. Что передавать? Догадываюсь, что нужно заполнить структуру BITMAP (через GetObject наверное) и ее передавать. А как ее потом опять нарисовать на выходе? Т.е. преобразовать обратно в HBITMAP, HDC ?
E>Если на входе DDB, преобразуйте в DIB и передавайте. Если на входе DIB то и преобразовывать ничего не надо. HDC не трогайте, она тут ни при чем.
Э... как это HDC не трогать? На входе "скриншот", полученный через GetDC. Что вы имеете в виду?
Я так понимаю, что нужно передавать BITMAPINFOHEADER ? Вроде накопал в МСДН, как их туда-обратно пребразовывать.
Здравствуйте, elGray, Вы писали:
G>Э... как это HDC не трогать? На входе "скриншот", полученный через GetDC. Что вы имеете в виду? G>Я так понимаю, что нужно передавать BITMAPINFOHEADER ? Вроде накопал в МСДН, как их туда-обратно пребразовывать.
HDC — это такая виртуальная штука, позволяющая рисовать на различных устройствах используя единый упрощенный интерфейс. Передавать ее по сети смысла нет, поскольку это всего лишь хендл и на другом компе смысла иметь не будет.
Далее, я так понимаю вы получаете скриншот вот таким образом:
HDC hdc = GetDC(NULL);
Теперь вам нужно создать еще один контекст в памяти (CreateCompatibleDC) и битмап (CreateCompatibleBitmap). Выбрать этот битмап в ваш контекст. Скопировать все с контекста экрана (hdc) в ваш мемори контекст (BitBlt). Теперь создаете на основе вашего битмапа (он же DDB) девайсо независимый битмап (DIB, см. ф-цию GetDIBits) и его уже передаете по сокету. Про формат DIB придется немного почитать, он довольно сложен для того, чтобы здесь описывать.
Ну вот примерно так, возможны мелкие неточности.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Теперь вам нужно создать еще один контекст в памяти (CreateCompatibleDC) и битмап (CreateCompatibleBitmap). Выбрать этот битмап в ваш контекст. Скопировать все с контекста экрана (hdc) в ваш мемори контекст (BitBlt). Теперь создаете на основе вашего битмапа (он же DDB) девайсо независимый битмап (DIB, см. ф-цию GetDIBits) и его уже передаете по сокету. Про формат DIB придется немного почитать, он довольно сложен для того, чтобы здесь описывать.
Я бы вместо CreateCompatibleBitmap и GetDIBits обошелся бы одним вызовом CreateDIBSection
Здравствуйте, ekamaloff, Вы писали:
E>Ну вот примерно так, возможны мелкие неточности.
Эт понятно. То, что HDC — это дескриптор контекста а не оно само, я знаю. Мне показалось, что вы имеете в виду _вообще_ HDC не трогать
В общем, я нашел в МСДН описание всей этой штуки.
Только вот или я что-то пропустил, или чего то не понял... есть способы, имея только HDC, получить его HBITMAP? Я имею в виду без создания нового в памяти, получить через GetDC, вытащить его HBITMAP и сразу с ним работать? Или все таки "выгоднее" создавать копию в памяти?
Здравствуйте, Роман Дубров, Вы писали:
РД>qwe_asd_zxc wrote:
>> класс для работы с Jpeg >> здесь <http://www.sources.ru/cpp/cpp_class_for_jpeg.shtml>
РД>тогда уже лучше в png, хоть потери качества не будет. РД>А скриншоты в жпеге ацтойно смотрятся.....
РД>-- РД>np: [foobar2000] not started
Здравствуйте, elGray, Вы писали:
G>В общем, я нашел в МСДН описание всей этой штуки. G>Только вот или я что-то пропустил, или чего то не понял... есть способы, имея только HDC, получить его HBITMAP? Я имею в виду без создания нового в памяти, получить через GetDC, вытащить его HBITMAP и сразу с ним работать? Или все таки "выгоднее" создавать копию в памяти?
Здравствуйте, Роман Дубров, Вы писали:
РД>qwe_asd_zxc wrote:
>> класс для работы с Jpeg >> здесь <http://www.sources.ru/cpp/cpp_class_for_jpeg.shtml>
РД>тогда уже лучше в png, хоть потери качества не будет. РД>А скриншоты в жпеге ацтойно смотрятся.....
РД>-- РД>np: [foobar2000] not started
c png не работал, поэтому спорить не буду.
посоветовал то, что уже делал и в чем уверен, что будет работать. РД>А скриншоты в жпеге ацтойно смотрятся.....
в скриншоте может и ..., а в реале очень ничего.