Как создать прозрачное окно с непрямоугольными кнопками?

Статический анализ, который находит реальные ошибки, стоит того независимо от того, является ли это C++ или нет. Некоторые склонны быть довольно шумными, но если они могут поймать тонкие ошибки как сравнения со знаком/неподписанные, вызывающие оптимизацию, которая взламывает Ваш код или за пределы доступы к массиву, они определенно стоят усилия.

7
задан Glorfindel 29 April 2019 в 07:03
поделиться

4 ответа

А как насчет переопределения методов событий NSResponder ( mouseUp: , mouseDown: и т. Д.) В пользовательских кнопках (предположительно вы бы создали подкласс NSControl или NSButton , чтобы сделать их)? С помощью этих методов вы могли бы правильно рассчитать свой ограничивающий прямоугольник (или круг, в данном случае) и выполнить простой тест на попадание с координатами щелчка, чтобы увидеть, следует ли обрабатывать щелчок.

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

3
ответ дан 7 December 2019 в 03:18
поделиться

Как насчет того, чтобы сделать все это единым контроль? Это может немного усложнить рисование, но похоже, что вы все равно делаете нестандартное рисование.

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

В качестве альтернативы,

2
ответ дан 7 December 2019 в 03:18
поделиться

Подобно ответу Марка W, в вашем собственном методе событий вы можете проверить альфа-значение для растрового изображения, по которому щелкнули мышью, и игнорировать, если альфа-канал ниже определенного значения.

Чтобы получить растровое изображение, прочтите this .

Теперь у вас должен быть указатель растрового изображения, подобный этому (псевдокод - вам нужно будет заполнить части):

pixels = CGBitmapContextGetData( ctx ); // there's actually two ways to get pixels in the above Apple tech note

Затем вы можете сделать это, чтобы получить интересующий вас пиксель, и проверьте это:

// I'm assuming each pixel is 24 bits of color and one byte of alpha
#define getRed(p) ((p) & 0x000000FF)
#define getGreen(p) ((p) & 0x0000FF00) >> 8
#define getBlue(p) ((p) & 0x00FF0000) >> 16
#define getAlpha(p) ((p) & 0xFF000000) >> 24

CGPoint pixPt;
long pixel;
pixPt = getMouseClick();

pixel = pixels[pixPt.x + pixPt.y * bytesPerRow];

if (getAlpha(pixel) < 25)
  // you've clicked on transparent pixels, alpha of 10% or less (alpha ranges from 0-255)

Это открывает для вас некоторые возможности, такие как создание кольца вокруг вашего внутреннего круга, которое инертно и не принадлежит ни одному из квадрантов или среднему кругу. Конечно, всегда есть другие способы сделать это, не прибегая к пиксельной обработке: -)

2
ответ дан 7 December 2019 в 03:18
поделиться

Если вы генерируете фигуры в коде с помощью NSBezierPath, проверка того, находится ли щелчок внутри одной из фигур, является однострочным: отправьте фигуру containsPoint: message.

Я бы сделал это единственное представление, которому принадлежат пять путей. Рисуя, рисуйте центр в последнюю очередь; при ответе на событие мыши сначала проверьте его. Дайте этому представлению одно свойство действия на сегмент и, при желании, одну цель на сегмент, в зависимости от того, что вам нужно.

1
ответ дан 7 December 2019 в 03:18
поделиться