2015-05-15 3 views
5

Sto creando un'applicazione in puro C su Mac OSX. Quello che voglio è creare una finestra in cui la mia app verrà archiviata.Creazione di un'applicazione finestra in puro c su mac osx

Preferibilmente voglio che sia una soluzione C pura, ma se devo usare la classe obiett-c per init window e quindi inviare il contesto al mio codice C, allora andrà bene.

Non sto usando xcode, solo un semplice editor di testo con ho provato a importare il cacao ma ha appena generato un sacco di errori.

Quindi, in breve la mia domanda è: In che modo semplice C pura genera codice che visualizzerà la finestra di osx?

+0

Xcode non è un requisito per la scrittura di un app Cocoa per OS X, ma riduce la difficoltà * sensibilmente *. A meno che tu non stia pianificando di scrivere un'applicazione X-Window e di affidarti a Quartz o qualche altro gestore di finestre per il tuo rendering, pure-C non succederà più. [Cacao minimalista con Objective-C] (http://www.cocoawithlove.com/2010/09/minimalist-cocoa-programming.html), quindi seppellire la tua logica di base in C è fattibile, ma alla fine potresti trovarne gran parte più facile usare semplicemente l'obiettivo-C flat-out alla fine. – WhozCraig

+0

possibile duplicato di [Come scrivere app iOS puramente in C] (http://stackoverflow.com/questions/10289890/how-to-write-ios-app-purely-in-c) – SevenBits

+0

Cosa vuoi mostrare nella finestra? Testo statico, testo modificabile, controlli dell'interfaccia utente, grafica 3D ...? – JWWalker

risposta

5

È possibile utilizzare Objective-C runtime API esempio (iOS) Creating an iOS app in pure C

alternativa lo stesso codice in obj-c:

echo '#import <Cocoa/Cocoa.h> 
int main() 
    { 
     @autoreleasepool{ 
      [NSApplication sharedApplication]; 
      [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 
      id applicationName = [[NSProcessInfo processInfo] processName]; 
      id window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 120, 120) 
       styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]; 
      [window cascadeTopLeftFromPoint:NSMakePoint(20,20)]; 
      [window setTitle: applicationName]; 
      [window makeKeyAndOrderFront:nil]; 
      [NSApp activateIgnoringOtherApps:YES]; 
      [NSApp run]; 
     } 
     return 0; 
}' | gcc -fobjc-arc -framework Cocoa -x objective-c -o MicroApp - ; ./MicroApp 

Questo farà eseguire cacao app con 1 finestra. Come sulla schermata sotto

enter image description here

Si può effettivamente aggiungere menu utilizzando NSMenu

id applicationMenuBar = [NSMenu new]; 
    id appMenuItem  = [NSMenuItem new]; 
    [applicationMenuBar addItem:appMenuItem]; 
    [NSApp setMainMenu: applicationMenuBar]; 
+4

Questa risposta è sbagliata. Non è necessario utilizzare Objective-C per l'interfaccia utente. È possibile chiamare la maggior parte delle classi Objective-C da C utilizzando l'API runtime Objective-C e creare a livello di codice gli elementi dell'interfaccia utente. Non è pratico, ma può essere fatto. – SevenBits

+0

Puoi dare un esempio di pls? – CryingHippo

+2

Certo, eccone uno: https://github.com/richardjrossiii/CBasediOSApp – SevenBits

6

Si può fare questo? Sì e no (puoi fare qualsiasi cosa se sei abbastanza persistente). Sì, è possibile, ma no non è necessario. Indipendentemente da ciò, questo può essere fatto per l'incredibilmente persistente tra voi. Dal momento che la codifica di un esempio richiederà un po ', ho trovato un'anima generosa in rete che l'ha già fatto. Guarda at this repository on GitHub per il codice completo e le spiegazioni. Ecco alcuni frammenti:

cmacs_simple_msgSend((id)objc_getClass("NSApplication"), sel_getUid("sharedApplication")); 

if (NSApp == NULL) { 
    fprintf(stderr,"Failed to initialized NSApplication... terminating...\n"); 
    return; 
} 

id appDelObj = cmacs_simple_msgSend((id)objc_getClass("AppDelegate"), sel_getUid("alloc")); 
appDelObj = cmacs_simple_msgSend(appDelObj, sel_getUid("init")); 

cmacs_void_msgSend1(NSApp, sel_getUid("setDelegate:"), appDelObj); 
cmacs_void_msgSend(NSApp, sel_getUid("run")); 

Come si noterà, questo codice utilizza il runtime API Objective-C per creare un'AppDelegate finto. E la creazione della finestra è un processo coinvolto:

self->window = cmacs_simple_msgSend((id)objc_getClass("NSWindow"), sel_getUid("alloc")); 

/// Create an instance of the window. 
self->window = cmacs_window_init_msgSend(self->window, sel_getUid("initWithContentRect:styleMask:backing:defer:"), (CMRect){0,0,1024,460}, (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask), 0, false); 

/// Create an instance of our view class. 
/// 
/// Relies on the view having declared a constructor that allocates a class pair for it. 
id view = cmacs_rect_msgSend1(cmacs_simple_msgSend((id)objc_getClass("View"), sel_getUid("alloc")), sel_getUid("initWithFrame:"), (CMRect){ 0, 0, 320, 480 }); 

// here we simply add the view to the window. 
cmacs_void_msgSend1(self->window, sel_getUid("setContentView:"), view); 
cmacs_simple_msgSend(self->window, sel_getUid("becomeFirstResponder")); 

// Shows our window in the bottom-left hand corner of the screen. 
cmacs_void_msgSend1(self->window, sel_getUid("makeKeyAndOrderFront:"), self); 
return YES; 

Quindi sì. Puoi scrivere un'app Cocoa in puro C. Ma non la consiglierei. Il 90% di quel codice può essere sostituito da un file xib, e farlo in questo modo limita davvero la tua app perché le funzionalità più avanzate dello stack di sviluppo Apple sono davvero sulle funzionalità di Objective-C. Mentre è tecnicamente possibile fare tutto in questo modo, lo stai rendendo molto più difficile di quanto dovrebbe essere.

1

Sto creando un'applicazione in puro C su Mac OSX. Quello che voglio è creare una finestra in cui la mia app verrà archiviata.

Stai cercando una finestra TTY?

In tal caso l'applicazione deve creare la finestra?

In caso contrario, è possibile scrivere semplicemente il proprio programma C ed eseguirlo da Terminal - un ambiente TTY per "pura C".

Se si desidera un'applicazione con doppio clic, è possibile scrivere un AppleScript che aprirà Terminal ed eseguirà il C.Qualcosa di simile:

tell application "Terminal" 
    do script "ex /tmp/test; exit" 
end tell 

Questo apre una finestra di terminale che mostra "ex" e quando questo si chiude terminerà il processo di shell (quindi senza ulteriori comandi possono essere digitati), ma sarà non vicino Terminal sé - per questo dovrai lavorare di più.

Se vuoi che l'applicazione crei la finestra stessa, devi scrivere la tua semplice finestra TTY, potresti trovare alcune classi che puoi usare, o potresti essere in grado di prendere in prestito il codice da un'app terminale open source come come iterm.

HTH

+0

Ha messo in chiaro che vuole che il codice C generi una finestra OS X (i.e Cocoa). Quindi non penso che l'uso di un'app basata sul terminale sia appropriato per le sue esigenze. – SevenBits

+0

@SevenBits - Da quando ho scritto la risposta l'OP ha effettivamente scritto che sta cercando una "tela su cui disegnerò"; quindi a meno che non intendano la grafica VT100, che dubito, allora questa risposta non è adatta come osservate correttamente. Tuttavia, i futuri lettori potrebbero cercare di eseguire "codice TTY" in una finestra su OS X, quindi ho lasciato la risposta. – CRD