Задать вопрос
@INeFFeXI

Почему HBITMAP не записывается в буфер обмена?

BITMAP bitmapInfo; 
GetObject(hBitmap, sizeof(BITMAP), &bitmapInfo); 
 
BITMAPINFOHEADER bih = { 0 }; 
bih.biSize = sizeof(BITMAPINFOHEADER); 
bih.biWidth = width; 
bih.biHeight = height; 
bih.biPlanes = 1; 
bih.biBitCount = 32; 
bih.biCompression = BI_RGB; 
bih.biSizeImage = 0; // Можно установить в 0 для BI_RGB 
bih.biXPelsPerMeter = 0; 
bih.biYPelsPerMeter = 0; 
bih.biClrUsed = 0; 
bih.biClrImportant = 0; 
 
BITMAPINFO bi; 
bi.bmiHeader = bih; 
 
// Запись битмапа в pixelData 
std::vector<char> pixelData(bitmapInfo.bmWidthBytes * bitmapInfo.bmHeight); 
HDC hdc = GetDC(NULL); 
GetDIBits(hdc, hBitmap, 0, bitmapInfo.bmHeight, &pixelData[0], &bi, DIB_RGB_COLORS); 
ReleaseDC(NULL, hdc); 
 
BITMAPINFOHEADER bih2 = { 0 }; 
bih2.biSize = sizeof(BITMAPINFOHEADER); 
bih2.biWidth = width; 
bih2.biHeight = height; 
bih2.biPlanes = 1; 
bih2.biBitCount = 32; 
bih2.biCompression = BI_RGB; 
bih2.biSizeImage = 0; // Можно установить в 0 для BI_RGB 
bih2.biXPelsPerMeter = 0; 
bih2.biYPelsPerMeter = 0; 
bih2.biClrUsed = 0; 
bih2.biClrImportant = 0; 
 
BITMAPINFO bi2; 
bi2.bmiHeader = bih2; 
 
// Чтение битмапа из pixelData 
void* bitmap_ptr = nullptr; 
HDC hdc2 = GetDC(NULL); 
HBITMAP test_bit = CreateDIBSection(hdc2, &bi2, DIB_RGB_COLORS, &bitmap_ptr, NULL, 0); 
memcpy(bitmap_ptr, &pixelData[0], pixelData.size()); 
ReleaseDC(NULL, hdc2); 
 
BITMAP bitmapInfo2; 
GetObject(test_bit, sizeof(BITMAP), &bitmapInfo2); 
 
// Запись считанного битмапа в pixelData2 
std::vector<char> pixelData2(bitmapInfo2.bmWidthBytes * bitmapInfo2.bmHeight); 
HDC hdc3 = GetDC(NULL); 
GetDIBits(hdc3, test_bit, 0, bitmapInfo2.bmHeight, &pixelData2[0], &bi2, DIB_RGB_COLORS); 
ReleaseDC(NULL, hdc3); 
 
// Сравнение данных 
std::cout << "\npixelData == pixelData2: " << chekData(pixelData, pixelData2); 
 
// Запить считанного битмапа в буффер обмена 
if (OpenClipboard(NULL))//открываем буфер обмена 
{ 
    EmptyClipboard(); 
    if (!SetClipboardData(CF_BITMAP, test_bit)) 
        std::cerr << "Не удалось поместить bitmap в буфер обмена"; 
    else 
        DeleteObject(test_bit); 
    CloseClipboard(); 
} 
 
 
// Запить изначального битмапа в буффер обмена 
if (OpenClipboard(NULL)) 
{ 
    EmptyClipboard(); 
    if (!SetClipboardData(CF_BITMAP, hBitmap)) 
        std::cerr << "Не удалось поместить bitmap в буфер обмена"; 
    else 
        DeleteObject(hBitmap); 
    CloseClipboard(); 
}

Пояснение:
hBitmap - исходный битмап
test_bit - битмап полученный после записи исходного в массив и его чтение
pixelData - массив данных hBitmap
pixelData2 - массив данных test_bit

Проблема:
У меня есть hBitmap(скрин экрана) при записи данных и их чтения данные остаются равными(pixelData = pixelData2), но при попытке записать их в буфер записываются только исходные(hBitmap) почему так происходит и как это исправить? Мне нужно записывать и считывать данные.
  • Вопрос задан
  • 125 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Из документации:
You cannot paste a DIB section from one application into another application.


Можно после изменения данных в DIB section сделать нормальный битмап через CreateDiBitmap.

А еще лучше, вместо CreateDIBSection, скопируйте данные из битмапа через GetDIBits, измените их и скопируйте назад в битмап через SetDIBits.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlphaSomeone
После записи в буфер обмена test_bit и перед записью hBitmap Вы вызываете EmptyClipboard (удаляет информацию из буфера обмена). Поэтому записывается только hBitmap.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы