2011-06-02 24 views
1

---------問題1 ---------- 也許我不明白框架對象完全(或者也許不正確,我環境中創建的),但我想實現鼠標事件我遇到了呼叫的情況:當使用initWithRect初始化時,NSTrackingArea會產生不同的結果:[self bounds]和[self frame]

trackingArea=[ [NSTrackingArea alloc] initWithRect:[self frame] options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil ]; 

不正確的跟蹤區域產生(僅限頂級右上角工作) - 調查問題,我發現'框架'開始在右上角的某個地方。此調用是在重載的initWithFrame中進行定義的:

glView = [ [ Lesson17View alloc ] initWithFrame:[ glWindow frame ] 
colorBits:16 depthBits:16 fullscreen:FALSE ]; 

其中glView是從NSOpenGLView中分類的。上面的調用是在awakeFromNib中完成的,glWindow被定義爲:

IBOutlet NSWindow * glWindow;

當我用框架替換界限時,我的應用程序工作 - 框架變量發生了什麼?

問題--------- ---------- 2

我的第二個問題涉及到如何處理鼠標事件,並正確地有我的OpenGL視圖,重繪 - 說我有:

- (void) mouseMoved:(NSEvent *)theEvent 
{ 
NSPoint location=[self convertPoint:[theEvent locationInWindow] fromView:nil]; 
// send NSPoint to a printGL function I have that uses texture maps to display text? 
} 

我猜我不應該送這呈現在我的OpenGL視圖,東西(因爲這並不做任何事情-guessing因爲每當我使用的drawRect無論我在鼠標中畫了一個功能事件被清除)。目前我所有的繪圖都是在drawRect中完成的(包含一堆openGL調用) - 在這一點上,適當的調用是什麼?

或者我應該設置一個標誌(以及設置一個實例變量NSPoint)爲true,這將允許printGL只在mouseMoved事件上調用(我知道 - 我將使用mouseEntered/Exited函數,但現在我'米試圖得到這個處理)。

+1

你應該把它分成兩個不同的問題。 – 2011-06-02 01:06:38

回答

3

視圖的框架是視圖位於其超級視圖中的位置。這意味着最重要的是,除非視圖的原點位於其超視圖的原點之上(即在{0, 0}),否則框架矩形將偏移該量。

一個視圖的界限是座標視圖內。除非您對視圖的座標系應用了一些變換,否則邊界原點始終爲{0, 0}

那麼,爲什麼這會影響你的情況呢?由於noted in the docs for NSTrackingArea,在跟蹤區域的所有者的座標系中,矩形被解釋爲座標。所有者的界限在其座標系中,而框架在所有者的超視圖的座標系中。所以你會從錯誤的座標系統中給出跟蹤區域。

我強烈建議您閱讀View Programming Guide。它解釋了所有這些和更多。 Cocoa視圖系統有許多細微的細節,當你編寫UI代碼時,你會想知道這些細節。

(還有你的第二個問題:告訴一個重繪的視圖,發送它[view setNeedsDisplay:YES]。)

+0

感謝您的視圖編程指南 - 我仍然困惑,爲什麼我的glView的框架有一個在超級視圖右上角的起源(它是用超級視圖的框架初始化的 - 所以我不明白爲什麼這些兩個值是不一樣的) 也 - 我不應該在我的mouseMoved方法中有任何opengl命令(或調用opengl)嗎?我應該設置將在drawRect被調用時使用的值(即,根據鼠標位置繪製某個標記的標記,這將被查詢)。 – Marm0t 2011-06-02 01:43:27

+0

好吧,我想我回答了我自己的問題 - glView的原因有幀偏移的原因是因爲超視圖被抵消(這是NSWindow的主要實例)... – Marm0t 2011-06-02 01:50:29

相關問題