@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) почему так происходит и как это исправить? Мне нужно записывать и считывать данные.
  • Вопрос задан
  • 123 просмотра
Решения вопроса 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы