在Xcode里實(shí)現(xiàn)一個(gè)窗口程序 代碼實(shí)現(xiàn)
在Xcode里實(shí)現(xiàn)一個(gè)窗口程序 代碼實(shí)現(xiàn)是本文要介紹的內(nèi)容,主要講解一下如何通過編寫代碼的方式來實(shí)現(xiàn)一個(gè)窗口程序,了解XCode和Interface builder為我們的開發(fā)工作做了哪些工作。
cocoa的坐標(biāo)系有點(diǎn)和習(xí)慣不一樣,習(xí)慣了第四象限坐標(biāo)系,再用***象限,感覺很奇怪。這次主要講解一下如何通過編寫代碼的方式來實(shí)現(xiàn)一個(gè)窗口程序,當(dāng)然這個(gè)程序十分的簡單,不過它演示了一些我們應(yīng)該了解的東西,因此應(yīng)該可以更好的幫助我們了解XCode和Interface builder為我們的開發(fā)工作做了哪些工作。
大部分講解Cocoa編程的書都會用到Xcode和interface builder,這兩個(gè)工具的結(jié)合是開發(fā)Cocoa應(yīng)用程序的***選擇, 但是當(dāng)中往往隱藏了許多細(xì)節(jié)的東西,為了對Cocoa的運(yùn)作方式有更好的了解,我決定用代碼來實(shí)現(xiàn)一些Interface Builder中Nib文件實(shí)現(xiàn)的部分功能,以此來研究Cocoa的運(yùn)作方式。
下面我們先看看這個(gè)最簡單的HelloWin的源代碼。
- #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這個(gè)Framework,Cocoa Framework會自動引用其他需要的framework,比如Foundation Framework。這個(gè)編譯指令生成的程序名字叫HelloWin, 你可以通過在終端下執(zhí)行下面的命令來看看這個(gè)程序的運(yùn)行情況。
- ./HelloWin
窗口顯示如圖所示:
你會發(fā)現(xiàn)這個(gè)程序在Dock上面沒有圖標(biāo),在菜單欄上沒有菜單, 雖然你可以關(guān)掉這個(gè)窗口, 但是在終端的提示中可以看到這個(gè)應(yīng)用程序沒有退出, 現(xiàn)在在終端按ctrl+C結(jié)束這個(gè)應(yīng)用程序。
下 面來具體看一下這個(gè)簡單的程序,首先我們import了Cocoa這個(gè)Framework,然后創(chuàng)建了一個(gè)NSAutoreleasePool的實(shí)例,接 下來我們通過NSApplication的類方法sharedApplication得到了一個(gè)NSApplication對象,并將這個(gè)對象賦給一個(gè) NSApplication類的實(shí)例, 其實(shí)這個(gè)賦值是不需要的, 因?yàn)樵谡{(diào)用sharedApplication的時(shí)候, Cocoa設(shè)置了另外一個(gè)全局的NSApplication對象的實(shí)例, NSApp,所以你可以看到在后面調(diào)用run方法的Receiver是NSApp,而沒有用app。所以你可以簡單的在這里直接調(diào)用
- [NSApplication sharedApplication];
以后在需要NSApplication對象的時(shí)候直接使用NSApp就可以了。
在 得到了NSApp之后,程序開始創(chuàng)建窗口,因?yàn)檫@個(gè)是窗口也是程序的主窗口(mainWindow), 所以在創(chuàng)建這個(gè)窗口的時(shí)候,針對窗口的styleMask也需要滿足一定的條件。如果一個(gè)窗口想成為主窗口,必須是具有標(biāo)題 (NSTitleWidowMask)或者擁有可改變大小屬性(NSResizableWindowMask)。另外如果你希望這個(gè)窗口能夠被關(guān)掉,那么 NSClosableWindowMask也是需要的,否則盡管這個(gè)窗口能顯示出來, 但是你會發(fā)現(xiàn)標(biāo)題欄上的關(guān)閉按鈕是灰色的。
在初始 化窗口之后,通過setTitle設(shè)置窗口的標(biāo)題,對makeKeyAndOrderFront:的調(diào)用是一個(gè)關(guān)鍵,因?yàn)橐粋€(gè)窗口想成為 mainWindow,必須是可見的,在調(diào)用這個(gè)方法之后,我們就可以通過makeMainWindow方法來讓這個(gè)窗口成為程序的主窗口。
在有了主窗口之后, 我們可以調(diào)用NSApplication的run方法來啟動程序的消息循環(huán),到這時(shí)應(yīng)用程序就開始運(yùn)行了, 也能接受各種應(yīng)用程序或者窗口的事件了。
這 里有個(gè)地方需要提示一下,我們在代碼中看到設(shè)定的初始Rect起點(diǎn)是(0,0),但是卻顯示在屏幕的左下角,這個(gè)問題是因?yàn)镸ac上缺省的坐標(biāo)系與 Windows下面的不同,Mac上的坐標(biāo)系原點(diǎn)在屏幕的左下角,所以整個(gè)屏幕是出于***象限的,這與我們在中學(xué)時(shí)候?qū)W到的知識是一致的,以后會講到這個(gè)問題的。
小結(jié):在Xcode里實(shí)現(xiàn)一個(gè)窗口程序 代碼實(shí)現(xiàn)的內(nèi)容介紹完了,希望本文對你有所幫助。
原帖地址 http://www.cocoachina.com/bbs/read.php?tid-23.html