Сочетание эффектов Aero Glass и SWT - PullRequest
6 голосов
/ 02 сентября 2010

Как домашний проект, я играл с концепцией интеграции эффектов Aero Glass в мое приложение SWT. Лукаш Милевски имеет отличный пост в блоге , объясняющий, как это можно сделать, что в значительной степени сводится к следующему:

final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FormLayout());
final MARGINS margins = new MARGINS();
margins.cyTopHeight = -1;

final Composite c = new Composite(shell, SWT.NORMAL);
c.setBackground(new Color(shell.getDisplay(), new RGB(0, 0, 0)));
final FormData fd = new FormData();
fd.top = new FormAttachment(0, 0);
fd.left = new FormAttachment(0, 0);
fd.right = new FormAttachment(100, 0);
fd.bottom = new FormAttachment(100, 0);
c.setLayoutData(fd);

OS.DwmExtendFrameIntoClientArea(shell.handle, margins);

shell.open();
while (!shell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
}

Это прекрасно работает, пока вы не захотите добавить элемент управления.В результате черный цвет остается прозрачным:

Transparent shell with control

Последующий пост также демонстрирует, как это сделать, но требует изменения библиотеки SWT.(По крайней мере, я так считаю, потому что закрытые функции SWT переопределяются с @Override.)

Как можно избежать прозрачности элементов управления?Еще лучше: как я могу извлечь выгоду из прозрачности (например, поместив изображения на нее , например ), но используя ее разумным образом?

Ответы [ 3 ]

2 голосов
/ 10 сентября 2010

Переопределенные методы являются "пакетными". Чтобы переопределить их без ошибок времени компиляции, вы должны поместить ваши классы в тот же пакет, что и суперкласс, то есть org.eclipse.swt или org.eclipse.swt.widgets пакет. В блоге, который вы цитируете, на самом деле упоминается эта деталь реализации в конце, так что я не знаю, это действительно отвечает на ваш вопрос.

0 голосов
/ 09 сентября 2010

Вас беспокоит решение, которое переопределяет внутренние методы, но вы в первую очередь используете внутренний класс SWT.Это выглядит как очень хакерский хрупкий способ (по крайней мере, в текущей реализации SWT) добавить немного привлекательности в ваше приложение ... Я надеюсь, что вы не делаете это в рабочем коде.

0 голосов
/ 09 сентября 2010

Переместите элемент управления за пределы области стекла или попробуйте использовать принудительный цвет фона для элемента управления.

...