Cocoa系列教学一:使用代码创建窗口
2009-06-11 19:24
447 查看
作者:Cocoachina特约作者Younker
这次主要讲解一下如何通过编写代码的方式来实现一个窗口程序, 当然这个程序十分的简单, 不过它演示了一些我们应该了解的东西,因此应该可以更好的帮助我们了解XCode和Interface Builder为我们的开发工作做了哪些工作。
大部分讲解Cocoa编程的书都会用到Xcode和Interface Builder,这两个工具的结合是开发Cocoa应用程序的最佳选择, 但是当中往往隐藏了许多细节的东西,为了对Cocoa的运作方式有更好的了解,我决定用代码来实现一些Interface Builder中Nib文件实现的部分功能,以此来研究Cocoa的运作方式。
下面我们先看看这个最简单的HelloWin的源代码。
#import
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
窗口显示如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015036/f36b162f98aff396a580b8032a4afdb2.png)
你会发现这个程序在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
这次主要讲解一下如何通过编写代码的方式来实现一个窗口程序, 当然这个程序十分的简单, 不过它演示了一些我们应该了解的东西,因此应该可以更好的帮助我们了解XCode和Interface Builder为我们的开发工作做了哪些工作。
大部分讲解Cocoa编程的书都会用到Xcode和Interface Builder,这两个工具的结合是开发Cocoa应用程序的最佳选择, 但是当中往往隐藏了许多细节的东西,为了对Cocoa的运作方式有更好的了解,我决定用代码来实现一些Interface Builder中Nib文件实现的部分功能,以此来研究Cocoa的运作方式。
下面我们先看看这个最简单的HelloWin的源代码。
#import
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
窗口显示如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015036/f36b162f98aff396a580b8032a4afdb2.png)
你会发现这个程序在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]使用代码创建窗口
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- pyqt之使用QtCreator创建第一个简单的窗口(label、pushbutton以及非代码直接从图形界面选择的信号与槽)
- Android开发系列(二十六):使用PopupWindow创建对话框风格的窗口
- 使用Cocoapods创建私有podspec
- Cocoa系列教学四:Sizing Policy 和其他
- 使用CocoaPods创建Pod
- CitrusEngine系列教程五:使用PhysicsEditor创建box2d刚体
- SSM框架——使用MyBatis Generator自动创建代码
- 使用Objective-C创建UUID的代码
- 使用jquery datatable和bootsrap创建表格实例代码
- Visual Studio使用技巧,创建自己的代码片段
- [Silverlight]通过SilverlightLoader使用托管代码创建自定义载入界面(Splash Screen) (上)
- 实战c++中的string系列--十六进制的字符串转为十六进制的整型(通常是颜色代码使用)
- 【转】C#强化系列文章九:代码访问安全性使用
- 使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
- 【系列3】使用Dockerfile创建yum安装nginx服务的Centos Docker镜像
- 使用Xcode 5创建Cocoa Touch Static Library(静态库)
- ExtTag,如果你不想写extjs那么麻烦的代码可以尝试使用html方式的方法来创建extjs控件.