Я ищу, чтобы сделать пользовательское окно, которое будет выглядеть примерно так (не возражаете быстрый Photoshop):Как создать прозрачное окно с непрямоугольными кнопками?
alt text http://i35.tinypic.com/20ff803.png
Основная проблема, которую я не сделать окно прозрачным (хотя я предполагаю, что любой информация приветствуется!), но я хочу, чтобы иметь возможность нажимать только на видимую часть кнопок. Например, если я нажимаю только левую верхнюю часть кнопки «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];
ИЛИ
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
, прежде чем, возможно, просто забыл указать некоторую информацию о формате моего изображения, из-за чего значения отключены. Может ли кто-нибудь прояснить это, пожалуйста?
Еще раз спасибо!
UPDATE 2:
Ok никогда не возражаете, я нашел проблему. Я использовал метод setColor: atX: y: для рисования цветной точки на битрейдере перед ее печатью в моем окне, и проблема была понятна как день: координата Y была обращена в битRep, но изображение печатается с помощью «хорошего "ориентация. Это означает, что битRep имеет «начальную» систему координат «в стиле Windows», а окно имеет декартовую систему координат (внизу слева). Простое изменение моей координаты Y зафиксировало проблемы, с которыми я получил альфа-компонент и цвет.
Это, должно быть, было написано где-то в документах, извините, что беспокоило вас из-за моего отсутствия исследований ...!
Спасибо, это было бы возможно для центральной кнопки, но с внешними кнопками, которые были бы более сложными и требовали бы кучу кода проверки границ ... что, если я по какой-то причине поменяю позиции моей кнопки?(это не личный проект, поэтому, к сожалению, это может быть изменено). Затем мне пришлось бы переписать большую часть моего ограничивающего кода проверки. Будет ли способ сделать это с помощью какой-то маски? Скажите, «дайте клику пройти, если растровое изображение прозрачно в этот момент»? – Form
Я не думаю, что вы можете сделать это с помощью маски, как вы думаете (обнаружение прозрачности и т. Д.). Это довольно простые формы (частичные кружки для внешних кнопок под полным кругом для внутреннего). Вы можете получить доступ к текущим координатам и размерам элементов управления в коде и использовать их для вычисления границ попадания, чтобы вы не делали что-то жесткое. Используйте тот факт, что центральная кнопка находится на вершине в ваших интересах. –
Можно использовать обнаружение прозрачности (альфа), и оно работает очень хорошо, и хотя метод, который я использую сейчас, составляет 10.4+, есть способ сделать это, используя что-то другое, чем colorAtX: y: до тех пор, пока у вас есть доступ к bitmapRep, как указал маджудз. – Form