сохранение данных из буфера обмена
От: Владимир Россия  
Дата: 20.08.02 14:26
Оценка:
Помогите кто знает.
Требуется: Сохранить картинку из буфера обмена в файл.
Делаю например.


unsigned int format = 0;
DWORD memSize;
HANDLE hMem;

OpenClipboard(NULL);
format = EnumClipboardFormats(format);
for (;format != CF_BITMAP && format != 0; format = EnumClipboardFormats(format)){
//sprintf(buffer, "Format: %d", format);
//MessageBox(NULL, buffer, "Test", MB_OK);
};
if (format != CF_BITMAP){
MessageBox(NULL,"Not Found", "Test", MB_OK);
}else{
MessageBox(NULL,"CF_BITMAP Found", "Test", MB_OK);
hMem = GetClipboardData(CF_BITMAP);
if (hMem){
memSize = GlobalSize(hMem);
};

Вот тут то уже засада какая-то, т.к. memSize = 0, a GetLastError() после нее = 6 (The handle is invalid.) :(
Все это дело лежит и дергается из DLL-ки, т.к. сама прога писана на Sybase PowerBuilder'e, а там уж больно муторно WINAPI'шные функции так дергать.

Ежели кто знает что неправильно, или как правильно и быстро сохранить картинку из буфера обмена в файл, прошу помочь.
Re: сохранение данных из буфера обмена
От: Willi Интернет  
Дата: 20.08.02 17:17
Оценка:
Здравствуйте Владимир, Вы писали:

В>Помогите кто знает.

В>Требуется: Сохранить картинку из буфера обмена в файл.
В>Делаю например.

В> hMem = GetClipboardData(CF_BITMAP);

В> if (hMem){
В> memSize = GlobalSize(hMem);
В> };

Я никогда ничего подобного не делал, но порывшись в MSDN нашел следующее.

— то что тебе вернули из GetClipboardData является дескриптором GDI объекта (HBITMAP) а не памяти, потому и функции для работы с ним надо использовать соответствующие
— если ты собираешься использовать этот объект после вызова CloseClipboard нужно создать копию дескриптора вызвав CopyHandle
— совуту почитать следующие статьи
HOWTO: Retrieve DIBs from the Clipboard
Using the Clipboard

надеюсь это поможет
__________________________________
Василий Черневич (aka Willi)
Re: сохранение данных из буфера обмена
От: Владимир Россия  
Дата: 21.08.02 11:09
Оценка:
Благодарю Willi за ответ.
Я нашел решение, которое привожу здесь. Возможно кому-нибудь понадобится.

//main.c

#include <windows.h>
#include "dibapi.h"

int __stdcall ClipboardToFile(HWND hWnd, LPCTSTR FileName){
int ReturnValue = 0;
unsigned int format = 0;
HANDLE hMem;
if (OpenClipboard(NULL)){
format = EnumClipboardFormats(format);
for (;format != CF_DIB && format != 0; format = EnumClipboardFormats(format));
if (format == CF_DIB){
hMem = GetClipboardData(CF_DIB);
if (hMem){
ReturnValue = SaveDIB((HDIB)hMem, (LPSTR)FileName);
};
}else{
MessageBox(hWnd,"Неверный формат", "Вставка из буфера", MB_OK);
ReturnValue = -10;
};
} else {
ReturnValue = -20;
};
CloseClipboard();
return ReturnValue;
}

Функция SaveDIB определяется в файле file.c
Листинги файлов file.c, dibutil.c, dibapi.h, dibutil.h найдены мной в MSDN от 6-го плюса.
Лучше всего искать по слову "dibapi.h"
Подключаете к проекту и вперед.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.