Страница 1 из 1

Скриншот контрола?

Добавлено: 26 Январь 2006, 18:35
iBAH
Здравствуйте, у меня есть OLE Control и мне нушно поместить его изображение в буфер или сохранить на диск. Как это сделать?

Добавлено: 27 Январь 2006, 2:26
StillZero
до конца не знаю ... начать можно так (это все API):
- узнать контекст окна, на котором находится контрол - GetDC(), GetWindowDC()
- создать compatible DC - CreateCompatibleDC
- создать битмап CreateCompatibleBitmap
- выбрать битмап SelectObject(CompatibleDC,CopmatibleBitmap)
- скопировать текущий DC в память BitBlt(текущий DC, ..., compatible DC,...,SRC_COPY)

в этот момент у тебя будет скриншот в памяти, скриншот будет "расположен" на битмапе, хэндл которого тебе известен, осталось сохранить на диск

вроде так, надо только потом все освободить ReleaseDC, DeleteDC, DeleteObject и вернуть на место предыдущий bitmap SelectObject(старый битмап), ну и с координатами может возня получиться небольшая

вроде был пример на clarionlife.net как делать скриншоты

Добавлено: 27 Январь 2006, 3:57
StillZero
почитал я как сохранить bmp-файл ... гемора дай бог :)
удачи :)

Добавлено: 27 Январь 2006, 8:16
Admin
ImageEx от http://www.solidsoftware.de все это умеет делать на ура!
Если у Вас нет такого - запрос в приват ...

Добавлено: 27 Январь 2006, 8:22
Admin
Вот пример от Андрея Мялина ...
Все просто как двери :)

Добавлено: 27 Январь 2006, 15:51
Andrew™
Admin писал(а):Вот пример от Андрея Мялина ...
Все просто как двери :)
попал в десятку, пример показывает как по PROP:Handle контрола/окна залить его как картинку в файл ;)

Добавлено: 27 Январь 2006, 19:08
iBAH
начать можно так (это все API):
- узнать контекст окна, на котором находится контрол - GetDC(), GetWindowDC()
- создать compatible DC - CreateCompatibleDC
- создать битмап CreateCompatibleBitmap
- выбрать битмап SelectObject(CompatibleDC,CopmatibleBitmap)
- скопировать текущий DC в память BitBlt(текущий DC, ..., compatible DC,...,SRC_COPY)
Я сделал так...

Код: Выделить всё

OLE_hdc=CreateDC(disp)
OLEComp_hdc=CreateCompatibleDC(OLE_hdc)
GetWindowRect(?OLE1{Prop:Handle},address(Rect)) ! координаты control'а
BitMAP_h=CreateCompatibleBitmap(OLE_hdc, Rect._Right - Rect._Left, Rect._Bottom - Rect._Top)
SelectObject(OLEComp_hdc,BitMAP_h)
BitBlt(OLEComp_hdc,0,0,Rect._Right - Rect._Left,Rect._Bottom - Rect._Top,OLE_hdc,Rect._Left,Rect._Top,SRCCOPY)
OpenClipBoard(Window{prop:handle})
SetClipboardData('CF_BITMAP',BitMAP_h)
CloseClipboard()[
но в клипборд почему-то не копирует :(
может я прототипы не правильно описал:

Код: Выделить всё

    !эти взял из примера Андрея Мялина
    CreateDC(*CSTRING, ULONG=0 , ULONG=0 ,ULONG=0 ),UNSIGNED,PASCAL,RAW,NAME('CreateDCA')
    CreateCompatibleDC(UNSIGNED),UNSIGNED,PASCAL
    CreateCompatibleBitmap(UNSIGNED, SIGNED, SIGNED),UNSIGNED,PASCAL
    SelectObject(UNSIGNED, UNSIGNED),UNSIGNED,PASCAL
    BitBlt(UNSIGNED, SIGNED, SIGNED, SIGNED, SIGNED, UNSIGNED, SIGNED, SIGNED, ULONG),BOOL,PASCAL
    !эти сам писал, видимо здесь и напортачил....
    GetWindowRect(ULONG hWnd,LONG lpRect),BOOL,PASCAL
    OpenClipboard(ULONG hWnd),BOOL,PASCAL
    SetClipboardData(SIGNED, UNSIGNED),UNSIGNED,PASCAL
    CloseClipboard(),BOOL,PASCAL
Выставлял проверки на ошибки при создании битмапа, выбора объекта и т. д. ...молчит и буфер содержимого не меняет.
ImageEx от http://www.solidsoftware.de все это умеет делать на ура!
Если у Вас нет такого - запрос в приват ...
Очень симпотичный компонент... объясните пожалуйста как его заполучить... я здесь новичок
Вот пример от Андрея Мялина ...
Все просто как двери
Я уже видел этот пример, но не сразу разобрался...

Добавлено: 28 Январь 2006, 9:21
Admin
Очень симпотичный компонент... объясните пожалуйста как его заполучить... я здесь новичок
Зайти в приват и создать тему с запросом данной бибилотеки. Может быть у кого есть и народ зальет ...

Добавлено: 28 Январь 2006, 14:09
iBAH
Admin писал(а): Зайти в приват и создать тему с запросом данной бибилотеки. Может быть у кого есть и народ зальет ...
Я бы с удовольствием... только, при входе в приват мне пишут: "Извините, только пользователи со специальными правами доступа могут читать сообщения в этом форуме".
Если так попробовать:
http://forum.clarionlife.net/posting.ph ... topic&f=15 - то же самое... то есть сообщения я так понимаю мне статус не позволяет создавать.