Я хочу создать собственное окно, которое бы выглядело примерно так (не говоря уже о быстром фотошопе):
Основная проблема, которую я имею, состоит не в том, чтобы сделать окно прозрачным (хотя я думаю, что любая информация приветствуется!), А в том, что я хочу иметь возможность нажимать только на видимую часть кнопок. Например, если я нажимаю только за верхним левым краем кнопки «5», я хочу, чтобы он регистрировал нажатие кнопки «1», а не кнопки «5», даже если я нажал в ограничивающем поле кнопки 5. И если я щелкну только в стороне от верхнего левого «угла» кнопки «1», я хочу, чтобы он нажимал на то, что находится под моим окном, а не на кнопке. Мне также нужно иметь возможность изменить размер этого окна, и изображения в кнопках должны изменить их размер.
Я думал об использовании прозрачного NSWindow с прозрачными NSButtons, содержащими PNG с альфа-каналом для каждой кнопки, но я думаю, что перекрывающиеся кнопки будут проблемой.
Я также слышал о приложениях, таких как Bowtie, SweetFM и других, использующих WebKit для отображения своих интерфейсов. Если бы это было возможно по крайней мере на 10.3, это было бы интересно, но я не знаю, как это будет работать.
Я искал маски щелчков, области или что-то в этом роде, но пока ничего не нашел. Я буду обновлять этот пост по мере нахождения дополнительной информации (если я это сделаю!).
Любые советы о том, как действовать?
(Обратите внимание, что я работаю на 10.4 и в идеале Мне нужно также поддерживать некоторые более старые версии Mac OS X.)
(Кроме того, я нашел пример «закругленного окна» на сайте разработчиков Apple, но он больше не работает на 10.4, поэтому я не уверен, что это правильный путь.)
Заранее спасибо!
UPDATE:
(см. Обновление 2, теперь эта проблема исправлена)
Хорошо, теперь у меня немного другая (но не связанная) проблема. То, что я сделал до сих пор, это:
Я выбрал создание пользовательского элемента управления, который я смогу использовать для каждой из моих кнопок:
1 - Подкласс NSControl и переопределение drawRect, mouseUp, mouseDragged и mouseDown. Таким образом, я могу получить желаемое поведение при перетаскивании кнопки (переместить окно).
2 - Загрузить изображения для каждого состояния кнопки (одинаковой формы, но затемненной) в NSImages и нарисовать их в виде, используя compositeToPoint:fromRect:operation:
при необходимости. Изображения: 185 x 185 пикселей PNG-файлы с альфа , экспортированные из Photoshop.
3 - Получить растровое представление NSImage:
NSBitmapImageRep *bitRep = [[NSBitmapImageRep imageRepWithData:[unpressedImage TIFFRepresentation]] retain];
OR
NSBitmapImageRep *bitRep = [[unpressedImage representations] objectAtIndex:0];
Кажется, что оба дают одинаковый результат. Я попытался наложить это растровое изображение на свое окно, чтобы увидеть, имеет ли изображение тот же размер и выглядит ли оно как оригинал, и все ли это хорошо (вы поймете, почему я сделал это после этого перечисления ...).
4- В методах событий мыши я использую растровое представление, чтобы получить альфа-компонент для конкретной точки:
NSPoint mouse = [self convertPoint:[theEvent locationInWindow] fromView:nil]; // Returns the correct x and y positions on the control (i.e: between 0 and 185 for each axis).
NSColor *colorUnderMouse = [[[unpressedImage representations] objectAtIndex:0] colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
Затем я печатаю альфа-значение на консоль, но получаю очень странные результаты. На первый взгляд кажется, что получение альфа-компонента и цвета под мышкой работает (возвращенные цвета и альфа приведены в моем растровом изображении), но похоже, что цвет не выбран в нужной точке в bitRep
, или изображение, содержащееся в нем в bitRep
искажается (это не искажается, когда я комбинирую bitRep
в окне, что очень странно). Я снова проверил, что координаты мыши x и y были в диапазоне (0,185) и что размер NSBitmapImageRep
также равен 185 x 185.
Сначала похоже, что NSBitmapImageRep
перевернут горизонтально по сравнению с моим NSImage
. Если я переворачиваю мои координаты, возвращаемые значения кажутся в основном нормальными (кажется, что большая часть формы соответствует возвращаемым значениям), но все еще есть части изображения, которые возвращают неправильные значения.
На данный момент я ничего не понимаю и раньше никогда не работал с NSBitmapImageRep
, может быть, я просто забыл указать некоторую информацию о формате для моего изображения, из-за чего значения отключены. Может кто-нибудь уточнить это, пожалуйста?
Еще раз спасибо!
ОБНОВЛЕНИЕ 2:
Хорошо, неважно, я нашел проблему. Я использовал метод setColor: atX: y: чтобы нарисовать цветную точку на bitRep перед печатью в моем окне, и проблема была ясна как день: координата Y в bitRep инвертирована, но изображение печатается с «хорошим ориентация. Это означает, что bitRep имеет исходную систему координат верхнего левого угла в стиле «Windows», а окно имеет начало координат декартовой системы координат (внизу слева). Простое изменение координаты Y устранило проблемы, связанные с получением альфа-компонента и цвета.
Это должно быть написано где-то в документации, извините, что беспокою вас из-за моего отсутствия исследований ...!