Рисовать NSView в NSGraphicsContext? - PullRequest
1 голос
/ 26 февраля 2010

У меня есть CGContext, который я могу превратить в NSGraphicsContext. У меня есть NSWindow с clipRect для контекста.

Я хочу поместить вид прокрутки в контекст, а затем какой-то другой вид в вид скролла, чтобы я мог вставить в него изображение ... Однако я не могу понять, как добавить вид прокрутки в контекст.

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

Я видел эту ветку, (http://lists.apple.com/archives/quartz-dev/2006/Nov/msg00010.html) Но они, кажется, не учитывают, как прикрепить представление к контексту, если нет чего-то очевидного, что я упускаю.

РЕДАКТИРОВАТЬ:

Причина, по которой я нахожусь в такой ситуации, заключается в том, что я пишу плагин Mozilla. Браузер дает мне CGContext (Кварц) и WindowRef (QuickDraw). Я могу превратить CGContext в NSGraphicsContext, и я могу превратить windowRef в NSWindow. Из другой структуры данных у меня также есть обтравочный прямоугольник ...

Я пытаюсь нарисовать изображение в этом контексте, с необходимыми полосами прокрутки, кнопками и другими элементами пользовательского интерфейса ... поэтому мне нужен (хочу) NSView ...

Ответы [ 3 ]

0 голосов
/ 02 марта 2010

Частичное решение?

В настоящее время я создал перо с кнопкой в ​​IKImageView внутри NSScrollView. Я загружаю это в свой плагин.

Тогда, поскольку у меня есть NSWindow, я могу получить contentView окна. Затем я добавляю представление прокрутки как подпредставление contentView.

Похоже, но, похоже, существует некоторая путаница в отношении того, где находится источник. (сверху вниз), и так как я копаюсь с представлением содержимого ВСЕГО ОКНА, я делаю кое-что очень глобально, что, возможно, я должен делать более локально. Например, представление никогда не исчезает, даже когда вы закрываете вкладку или переходите на другую вкладку. (он закрывается, конечно, когда вы закрываете окно)

Итак, это звучит как разумный способ сделать это? он чувствует себя немного ... грязный ...

0 голосов
/ 04 марта 2010

Для будущих поколений (и я, когда я забываю, как я это сделал, и Google возвращает меня к моему собственному вопросу) Вот как я делаю это:

У меня есть NIB со всеми моими представлениями, я загружаю его при запуске.

в SetWindow, я устанавливаю прямоугольник клипа и фактически выполняю прикрепление:

NP_CGContext* npContext = (NP_CGContext*) window->window;   
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:npContext->window] autorelease];

NSView* cView = [browserWindow contentView];
NSView* hitView = [cView hitTest:NSMakePoint(window->x + 1, clip.origin.y + 1)];
if (hitView == nil || ![[hitView className] isEqualToString:@"ChildView"]) 
{
    return;
}

superView = [hitView retain];

[superView addSubview: topView];

[superView setNextResponder: topView];
[topView  setNextResponder: nil];
[browserWindow makeFirstResponder: topView];

Чтобы убедиться, что я добавляю SubView только один раз, у меня есть флаг ...

А затем в handleEvent я фактически рисую, поскольку я использую IKImageView, я могу использовать недокументированный метод: [imageView setImage: image]; который принимает NSImage.

Пока, похоже, это работает для меня. Надеюсь, это поможет кому-то еще.

0 голосов
/ 27 февраля 2010

Вы не можете поместить представление в графический контекст. Представление переходит либо в другое представление, либо как представление содержимого окна.

Вы можете нарисовать вид в контексте, установив этот контекст в качестве текущего контекста и указав вид для рисования. Вы могли бы сделать это как средство визуализации изображения, но в остальном я не могу придумать причину сделать это. (Правка: ОК, вероятно, хорошей причиной является плагин Netscape.)

Обычно представление получает свой собственный графический контекст в реализации NSView метода lockFocus, который вызывается для вас display, который вызывается для вас displayIfNeeded (только если представление требует отображения, очевидно, ), который вызывается для вас как часть цикла событий.

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

...