2010-02-26 2 views
1

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

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

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

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

EDIT:

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

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

+0

Вам нужно сделать его подключаемым модулем Netscape? Если вы сделаете его подключаемым модулем WebKit, основным классом вашего плагина станет представление, поэтому вы можете просто отрегулировать рамку просмотра прокрутки, а затем добавить его как подвью. Нет необходимости в ручном рисовании или преобразовании событий. –

+0

@Peter, я НЕ ДУМАЮ, Я могу использовать WebKit с Firefox ... По крайней мере, когда я говорю об этом в Google, The Top 2 - это ссылки на меня, которые задают этот вопрос на форуме mozila без ответа ... B-) –

+0

Исправить. Чтобы поддерживать браузеры, отличные от WebKit, вам нужно написать подключаемый модуль Netscape. OTOH, если вы можете отказаться от таких браузеров и поддерживать WebKit, тогда вы можете написать его как подключаемый модуль WebKit. –

ответ

0

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

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

на 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]; 

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

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

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

0

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

Вы можете нарисовать представление в контексте, установив этот контекст в качестве текущего контекста и указав вид на рисование. You может сделать это как средство визуализации изображения, но в противном случае я не могу придумать причину сделать это. (Edit: OK, являющийся подключаемым модулем Netscape, вероятно, является веской причиной.)

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

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

+0

Проблема в том, что у меня нет HAVE вид. У меня есть контекст. Я думаю, что добавлю немного предыстории к исходному вопросу ... –

+0

Если у вас нет представления, рисовать его будет сложно. Когда у вас есть представление, вы можете нарисовать его в своем контексте, используя описанную мной процедуру. Конечно, вам все равно придется переводить события и отправлять их на просмотр. –

+0

Ну, как только у меня есть представление, я могу просто рисовать на вид, используя обычную нормальную процедуру рисования ... но да, проблема в том, чтобы получить представление. –

0

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

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

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

Похоже, но существует некоторая путаница координат относительно места происхождения. (верхнее и нижнее), и поскольку я уклоняюсь от содержимого в формате WHOLE WINDOW, я делаю некоторые вещи очень глобально, возможно, я должен делать больше локально. Например, представление никогда не исчезает, даже когда вы закрываете вкладку или переходите на другую вкладку. (он закрывается, когда вы закрываете окно, конечно)

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