D言語からObjective-CとCocoaAPIを使いたい
D言語で ウクライナ国旗を描いてみました。NSColor.colorCMYK を使用しました。 未完成ながら、mainMenu を追加してみました。
NSColor.colorCMYK(Cyan:magenta:yellow:black:alpha:)の使用

サンプルコード
Powered by Prism
uflag/dub.json
{
"authors": ["hidhok"],
"description": "A D/Objective-C Cocoa application.",
"name": "uflag",
"dflags": ["-L-framework", "-LCocoa"],
"sourceFiles": ["../cocoa/window",
"../cocoa/control",
"../cocoa/menu"]
}
uflag/source/app.d
/**
* uflag/source/app.d ukrainianFlag Version 0.0.4
*/
module uflag.main;
import core.attribute : optional, selector;
import std.conv : to;
import std.math;
import std.stdio;
import cocoa.window;
import cocoa.menu;
string appName = "ukrainianFlag";
string versionNo = "0.0.4";
string helpMessage = "CocoaAPIを使用して ColorCMYK を、\nD言語で表示してみました。";
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 r) @selector("drawRect:") {
NSColor ukraineB, ukraineY;
NSPoint center;
CGFloat radius, flagW, flagH;
NSRect flagRectB, flagRectY;
CGFloat w = r.size.width;
CGFloat h = r.size.height;
center.x = w / 2;
center.y = h / 2;
if (w > h * 1.5) {
flagH = h - 20;
flagW = flagH * 3 / 2;
} else {
flagW = w - 20;
flagH = flagW * 2 / 3;
}
NSColor.white.fill;
NSRectFill(r);
flagRectB = NSMakeRect(
center.x - flagW / 2, center.y, flagW, flagH / 2);
flagRectY = NSMakeRect(
center.x - flagW / 2, center.y - flagH / 2, flagW, flagH / 2);
ukraineB = NSColor.colorCMYK(0.7, 0.4, 0, 0.23, 1);
ukraineY = NSColor.colorCMYK(0, 0.11, 0.91, 0.02, 1);
ukraineB.fill;
NSRectFill(flagRectB);
ukraineY.setFill;
NSRectFill(flagRectY);
}
}
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;
}
void aboutPanel() @selector("aboutPanel") {
dialog(appName, "Version " ~ versionNo);
}
void showHelp() @selector("showHelp") {
dialog("Help", helpMessage);
}
}
void buildWindow() {
NSWindow win;
NSRect w_rect = NSMakeRect(100, 550, 400, 400);
// appName = NSProcessInfo.processInfo.processName.toDs;
NSApp.menu = mainMenu(appName);
immutable w_style = NSWindowStyleMask.titled |
NSWindowStyleMask.closable |
NSWindowStyleMask.resizable |
NSWindowStyleMask.miniaturizable;
win = NSWindow.alloc.init(w_rect, w_style, backing.buffered, false);
win.title = (appName ~ " (ColorCMYK設定:D言語テスト)").toNs;
DrawView dView = DrawView.alloc.init;
win.contentView = dView;
ViewController vCtrler = ViewController.alloc.init;
vCtrler.view.subview = dView;
win.makeKeyAndOrderFront = null;
NSApp.activateIgnoringOtherApps = true;
}
extern (Objective-C)
class ViewController : NSViewController {
override static ViewController alloc() @selector("alloc");
override ViewController init() @selector("init");
override void loadView() @selector("loadView") {
printf("loadView\n");
}
override void viewDidLoad() @selector("viewDidLoad") {
printf("viewDidLoad\n");
}
}
cocoa/window.d
cocoa/control.d
cocoa/menu.d
- Log
- 2024-06-07 修正しました
- 2024-01-22 修正しました
- 2023-01-24 修正しました
- 2022-06-24 修正しました
- 2022-03-03 meinMenu() を cocoa/menu.d に置きました。
- 2022-03-03 upload