"Скриншот"...
// используемые переменные
HDC hDC, hdcDisplay;
BITMAP Bitmap;
char** MyBits;
// получаем контекст экрана
hdcDisplay = CreateDC("DISPLAY", 0L, 0L, 0L);
// устанавливаем поле "размер" структуры BITMAPINFOHEADER в стурктуре BITMAPINFO :)
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
/* устанавливали размер для следующей функции. По идее, т.е. как написано в MSDN, если 5й параметр (указатель на буфер, где буду лежать битики) передать как NULL, то функция просто заполнит инфой о картинке структуру bmi. */
int nScanLines = GetDIBits(hdcDisplay, (HBITMAP)hBitmap, 0, 768, NULL, &bmi, DIB_RGB_COLORS);
// bmi заполнена нудными параметрами... если точнее "первыми" 6 + размер.
// След. функция опять таки по идее должна MyBits сделать указателем на указатель на битики картинки
// и вернуть указатель на DIB. Вместо этого я получаю NULL и ошибку - неверно задан параметр...
hBitmap = CreateDIBSection(hAnotherDC, &bmi, DIB_RGB_COLORS, (void**)MyBits, NULL, 0);
ЗЫ У меня есть исходники с использованием MFC. Но в том то и дело, что использовать MFC я не могу...
Также пробовал GetDIBits с указателем на буфер - фозвращало правильное количество скопированных строк (scanline), но буфер как был 0 забит, так и оставался...
Может у кого есть другой вариант решения этой задачи?
Заранее благодарен
но можно немножко обмануть винапи.
HDC DC;
LPVOID vsp;
DC=GetDC(hwnd);
//создание битмапа
bmpDC=CreateCompatibleDC(DC);//создаем совместимый контекст
bmp=CreateDIBSection(DC,&bmpInfo,DIB_RGB_COLORS,&vsp,NULL,0); //создаем битмап
pBmp=(COLORREF *)vsp;//приводим указатель
SelectObject(bmpDC,bmp);//выбираем в контекст битмап
ReleaseDC(hwnd,DC);
в результате получаем контекст bmpDC, битмап bmp и pBmp - указатель на область памяти, где живет все содержимое битмапа. теперь, копируя из нужного контекста в bmpDC нужный кусок - получим их через указатель pBmp. Возможна и обратная операция - копирование из bmpDC в какой-то другой DC. Насколько я понимаю, mfc реализовано примерно так же, но все нужные функции сведены в класс.
в приведенном куске опущена инициализация структуры bmpInfo - там вроде бы все достаточно понятно, хотя и муторно
Цитата:
Originally posted by molnij
крайне нетривиальная задача между прочим :( почему-то напрямую получить нужный указатель в памяти, где живет выводимый массив нельзя (хотя почему, понятно - не наша память - нефиг соваться)
но можно немножко обмануть винапи.
HDC DC;
LPVOID vsp;
DC=GetDC(hwnd);
//создание битмапа
bmpDC=CreateCompatibleDC(DC);//создаем совместимый контекст
bmp=CreateDIBSection(DC,&bmpInfo,DIB_RGB_COLORS,&vsp,NULL,0); //создаем битмап
pBmp=(COLORREF *)vsp;//приводим указатель
SelectObject(bmpDC,bmp);//выбираем в контекст битмап
ReleaseDC(hwnd,DC);
...
крайне нетривиальная задача между прочим :( почему-то напрямую получить нужный указатель в памяти, где живет выводимый массив нельзя (хотя почему, понятно - не наша память - нефиг соваться)
но можно немножко обмануть винапи.
HDC DC;
LPVOID vsp;
DC=GetDC(hwnd);
//создание битмапа
bmpDC=CreateCompatibleDC(DC);//создаем совместимый контекст
bmp=CreateDIBSection(DC,&bmpInfo,DIB_RGB_COLORS,&vsp,NULL,0); //создаем битмап
pBmp=(COLORREF *)vsp;//приводим указатель
SelectObject(bmpDC,bmp);//выбираем в контекст битмап
ReleaseDC(hwnd,DC);
...
ну примерно так я тогда и решил (инета долго не было - не мог прочитать твое сообщение :)))
все равно спасибо :)
тока я не создавал DIB секцию... я все старыми функциями сделал... если интересно могу прислать исходник...
Цитата:
Originally posted by nihil
ну примерно так я тогда и решил (инета долго не было - не мог прочитать твое сообщение :)))
все равно спасибо :)
тока я не создавал DIB секцию... я все старыми функциями сделал... если интересно могу прислать исходник...
ну примерно так я тогда и решил (инета долго не было - не мог прочитать твое сообщение :)))
все равно спасибо :)
тока я не создавал DIB секцию... я все старыми функциями сделал... если интересно могу прислать исходник...
Достаточно интересно, если есть возможность то на мыло (catap@catap.ru)
ry_<собака>tut<dot>by