Снимок экрана из программы

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Снимок экрана из программы

Сообщение Игорь Столяров »

Привет всем !

Помню, что когда-то этот вопрос обсуждался, но не помню нашли ли решение ... ;)
Подскажите пожалуйста, можно ли сделать из программы на Clarion снимок текущего экрана ?
Желательно, что бы без внешних (и тем более платных) библиотек.

Заранее спасибо. :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Снимок экрана из программы

Сообщение Дед Пахом »

мы пользовались FreeImage, думаю, на чистом API будет муторно всё это делать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Снимок экрана из программы

Сообщение Игорь Столяров »

Чудесно. Можно ли просить пример выполнения снимка экрана на FreeImage ? ;)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Снимок экрана из программы

Сообщение Дед Пахом »

Достаточно давно было... Вот вроде кусок, позволяющий сохранить снимок окна (WinCapture) и затем показать его в Image-контроле (Display):

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

BugZapperClass.Construct    PROCEDURE()
  CODE
  SELF.FreeImage &= NEW FreeImageClass
  
BugZapperClass.Destruct PROCEDURE()
  CODE
  DISPOSE(SELF.FreeImage)
  
  REMOVE(sImageFile)
  
BugZapperClass.WinCapture   PROCEDURE(WINDOW pWin)
  CODE
  SELF.FreeImage.CaptureScreen(pWin)

BugZapperClass.Display  PROCEDURE(WINDOW pWin, LONG pImgCtrlFeq)
  CODE
  SELF.FreeImage.iImage.CopyToImageControl(pWin, pImgCtrlFeq)
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Снимок экрана из программы

Сообщение Дед Пахом »

посмотрел файл FreeImCl.clw, метод CaptureScreen имеет 2 варианта: (Window w) и (UNSIGNED hwnd), так что для снимка экрана наверно подойдёт вызов CaptureScreen(0)
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Снимок экрана из программы

Сообщение Игорь Столяров »

Понял, спасибо. Поставлю FreeImage и буду рыть в этом направлении. :)
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Снимок экрана из программы

Сообщение Игорь Столяров »

Дед Пахом писал(а): так что для снимка экрана наверно подойдёт вызов CaptureScreen(0)
Спасибо, но не совсем так. Т.к. примеров снимка экрана в FreeImage нет, вот пример этого кода.
Может кому-нибудь и пригодится, хорошая опция для запросов "непродвинутых" юзеров в тех. поддержку ... ;)

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

CapScreen  PROCEDURE  (hWindow_)

theImage    cfiImageControl
Window WINDOW,AT(,,1,1),SYSTEM,GRAY,MDI
       region,AT(0,0),USE(?ImageControl),FULL
     end

  Code
  
  Open(Window)
  Window{Prop:Hide} = True

  If theImage.iImageControl.Init(?ImageControl) <> False
     theImage.iImage.CaptureScreen(Int(hWindow_))
     theImage.iImage.SetSaveOption(JPEG_QUALITYSUPERB)
     If theImage.iImage.SaveAs('C:\CaptureScreen.jpg') = False then Message('Ошибка сохранения картинки !').
  end

  Close(Window)
  
  ! Пример вызова - сделать снимок главного окна программы
  Start(CapScreen,25000,AppFrame{Prop:Handle}) 
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5239
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Снимок экрана из программы

Сообщение finsoftrz »

Да и на win api это достаточно просто делается. Где-то в архивах на этом форуме был класс Андрея Мялина для сохранения снимка окна в bmp-файл. Я использую эту функцию в 3 случаях.
1. Во всех окнах на горячих клавишах. Кроме снимка окна выводится имя app и имя процедуры (чтобы быстро найти в app).
2. Просмотр экрана другого работающего в программе пользователя.
3. Автоматическая отправка содержимого экрана через ftp во встроенной системе суппорта.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Снимок экрана из программы

Сообщение Игорь Столяров »

Ну да, всегда приятно когда есть категории людей у которых мысли сходятся ... ;)
Мы просто делаем снимок главного окна со всем его содержимым и отправку в почту с описанием.
В принципе, если посмотреть исходники FreeImage - эти операции все на WinAPI + приятный бонус
в виде сохранения рисунка в JPG одной строкой кода. :)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5239
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Снимок экрана из программы

Сообщение finsoftrz »

Я перед отправкой зипую с помощью zlib. Тоже одной строчкой. При приеме автоматически распаковываю. Была еще мысль дать возможность пользователям накидать на снимок пояснений. Но, поскольку оказалось, что функционал мало востребован, отложил в долгий ящик...
C6/C12, ШВС, tps/btrieve.
Ответить