介绍
一个应用在屏幕上显示多个窗口,而这些窗口必须可以被管理还有能相互合作。window对象是在屏幕最上层的window响应的。window最重要的两个功能就是:(1)提供一个区域给去放置views (2)可以通过键盘或者鼠标传送用户的动作分发或者接受事件。在使用中的window有时候饮用APPlication Kit的类,有时候引用window服务者的设备,意味着尝试把上下文清空。Panels是一种特殊类型的window,提供一种特别的辅助功能,就好像实用的windows。
windows是怎么工作的
NSWindow类是定义一些实例对象去管理和协调一个应用的windows显示在屏幕上。AppKit也还定义了一个抽象的NSWindow子类-NSPanel——添加更多合适的动作给辅助的windwo。
一个NSWindow实例被定义为围绕整个窗口的一个长方形的边框,包括它的标题栏,还有外围的组件(例如:调整大小的控制器 ),还有一个包围内容的长方形内容框。在屏幕坐标系中,两个长方形都是特殊定义的,并且都是整形的数值。长方形的边框是建立在windwo的基础坐标系中。这个坐标系通常在直线上增长并且在同一个坐标系中衡量(换句话说,基础的坐标系是不能旋转或者放大的)。基础坐标系的原点实在窗口长方形边框的左下角。
需要注意的是,你使用Xib创建windows,会允许你去摆放他们的位置,设置很多关于它们的属性,还有布局。你用代码去创建windows跟多的时候是包括把它们拿进拿出屏幕;动态改变属性,就好像标题栏;运行模态的windows去限制用户的输入;分配一个delegate去准确监控window的动作,比如说关闭,移动,改变大小。
通常你可以用代码创建一个窗口,用规定的初始化方法,还有其它的属性,大小,在内容边框的位置。长方形的边框是衍生于二位的长方形内容。
当一个window被创建了,他会自动创建两个view,一个不透明的有边框的view,填充了长方形边框区域,绘制了边界的,有标题栏,其它外围的组建,还有背景,还有一个透明的内容view,用长方形内容填充。边框的view还有它的外围组件都是私有的类,你的应用程序是不能直接访问的。内容view是window能访问到最高层次的图层,你可以用一个你自己创建的view用setContentView:
的方法代替了内容view。window决定了放置什么在内容view。你不能用开始用NSView的setFrame:
方法去放置它,你必须使用NSWindow
类的放置方法。
你把其他的view作为window的内容view 的子view或者内容view的子view的子view,还有等等等,通过NSView的addSubView
方法添加。这些view的树形结构称为window的视图层次。当一个window被告知需要显示它自己的时候,它通过发送display
消息去在它图层层次最高层次的view去实现这个动作。因为显示在确定的顺序进行,内容视图(这是先绘制)可以由它的子视图的全部或部分遮挡,而这些子视图的子视图可以遮蔽(等等)。
一个窗口是怎么显示的
通过它的view对象绘制实现显示一个NSWindow的类,积累着window的显示缓存或者立刻显示在屏幕上。像NSView对象,可以无条件或仅显示标记为需要显示,使用显示和setviewsneeddisplay
方法,分别为。一个displayifneeded
信息使窗口的看法只有他们被标记为需要显示。通常情况下,任何时间视图被标记为需要显示时,窗口会注意到这个事实,并自动显示在其后不久。这种自动显示通常是在每一个经过的事件循环,但可以关闭使用setautodisplay:
方法。如果你关闭一个窗口澳地数显,你则负责显示它在必要的时候。
一个窗口的视图可以同时绘制。你可以使用的方法allowsconcurrentviewdrawing
和setallowsconcurrentviewdrawing:
确定和设置,分别,是否一个窗口绘制其观点的同时。默认情况下,一个窗口的视图被同时绘制。
通过事件循环每一通,应用对象调用其updatewindows
方法,发送更新消息的每一个窗口。子类可以重写此方法以NSWindow检查应用程序的状态和改变自己的状态或出现相应地启用或禁用菜单,按钮,和基于对象的选定的其他控件,例如,除了在屏幕上显示自己,一个窗口可以打印自己的全部,只是作为一个视图可以。print:
方法运行该应用程序的打印面板,并导致窗口的框架视图打印自己。datawithepsinsiderect:
同样的行为。对于其他信息,请参阅打印编程指南。
模态窗口是怎么工作的
你可以使用整个window或者嵌套运行在application-modal模式。使用当前应用程序的普通进程但会限制输入到窗口或者嵌套窗口。模态操作对于窗口或者嵌套窗口需要吸引用户注意的时候来说是非常有用的。例如包括显示错误消息,或者警告,还有就是需要输入的操作。例如打开一个对话,或者需要应用在多窗口的对话。
这里有两个机械装置去操作一个模态的窗口或者嵌套窗口。第一,最简单的就是调用NSApplication里面的runModalForWindow:
方法,这个方法完全垄断了时间传递,出了当前这个特殊的窗口,或者直到stopModal
,abortModal
,stopModalWithCode
其中一个方法被调用,一般情况都是通过按钮的动作去响应的。stopModal
方法在进程里面结束窗口或者嵌套窗口的模态状态。它不会在一个定时器结束后触发的动作或者一个分发的类里面起作用,因为这些机械的装置都在事件进程的外部。为了终止这些模态的进程,你可以使用abortModal
。这stopModal
方法一般情况下在用户点击Ok按钮的时候调用,abortModal
当用户去点击Cancel按钮的税后被调用。这两种方法等效于stopModalWithCode:
使用合适的表达式。
注意:您可以为一个视图对象编写一个模态事件循环,这样对象就可以访问与特定任务相关的所有事件,比如在视图中跟踪鼠标。例如,在创建自定义视图时看到“响应用户事件和行为”。
普通的模态窗口的行为是拒绝其他窗口或者嵌套窗口去接受事件响应。