2015-05-15 9 views
5

पर शुद्ध सी में विंडो अनुप्रयोग बनाना I मैक ओएसएक्स पर शुद्ध सी में एक एप्लिकेशन बना रहा हूं। मैं चाहता हूं कि चुड़ैल में खिड़की बनाने के लिए मेरा ऐप संग्रहीत किया जाएगा।मैक ओएसएक्स

अधिमानतः मैं इसे शुद्ध सी समाधान होना चाहता हूं, लेकिन अगर मुझे उद्देश्य-सी कक्षा का उपयोग विंडो में करने के लिए करना है और फिर मेरे सी कोड में संदर्भ भेजना है तो यह ठीक होगा।

मैं xcode का उपयोग नहीं कर रहा हूं, केवल सरल टेक्स्ट एडिटर में मैंने कोको आयात करने की कोशिश की लेकिन यह अभी बहुत सारी त्रुटियों को उत्पन्न करता है।

तो सारांश में मेरा प्रश्न है: सरल शुद्ध सी कोड कैसे उत्पन्न करता है जो ओएसएक्स विंडो प्रदर्शित करेगा?

+0

Xcode ओएस एक्स के लिए एक कोको अनुप्रयोग लिखने के लिए एक आवश्यकता नहीं है, लेकिन यह कठिनाई कम कर देता है * काफी *। जब तक आप एक एक्स-विंडो एप्लिकेशन लिखने और अपने प्रतिपादन के लिए क्वार्ट्ज या किसी अन्य विंडो मैनेजर पर भरोसा करने की योजना बना रहे हैं, तो शुद्ध-सी बहुत कुछ नहीं होने वाला है। [उद्देश्य-सी के साथ न्यूनतमतम कोको] (http://www.cocoawithlove.com/2010/09/minimalist-cocoa-programming.html), फिर सी में अपने मूल तर्क को दफनाने योग्य है, लेकिन अंततः आप इसे अधिकतर पा सकते हैं अंत में फ्लैट-आउट उद्देश्य-सी का उपयोग करना आसान है। – WhozCraig

+0

संभावित डुप्लिकेट [सीओ में पूरी तरह से आईओएस ऐप कैसे लिखें] (http://stackoverflow.com/questions/10289890/how-to-write-ios-app-purely-in-c) – SevenBits

+0

आप क्या दिखाना चाहते हैं खिड़की में? स्टेटिक टेक्स्ट, संपादन योग्य पाठ, यूआई नियंत्रण, 3 डी ग्राफिक्स ...? – JWWalker

उत्तर

5

आप Objective-C runtime API उदाहरण (आईओएस) Creating an iOS app in pure C

वैकल्पिक Obj सी में एक ही कोड का उपयोग कर सकते हैं:

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 

यह 1 खिड़की के साथ कोको एप्लिकेशन चलेंगे।

enter image description here

आप वास्तव में NSMenu

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

यह उत्तर गलत है। आपको UI के लिए उद्देश्य-सी का उपयोग करने की आवश्यकता नहीं है। आप उद्देश्य-सी रनटाइम एपीआई का उपयोग करके सी से अधिकांश उद्देश्य-सी कक्षाओं को कॉल कर सकते हैं और प्रोग्रामेटिक रूप से यूआई तत्व बना सकते हैं। यह व्यावहारिक नहीं है, लेकिन यह किया जा सकता है। – SevenBits

+0

क्या आप एक उदाहरण pls दे सकते हैं? – CryingHippo

+2

निश्चित रूप से, यहां एक है: https://github.com/richardjrossiii/CBasediOSApp – SevenBits

6

का उपयोग कर आप यह कर सकते हैं मेनू में जोड़ सकते हैं नीचे स्क्रीनशॉट पर की तरह? हां और नहीं (यदि आप लगातार पर्याप्त हैं तो आप कुछ भी कर सकते हैं)। हां आप कर सकते हैं, लेकिन नहीं होना चाहिए। भले ही, यह आपके बीच अविश्वसनीय रूप से लगातार के लिए किया जा सकता है। चूंकि एक उदाहरण को कोड करने में थोड़ी देर लग जाएगी, मुझे नेट पर एक उदार आत्मा मिली है जो पहले से ही कर चुका है। पूर्ण कोड और स्पष्टीकरण के लिए at this repository on GitHub देखें। यहाँ कुछ के टुकड़े कर रहे हैं:

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")); 

आप ध्यान देंगे के रूप में, इस कोड को ऑब्जेक्टिव-सी क्रम API का उपयोग करता एक छद्म AppDelegate बनाने के लिए। और खिड़की बनाना एक प्रक्रिया है:

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; 

तो, हाँ। आप शुद्ध सी में कोको ऐप लिख सकते हैं लेकिन मैं इसकी अनुशंसा नहीं करता। उस कोड का 9 0% एक xib फ़ाइल द्वारा प्रतिस्थापित किया जा सकता है, और इसे इस तरह से करने से वास्तव में आपके ऐप को प्रतिबंधित कर दिया जाता है क्योंकि ऐप्पल विकास की अधिक उन्नत विशेषताएं वास्तव में उद्देश्य-सी सुविधाओं पर खड़ी होती हैं। हालांकि यह सबकुछ इस तरह से करने के लिए तकनीकी रूप से संभव है, लेकिन आप इसे जितना कठिन होना चाहिए उतना कठिन बना रहे हैं।

1

मै मैक ओएसएक्स पर शुद्ध सी में एक एप्लिकेशन बना रहा हूं। मैं जो चाहता हूं वह विंडो बनाना है जिसमें मेरा ऐप संग्रहीत किया जाएगा।

क्या आप एक टीटीवी विंडो ढूंढ रहे हैं?

यदि आपके एप्लिकेशन को विंडो बनाने की आवश्यकता है तो क्या?

यदि नहीं तो आप बस अपने शुद्ध सी प्रोग्राम को लिख सकते हैं और टर्मिनल के भीतर इसे निष्पादित कर सकते हैं - "शुद्ध सी" के लिए एक टीटीवी पर्यावरण।

यदि आप एक डबल-क्लिक करने योग्य ऐप चाहते हैं तो आप एक ऐप्पलस्क्रिप्ट लिख सकते हैं जो टर्मिनल खोल देगा और आपका सी चलाएगा।कुछ की तरह:

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

यह दिखा "ex" एक टर्मिनल विंडो खुलती है और जब कि खोल प्रक्रिया (ताकि आगे कोई आदेशों टाइप किया जा सकता है) को समाप्त कर देगा इस्तीफा, लेकिन यह होगा नहीं पास टर्मिनल में ही - उस के लिए आपको कड़ी मेहनत करनी होगी।

यदि आप चाहते हैं कि आप खिड़की बनाने के लिए आवेदन करें तो आपको या तो अपनी खुद की सरल टीटीवी विंडो लिखनी होगी, आपको कुछ कक्षाएं मिल सकती हैं जिनका आप उपयोग कर सकते हैं, या आप ओपन सोर्स टर्मिनल ऐप से कोड उधार लेने में सक्षम हो सकते हैं iterm के रूप में।

HTH

+0

उन्होंने यह स्पष्ट किया कि वह सी कोड को ओएस एक्स (यानी कोको) विंडो उत्पन्न करना चाहता है। इसलिए मुझे नहीं लगता कि एक टर्मिनल-आधारित ऐप का उपयोग करना उसकी ज़रूरतों के लिए उपयुक्त होगा। – SevenBits

+0

@ सेवन बिट्स - चूंकि मैंने जवाब लिखा है कि ओपी ने वास्तव में लिखा है कि वह "कैनवास जिस पर मैं आकर्षित करूंगा" ढूंढ रहा हूं; इसलिए जब तक उनका मतलब वीटी 100 ग्राफिक्स नहीं है, जो मुझे संदेह है, तो यह उत्तर उपयुक्त नहीं है जैसा कि आप सही ढंग से देखते हैं। हालांकि भविष्य के पाठक ओएस एक्स पर एक विंडो में "टीटीवी कोड" चलाने की तलाश में हैं, इसलिए मैंने जवाब छोड़ दिया है। – CRD