Как получить скин виджета SWT?
Я хочу создать виджет SWT Scale с двумя / несколькими большими пальцами. Проблема в том, что я хочу, чтобы на каждой платформе был собственный скин, а не индивидуальный скин.
Практически, я хочу получить скин каждого компонента виджета и нарисовать их сам.
Есть идеи, как это сделать, или, может быть, альтернативное решение?
Спасибо!
4 ответа
У виджетов SWT нет скинов (как у виджетов Swing), они рисуются с помощью встроенного инструментария управления окнами (Win32, Gtk+ и т. Д.).
Посмотрите на Riena Look and Feel: http://wiki.eclipse.org/Riena_Look_and_Feel
Пока ответ Питера верен, вы можете попытаться сделать скриншоты Scale
с большими пальцами в разных позициях и накладывать их. См. http://tom-eclipse-dev.blogspot.com/2007/01/tableviewers-and-nativelooking.html для примера этой техники.
В Windows, прежде чем SWT реализует API для элементов управления рисованием: сначала проверьте, является ли приложение тематическим, а затем используйте тот или иной API рисования:
public void paintTheme(GC gc, Shell shell, Rectangle bounds)
RECT rect = new RECT();
rect.left = bounds.x;
rect.right = bounds.x + bounds.width;
rect.top = bounds.y;
rect.bottom = bounds.y + bounds.height;
if (OS.IsAppThemed()) {
int theme = OS.OpenThemeData(shell.handle, className);
OS.DrawThemeBackground(theme, gc.handle, partId, stateId, rect, null);
OS.CloseThemeData(theme);
} else {
OS.DrawFrameControl(gc.handle, rect, uType, uState);
}
}
Имена классов и идентификаторы частей и состояний можно найти по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/bb773210%28v=vs.85%29.aspx а также типы и состояния для не тематических API по http://msdn.microsoft.com/en-us/library/dd162480%28v=vs.85%29.aspx
Обратите внимание, что не все элементы управления имеют не тематический тип. Я считаю, что большой палец для шкалы должен быть кнопкой в не тематических приложениях.
Поскольку ссылки выше не дают вам значения для детали, состояния и значения типа, я предлагаю получить их из заголовочных файлов winuser.h и vsstyle.h.
Изменить: для масштаба, в не тематических приложениях, я полагаю, вы должны использовать кнопку для большого пальца. Кроме того, я забыл упомянуть, что здесь используется недокументированный API, и он не переносимый.