D言語からObjective-CとCocoaAPIを使いたい
ボタンを表示する
D言語から Mac の GUI を使用して NSButton、NSTextField を表示します。 NSAttributedString の使用に変更しました。

サンプルコード
Powered by Prism
button/dub.json
{
"authors": ["hidhok"],
"description": "A D/Objective-C Cocoa application.",
"name": "button",
"dflags": ["-L-framework", "-LCocoa"],
"sourceFiles": ["../cocoa/window",
"../cocoa/control",
"../cocoa/menus"]
}
button/source/app.d
/**
* button/source/app.d Version 0.0.8
*/
module button.main;
import core.attribute : optional, selector;
import std.stdio : printf;
import cocoa.window;
import cocoa.control;
import cocoa.menus;
string appName;
string versionNo = "0.0.8";
Button btn1, btn2;
NSTextField field, label;
NSAttributedString fAttrStr, lAttrStr;
string placeholderStr = "ここに、入力して下さい。";
string start_LabelStr = "貴方のお名前を入力して、\n下のボタンを押して下さい。";
void main() {
auto delegate_ = AppDelegate.alloc.init;
NSApp.delegate_ = cast(void*) delegate_;
NSApp.activationPolicy = NSAppActivationPolicy.regular;
NSApp.run;
}
extern (Objective-C)
class DrawView : NSView {
override static DrawView alloc() @selector("alloc");
override DrawView init() @selector("init");
override DrawView init(NSRect) @selector("initWithFrame:");
override void drawRect(NSRect) @selector("drawRect:");
}
extern (Objective-C)
class AppDelegate : NSObject {
override static AppDelegate alloc() @selector("alloc");
override typeof(this) init() @selector("init");
bool applicationShouldTerminateAfterLastWindowClosed(
NSNotification notification) @selector(
"applicationShouldTerminateAfterLastWindowClosed:") {
return true;
}
void applicationDidFinishLaunching(NSNotification notification)
@selector("applicationDidFinishLaunching:") {
buildWindow;
buildContents;
}
void aboutPanel() @selector("aboutPanel") {
dialog(appName, "Version " ~ versionNo);
}
void showHelp() @selector("showHelp") {
string helpMessage = "Button、 TextField、 Label\n"
~ "のテストプログラムです。\n";
dialog(appName ~ " Help", helpMessage);
}
}
void buildWindow() {
NSWindow win;
NSRect w_rect = NSMakeRect(0, 0, 300, 200);
appName = NSProcessInfo.processInfo.processName.toDs;
NSApp.menu = miniMenu(appName);
immutable w_style = NSWindowStyleMask.titled |
NSWindowStyleMask.closable |
NSWindowStyleMask.miniaturizable;
win = NSWindow.alloc.init(w_rect, w_style, backing.buffered, false);
win.title = (appName ~ " (Dlang test)").toNs;
win.moveTop = NSPoint(100, 950);
win.makeKeyAndOrderFront = null;
NSApp.activateIgnoringOtherApps = true;
}
void buildContents() {
// Button btn1, btn2
btn1 = Button.alloc.init(NSMakeRect(50, 20, 150, 40));
btn2 = Button.alloc.init(NSMakeRect(200, 20, 60, 40));
btn1.setButton("Click Me !", NSColor.teal, "OnClickedButton1");
btn2.setButton("Clear", NSColor.brown, "OnClickedButton2");
// Check btn1, btn2
if (btn1.respondsToSelector(sel_registerName("OnClickedButton1".toCs))) //
printf("btn1 = \"OnClickedButton1\"を確認できました!!!\n");
else
printf("btn1 = \"OnClickedButton1\"が見つかりません。\n");
if (btn2.respondsToSelector(sel_registerName("OnClickedButton2".toCs))) //
printf("btn2 = \"OnClickedButton2\"を確認できました!!!\n");
else
printf("btn2 = \"OnClickedButton2\"が見つかりません。\n");
// TextField
field = NSTextField.alloc.init(NSMakeRect(40, 80, 220, 30));
field.attrStr = "".toAttrStr(NSColor.black);
field.holderStr = placeholderStr.toAttrStr(NSColor.lightGray);
field.font = NSFont.nameSize("YuMincho Demibold".toNs, 16);
// Label
label = NSTextField.alloc.init(NSMakeRect(40, 130, 220, 50));
label.bgColor = NSColor.clear;
label.bordered = false;
label.editable = false;
label.selectable = false;
label.attrStr = start_LabelStr.toAttrStr(NSColor.black);
win.contentView.subview = label; //
}
extern (Objective-C)
class Button : NSButton, Res {
override static Button alloc() @selector("alloc");
override Button init(NSRect) @selector("initWithFrame:");
bool respondsToSelector(SEL) @selector("respondsToSelector:");
void setButton(string title, NSColor color, string action)
@selector("setButtonTitle:color:action:") {
this.title = title; // title.toNs;
this.bezelStyle = NSBezelStyle.Push; //
this.bezelColor = color;
this.bordered = true;
this.target = this;
this.action_ = action; //
// this.action = sel_registerName(action.toCs); //
win.contentView.subview = this;
}
void OnClickedButton1() @selector("OnClickedButton1") {
if (field.str.toDs != "") {
string fText = "Hello " ~ field.str.toDs ~ " !!\n \t Nice going !!";
label.attrStr = fText.toAttrStr(NSColor.black);
} else {
field.attrStr = "".toAttrStr(NSColor.black);
label.attrStr = start_LabelStr.toAttrStr(NSColor.blue);
}
}
void OnClickedButton2() @selector("OnClickedButton2") {
field.attrStr = "".toAttrStr(NSColor.black);
label.attrStr = start_LabelStr.toAttrStr(NSColor.black);
}
}
cocoa/window.d
cocoa/control.d
cocoa/menus.d
- Log
- 2025-03-04 修正しました
- 2024-06-07 修正しました
- 2023-10-20 更新しました
- 2023-03-30 更新しました
- 2023-03-01 更新しました
- 2022-12-23 更新しました
- 2022-11-18 attributedString に変更しました
- 2022-11-10 upload