SWT: Как «рендерить» виджет в фоновом режиме / в закадровом буфере

Буду очень признателен за совет и помощь:

Как я могу визуализировать виджет/компонент SWT в ФОН (закадровый буфер?) и получить «нарисованные» пиксели, которые были нарисованы виджетом/компонентом, чтобы сохранить их на жестком диске:

Что у меня есть на данный момент:

Display display = new Display();
Shell shell = new Shell(display);
// ...  
MyWidgetComponent mwc = new MyWidgetComponent(shell, SWT.BORDER); 
shell.open();
Image screenshot = new Image(shell.getDisplay(), shell.getBounds());
GC.copyArea(screenshot, 0, 0);
//...

Проблема: Снимок экрана самой оболочки/виджета работает, но он открывает новое окно на панели задач. Это то, чего я НЕ хочу.

Чего я хочу добиться, так это: я хочу полностью запустить это приложение в фоновом режиме как «серверное приложение» (например, встроить и вызвать это в сервлет). Таким образом, MyWidgetComponent должен отображаться попиксельно полностью во внеэкранном буфере, а позже я извлекаю пиксели и сохраняю их на жесткий диск или напрямую возвращаю визуализированный виджет в виде изображения в результате запроса сервлета. (Я не хочу открывать какие-либо окна в среде сервера, если это может быть сервер Windows...).

Как я могу этого добиться. Я много искал, но не нашел ничего полезного.

Большое спасибо!! Ян


person jan    schedule 03.12.2009    source источник


Ответы (1)


Я не могу ответить на ваш вопрос напрямую, но я столкнулся с похожей проблемой, с которой я боролся: сделать снимок экрана Shell или Widget, когда он закрыт от просмотра.

Рассмотрим, например, окно A, которое перекрывает окно B. Скриншот сделан из B с использованием вашего кода:

Image screenshot = new Image(shellB.getDisplay(), shellB.getBounds());
GC.copyArea(screenshot, 0, 0);

Мои выводы показали, что это можно сделать в Windows Vista, Windows 7 и Mac OS X (хотя я не уверен в последней). Однако в Windows XP, Linux с GNOME и Linux с KDE снимок экрана содержит белую область, где перекрывающееся окно мешает обзору.

Я не нашел решения для этого, и я подозреваю, что это не только зависит от платформы поведения, но и довольно глючит в SWT.

Я хотел бы услышать, что я не в тему, хотя!

person Paul Lammertsma    schedule 08.12.2009
comment
Добрый день, Павел! Большое спасибо за ответ!! Ваш ответ очень интересно читать. Я сделал аналогичный опыт (который может быть очевиден для экспертов, но не для меня), который делает рендеринг на стороне сервера еще более проблематичным: как описано выше, окно всегда будет всплывать, но это окно не только всплывает, оно также должно быть VISIBLE/MAXIMIZED и не может быть свернута (чтобы отображался только значок в трее/панели задач), так как в свернутом состоянии я также получаю дамп белого экрана. Таким образом, это означает, что окно должно отображаться полностью, что еще хуже в серверной среде. - person jan; 09.12.2009
comment
Кажется, это последнее слово, что касается SWT. Обратите внимание, что вы можете обойти это с помощью JNI/JNA, обратившись к Windows API или вызвав собственные методы Mac. Не очень гламурно, но это может просто сделать работу. - person Paul Lammertsma; 18.12.2009
comment
Это должна быть ошибка, поднятая против SWT. Я просто трачу на это 5 часов, и у меня была та же проблема. - person Phil; 27.12.2010