c++ - C++ 中的简单警告框,而不是 Objective-C

标签 c++ macos cocoa

我需要一个非常简单的警告框,例如 NSRunAlertPanel(),但这是针对 C++ 嵌入式 64 位应用程序的,我既不了解 Cocoa 也不了解 Objective-C。

关于如何做到这一点有什么想法吗?

最佳答案

选项A

一种解决方案是查看 CFUserNotification API。

选项 B

另一种选择是包装 NSRunAlertPanel,使用 CoreFoundation 类型作为参数:

// MONNSRunAlertPanel.hpp
extern "C++" {
int MONNSRunAlertPanel(CFStringRef title,
                       CFStringRef msg,
                       CFStringRef defaultButton,
                       CFStringRef alternateButton,
                       CFStringRef otherButton);
}


// MONNSRunAlertPanel.mm

#include <Foundation/Foundation.h>
#include "MONNSRunAlertPanel.hpp"

int MONNSRunAlertPanel(CFStringRef title,
                       CFStringRef msg,
                       CFStringRef defaultButton,
                       CFStringRef alternateButton,
                       CFStringRef otherButton) {
    int result = 0;
    @autoreleasepool {
        result = NSRunAlertPanel(
            (NSString *)title,
            (NSString *)msg,
            (NSString *)defaultButton,
            (NSString *)alternateButton,
            (NSString *)otherButton
            );
    }
    return result;
}

如果您想要一个 C 符号,请将文件命名为 MONNSRunAlertPanel.m (objc),并相应地更改 header ,

如果您希望它作为 C++ 符号,只需将文件命名为 MONNSRunAlertPanel.mm (objc++)。

假设您使用的是默认编译器设置,我们的源代码将根据其文件扩展名进行编译。

最后,添加Foundation和AppKit链接到必要的系统库。

然后您可以调用 MONNSRunAlertPanel 而无需将 Foundation.framework 拖到您的 C++ 源代码中(因为 CFString 和 NSString 类型已桥接)。

关于c++ - C++ 中的简单警告框,而不是 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8094145/

相关文章:

objective-c - 在 10.6 中的帮助查看器中启动帮助页面

c++ - QDesktopServices::openUrl() 无法在 MAC Finder 中打开目录

c++ - 为什么要用堆来存储内存?

macos - 如何在 OS 10.6 (Snow Leopard) 上解决此 PostgreSQL 错误

linux - 查找所有者或组不等于的地方

objective-c - 如何消除 <Class> 可能无法响应 <Selector> 的警告?

ios - 在主线程上运行 NSURLSession 完成处理程序

c++ - 如何从 Eigen 中的索引 vector 中提取子 vector (Eigen::Vector 的)?

c++ - 你能解释一下这个 C++ 函数定义的语法吗?

python - 指定操作系统 - Ansible