你能做到吗是和不是(如果你足够坚持,你可以做任何事情)。是的,你可以,但你不应该。无论如何,这可以为你们中间令人难以置信的持久性做。由于编写一个例子需要一段时间,我在网上找到了一个慷慨的人,他已经做了。查看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"));
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;
7条答案
按热度按时间v1uwarro1#
我翻译了Pure C的公认答案:
k4aesqcs2#
您可以使用Objective-C runtime API示例(iOS)Creating an iOS app in pure C
在obj-c中替换相同的代码:
这将运行带有1个窗口的可可应用程序。就像下面的截图
实际上,您可以使用NSMenu添加菜单
pvabu6sv3#
你能做到吗是和不是(如果你足够坚持,你可以做任何事情)。是的,你可以,但你不应该。无论如何,这可以为你们中间令人难以置信的持久性做。由于编写一个例子需要一段时间,我在网上找到了一个慷慨的人,他已经做了。查看at this repository on GitHub以获得完整的代码和解释。以下是一些片段:
正如您所注意到的,这段代码使用Objective-C运行时API来创建一个伪AppDelegate。创建窗口是一个复杂的过程:
所以,是的。你可以用纯C写一个可可应用程序。但我不建议你这么做。90%的代码可以被xib文件替换,这样做确实限制了你的应用程序,因为苹果开发堆栈的更高级功能实际上是在Objective-C功能上。虽然从技术上讲,用这种方式做所有事情都是可能的,但你让它变得比应该的要困难得多。
yws3nbqq4#
我记得大约一年前看到这个问题,当时我非常希望我能打开一个d***窗口,谷歌搜索了几天,只找到你在这篇文章上面看到的答案类型。
我正在阅读Mac的操作系统--伯克利软件发行版。http://codex.cs.yale.edu/avi/os-book/OS9/appendices-dir/a.pdf在第17页上的短语“...麻省理工学院开发的X窗口系统”击中了我,我记得我是如何无法打开一个窗口,我是多么生气,我想也许这是最终的解决方案!
我在谷歌上搜索了“BSDXWindowProgramming”,终于用纯C打开了一个窗口。
我刚刚发现它,所以我还不是一个大师,但看看这个链接https://en.wikibooks.org/wiki/X_Window_Programming/Xlib并转到示例,确保遵循顶部的注解,了解如何使用X11库进行编译(只要你有-lX 11,你就可以忽略-Wall和-O命令)。
如果你不能编译,如果它找不到头文件,你就需要帮助它找到头文件。
X11可能在您的系统上包含几个不同的位置。您很可能会在
/opt/X11/include
中找到它,它将包含您需要的所有头文件的定义。您可以在C程序中包含完整路径,例如:
但是我们希望它看起来像这样
#include <X11/Xlib.h>
,所以你可以在编译-I /opt/X11/include
时将这个开关添加到GCC中。或者转到主目录中的
.profile
或.bashrc
或.bash_profile
并添加:简单的Xlib应用程序在窗口中绘制一个框。
来自wiki:
编译:
rbpvctlc5#
不幸的是,由于ABI不匹配,最高评级的答案在新的苹果硅动力机器上不起作用。基本上在ARM64上,你不能使用带有变量参数的objc_msgSend声明,你必须为每个调用指定正确的参数类型。以下是在Apple Silicon上运行的版本:
a2mppw5e6#
纯C跨平台示例:(Windows/macOS/Linux)https://nappgui.com/en/demo/products.html
关于macOS在纯C中的可移植性(已更新为BigSur和M1支持):https://nappgui.com/en/start/win_mac_linux.html#h2
jqjz2hbq7#
我正在Mac OSX上用纯C语言创建一个应用程序。我想要的是创建一个窗口,我的应用程序将被存储。
您是否正在寻找TTY窗口?
如果是这样,你的应用程序需要创建窗口吗?
如果没有,那么你可以简单地编写你的纯C程序,并从终端中执行它-一个“纯C”的TTY环境。
如果你想要一个可双击的应用程序,你可以写一个AppleScript,它将打开终端并运行你的C。类似于:
这将打开一个显示“ex”的终端窗口,当它退出时,将终止shell进程(因此无法输入进一步的命令),但它不会关闭终端本身-为此,您将不得不更加努力。
如果你想让你的应用程序自己创建窗口,你要么需要自己写一个简单的TTY窗口,你可以找到一些你可以使用的类,或者你可以从一个开源的终端应用程序(如iterm)中借用代码。
高温加热