[Cocoa]使用代码创建窗口
来源:互联网 发布:国立清华大学 知乎 编辑:程序博客网 时间:2024/05/21 15:07
原文链接:http://www.cocoachina.com/b/?p=123
这次主要讲解一下如何通过编写代码的方式来实现一个窗口程序,
当然这个程序十分的简单, 不过它演示了一些我们应该了解的东西,
因此应该可以更好的帮助我们了解 XCode 和 Interface Builder 为我们的开发工作做了哪些工作。
大部分讲解 Cocoa 编程的书都会用到 Xcode 和 Interface Builder,这两个工具的结合是开发 Cocoa 应用程序的最佳选择,
但是当中往往隐藏了许多细节的东西,为了对 Cocoa 的运作方式有更好的了解,
我决定用代码来实现一些 Interface Builder 中 Nib 文件实现的部分功能,以此来研究 Cocoa 的运作方式。
下面我们先看看这个最简单的 HelloWin.m 的源代码。
#import <Cocoa/Cocoa.h> int main(int argc, char* argv[]){ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSApplication* app = [NSApplication sharedApplication]; //Create the main window NSRect rc = NSMakeRect(0, 0, 800, 600); NSUInteger uiStyle = NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask; NSBackingStoreType backingStoreStyle = NSBackingStoreBuffered; NSWindow* win = [[NSWindow alloc] initWithContentRect:rc styleMask:uiStyle backing:backingStoreStyle defer:NO]; [win setTitle:@"HelloWin Test"]; [win makeKeyAndOrderFront:win]; [win makeMainWindow]; //Start the event loop by calling NSApp run [NSApp run]; [pool drain]; return 0;}编译命令如下:
gcc HelloWin.m -framework Cocoa -o HelloWin
所有的 Cocoa 程序都要连接 Cocoa 这个 Framework,
Cocoa Framework 会自动引用其他需要的 framework,比如Foundation Framework。
这个编译指令生成的程序名字叫 HelloWin, 你可以通过在终端下执行下面的命令来看看这个程序的运行情况。
./HelloWin
窗口显示如下
你会发现这个程序在 Dock 上面没有图标,在菜单栏上没有菜单,虽然你可以关掉这个窗口,
但是在终端的提示中可以看到这个应用程序没有退出,现在在终端按 ctrl+c 结束这个应用程序。
下面来具体看一下这个简单的程序,首先我们 import 了 Cocoa 这个 Framework,然后创建了一个 NSAutoreleasePool 的实例,
接下来我们通过 NSApplication 的类方法 sharedApplication 得到了一个 NSApplication 对象,
并将这个对象赋给一个 NSApplication 类的实例, 其实这个赋值是不需要的,
因为在调用 sharedApplication 的时候,Cocoa 设置了另外一个全局的 NSApplication 对象的实例,NSApp,
所以你可以看到在后面调用 run 方法的 Receiver 是 NSApp,而没有用 app。
所以你可以简单的在这里直接调用 [NSApplication sharedApplication];
以后在需要 NSApplication 对象的时候直接使用 NSApp 就可以了。
在得到了 NSApp 之后,程序开始创建窗口,因为这个是窗口也是程序的主窗口(mainWindow),
所以在创建这个窗口的时候,针对窗口的 styleMask 也需要满足一定的条件。
如果一个窗口想成为主窗口,必须是具有标题 (NSTitleWidowMask) 或者拥有可改变大小属性 (NSResizableWindowMask)。
另外如果你希望这个窗口能够被关掉,那么 NSClosableWindowMask 也是需要的,
否则尽管这个窗口能显示出来, 但是你会发现标题栏上的关闭按钮是灰色的。
在初始化窗口之后,通过 setTitle: 设置窗口的标题,对 makeKeyAndOrderFront: 的调用是一个关键,
因为一个窗口想成为 mainWindow,必须是可见的,在调用这个方法之后,
我们就可以通过 makeMainWindow: 方法来让这个窗口成为程序的主窗口。
在有了主窗口之后, 我们可以调用 NSApplication 的 run 方法来启动程序的消息循环,
到这时应用程序就开始运行了, 也能接受各种应用程序或者窗口的事件了。
这里有个地方需要提示一下,我们在代码中看到设定的初始 Rect 起点是(0,0),但是却显示在屏幕的左下角,
这个问题是因为 Mac 上缺省的坐标系与 Windows下面的不同,Mac 上的坐标系原点在屏幕的左下角,
所以整个屏幕是处于第一象限的,这与我们在中学时候学到的知识是一致的,以后会讲到这个问题的。
不过目前这个程序不能关闭,这是因为我们还没有处理相应的事件来让应用程序退出,这个问题我们下次在说。
如果有兴趣,你可以去论坛深度讨论这个问题:
http://www.cocoachina.com/bbs/read.php?tid-23.html
- [Cocoa]使用代码创建窗口
- Cocoa创建与使用Framework
- Directx09 创建窗口代码
- 关于Cocoa的窗口创建调用-一个nib包含两个窗口
- 关于Cocoa的窗口创建调用-一个nib包含两个窗口
- 关于Cocoa的窗口创建调用-一个nib包含两个窗口
- 关于Cocoa的窗口创建调用-一个nib包含两个窗口
- 使用API创建窗口
- 使用API创建窗口
- 使用screen创建窗口
- 创建窗口代码分析一
- 创建窗口代码分析二
- win32的创建窗口代码
- 使用Xcode创建Cocoa Touch Static Library(静态库)
- 使用xcode 6创建dynamic framework(cocoa touch framework)
- [Cocoa]_[初级]_[使用NSXMLElement 创建一个XML文件]
- [Cocoa]_[初级]_[使用NSOutlineView创建多根显示]
- 使用win32窗口句柄创建SDL窗口
- UVA 10867 Cutting a Polygon
- HDU1520:Anniversary party(树形DP)
- 深入.NET DataTable
- ORA-01779错误的处理方法
- json-lib与jackson的比较
- [Cocoa]使用代码创建窗口
- dokan 开发实战
- ubuntu 下 python numpy,scipy,matplotlib安装
- Java 大数类
- C++第一课
- tcp accept函数
- crontable中的百分号“%”问题
- linux常用端口对照
- 构建Node.js应用的10个重要的方面