Cocoa with gcc command build 講解一個簡單的視窗程序

來源:互聯網
上載者:User
這次主要講解一下如何通過編寫代碼的方式來實現一個視窗程序, 當然這個程式十分的簡單, 不過它示範了一些我們應該瞭解的東西,因此應該可以更好的協助我們瞭解XCode和Interface builder為我們的開發工作做了哪些工作。

大 部分講解Cocoa編程的書都會用到Xcode和interface builder,這兩個工具的結合是開發Cocoa應用程式的最佳選擇, 但是當中往往隱藏了許多細節的東西,為了對Cocoa的運作方式有更好的瞭解,我決定用代碼來實現一些Interface Builder中Nib檔案實現的部分功能,以此來研究Cocoa的運作方式。

下面我們先看看這個最簡單的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這個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上的座標系原點在螢幕的左下角,所以整個螢幕是出於第一象限的,這與我們在中學時候學到的知識是一致的,以後會講到這個問題的。

不過目前這個程式不能關閉,這是因為我們還沒有處理相應的事件來讓應用程式退出,這個問題我們下次再說。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.