2010-02-26 2 views
1

나는 NSGraphicsContext가 될 수있는 CGContext를 가지고있다. 컨텍스트에 대해 clipRect가있는 NSWindow가 있습니다.NSView를 NSGraphicsContext로 그립니까?

scrollview를 컨텍스트에 넣고 다른 일부보기를 scrollview에 넣으 려하므로 이미지를 넣을 수 있습니다 ... 그러나 컨텍스트에 scrollview를 첨부하는 방법을 알 수 없습니다.

결국보기가 펜촉에서 오는 것일 수 있지만 어떻게 될지는 알 수 없습니다.

나는이 스레드 (http://lists.apple.com/archives/quartz-dev/2006/Nov/msg00010.html)를 보았습니다.하지만 분명히 내가 놓치고있는 것이 아닌 한 그들은보기를 컨텍스트에 첨부하는 방법의 단계를 그만 두는 것처럼 보입니다.

편집 :

내가이 상황에있어 그 이유는 내가 모질라 플러그인을 쓰고 있다는 점이다. 브라우저는 나에게 CGContext (Quartz)와 WindowRef (QuickDraw)를 준다. CGContext를 NSGraphicsContext로 바꿀 수 있으며 windowRef를 NSWindow로 바꿀 수 있습니다. 다른 데이터 구조에서 클리핑 사각형도 있습니다 ...

필요에 따라 스크롤 막대를 사용하여 이미지를 그려야하고 버튼과 기타 UI 요소가 필요합니다. NSView ...

+0

Netscape 플러그인으로 변경해야합니까? 플러그인을 WebKit 플러그인으로 만들면 플러그인의 주요 클래스가 뷰가되므로 스크롤 뷰의 프레임을 조정 한 다음 하위 뷰로 추가 할 수 있습니다. 수동 드로잉 또는 이벤트 변환이 필요 없습니다. –

+0

@ 피터, 파이어 폭스에서 웹킷을 사용할 수 있다고 생각하지 않는다. 적어도 구글에서 최상위 2는 아무 대답없이 mozila 포럼에서 매우 질문하는 링크이다 ... B-) –

+0

수정하십시오. 비 WebKit 기반 브라우저를 지원하려면 Netscape 플러그 인을 작성해야합니다. OTOH, 그러한 브라우저를 포기하고 WebKit 만 지원할 수 있다면 WebKit 플러그인으로 작성할 수 있습니다. –

답변

0

(나를 내가 이런 짓을하고 구글이 내 자신의 질문에 다시 날 리드하는 방법을 잊어 버린 경우는) 여기에 내가이 일을 해요 방법은 다음과 같습니다

내 모든 경관을 감상 할 수있는 NIB을 가지고, 내가로드 이 시작에.

는 SetWindow에, 나는 클립 RECT를 설정하고 실제로 부착 할 :

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에서

, I 실제로 그립니다. IKImageView를 사용하기 때문에 문서화되지 않은 메서드를 사용할 수 있습니다. [imageView setImage : image]; NSImage를 사용합니다.

지금까지 이것이 나를 위해 일하는 것 같습니다. 희망적으로 이것은 다른 사람을 돕는다.

0

그래픽 컨텍스트에보기를 넣을 수 없습니다. 보기는 다른보기 또는 윈도우의 컨텐츠보기로 이동합니다.

컨텍스트를 현재 컨텍스트로 설정하고 뷰에 그리기를 지시하여 컨텍스트로 뷰를 그릴 수 있습니다. 은 뷰를 이미지로 렌더링하는 수단으로 사용하지만, 그렇지 않으면 이미지를 렌더링 할 이유가 없다고 생각합니다. (편집 : OK, Netscape 플러그인이 좋은 이유 일 수 있습니다.)

일반적으로보기는 이라고하는 lockFocus 메서드의 NSView 구현에서 자체 그래픽 컨텍스트를 가져옵니다. displayIfNeeded (보기가 분명히 표시되어야하는 경우에만 해당)으로 표시되며 이벤트 루프의 일부로 호출됩니다.

에 대해서는 의 컨텍스트를 만들 필요가 없습니다. 내가 언급 한 이미지 내보내기와 같은 매우 드문 경우를 제외하고는보기가 가능합니다. 일반적으로 뷰를 통해 뷰를 처리 할 수 ​​있습니다.

+0

문제는 내가 가지고 있지 않다는 것입니다. 관점. 나는 문맥이있다. 원래 질문에 뒷 이야기를 추가 할 것입니다. –

+0

보기가 없으면 그리기가 어려울 것입니다. 뷰를 얻은 후에는 앞서 설명한 절차를 사용하여 컨텍스트에 뷰를 그릴 수 있습니다. 물론 이벤트를 변환하여보기로 전송해야합니다. –

+0

글쎄, 일단보기가 있으면 일반 그리기 루틴을 통해 뷰를 그릴 수 있습니다 ...하지만 그래, 문제가 발생합니다. –

0

부분적인 해결책?

현재 내가 한 일은 NSScrollView 내부의 IKImageView에 단추가있는 펜촉을 만드는 것입니다. 내 플러그인에로드합니다.

그렇다면 NSWindow를 가지고 있기 때문에 윈도우의 contentView를 얻을 수 있습니다. 그런 다음 scrollview를 contentView의 하위 뷰로 추가합니다.

출처는 어디 까지나 혼란스러워 보입니다. (top vs bottom) 그리고 전체 윈도우의 contentview와 mucking하기 때문에, 나는 아마도 좀 더 지역적으로해야한다는 것을 매우 세계적으로하고 있습니다. 마찬가지로 탭을 닫거나 다른 탭으로 이동해도보기가 사라지지 않습니다. (물론 창을 닫을 때 닫힙니다.)

이렇게 합리적인 방법으로 들릴까요? 기분이 좀 ... 클루 지 ...미래 세대를 위해