2 Stimmen

Fenstercode initialisieren Mac OS X

Ich lese gerade "das rote Buch", um OpenGL richtig zu lernen, und in einem der ersten Beispiele schreibt der Autor eine Zeile, in der es heißt "InitializeAWindowPlease();" als Platzhalter für den Code, der ein Fenster zum Zeichnen des OpenGL-Inhalts erstellen wird.

Da ich die Xcode Für meine Programmierung weiß ich, dass ich automatisch ein Fenster zum Arbeiten "bekomme" (und dass ich meine eigene OpenGL-Ansicht in Interfacebuilder erstellen muss).

Wie kann ich das mit reinem Code machen?

Ich versuche, das Programmieren zu lernen, und ich bin nicht glücklich darüber, ständig "Abkürzungen" zu nehmen. Wie kann ich ein Fenster machen, um meine OpenGL-Zeug in zu zeichnen?

Mit Objective-C und C-Code würde ich es gerne sehen. Mein Ziel ist, dass ich es machen kann, ohne Interface Builder überhaupt zu öffnen:)

1voto

gavinb Punkte 18143

Die Rahmenwerke nehmen Ihnen viel Arbeit ab. Der einfache Aufruf von NSApplicationMain() in Ihrem main.m erledigt Dinge wie das Starten der Hauptanwendungsklasse (wie von der Info.plist ), laden Sie Ihr Haupt nib , laden Sie die Hauptfenster und -menüs, richten Sie einen Standard-Pool für die automatische Speicherfreigabe ein und starten Sie die Ausführungsschleife (und vieles mehr!).

Es ist gut zu verstehen, welche "Magie" hinter den Kulissen abläuft, aber ich sehe nichts Falsches daran, die Rahmenprogramme einen großen Teil der Routinearbeit für Sie erledigen zu lassen. Und IB ist ein besonders schöner UI-Editor, es wäre eine Schande, ihn nicht zu benutzen! Wie auch immer, da du gefragt hast...

Sie sollten sich die folgenden Dokumente von Apples Developer Connection-Website durchlesen:

Um all dies programmgesteuert zu tun, müssten Sie also mindestens so etwas wie den folgenden Code verwenden. Beachten Sie, dass dies ein grober Anfang ist und weder einen Anwendungsdelegierten erstellt noch den Menüs etwas hinzufügt. Dies soll als Übung für den Leser dienen! Aber der folgende Code funktioniert im Grunde auf die von Ihnen beschriebene Weise, ohne IB zu verwenden.

//  main.m
//
//  NoIBApp - Create Application without IB
//
//  Created by Gavin Baker on 23/01/10.
//

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    // Autorelease Pool

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // Create shared app instance

    [NSApplication sharedApplication];

    // Main window

    NSUInteger windowStyle = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;

    NSRect windowRect = NSMakeRect(100, 100, 400, 400);

    NSWindow* window = [[NSWindow alloc] initWithContentRect:windowRect
                                                   styleMask:windowStyle
                                                     backing:NSBackingStoreBuffered
                                                       defer:NO];

    // Test content

    NSTextView* textView = [[NSTextView alloc] initWithFrame:windowRect];
    [window setContentView:textView];

    // Window controller

    NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:window];

    // @todo Create app delegate

    // @todo Create menus (especially Quit!)

    // Show window and run event loop

    [window orderFrontRegardless];
    [NSApp run];

    return 0;
}

Das ist keine vollständige Lösung, aber es sollte Ihnen den größten Teil des Weges ermöglichen. Sie können also Ihre OpenGL-Ansicht als contentView (anstelle der Textansicht) und los geht's.

0voto

Chuck Punkte 228137

Die Art und Weise, wie es normalerweise mit Cocoa gemacht wird, ist meines Erachtens ein wenig anders. [NeHe's OpenGL lessons] haben unten Links zu Xcode-Beispielprojekten, deren Format Sie nachahmen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X