[D 語言] GtkD 的不規則視窗。

前幾天 GtkD 這個給 D 語言用的函式庫終於正式發佈 1.0 版了,測了一下,在 Windows 上也能很簡單的跑起來,中文也沒問題,所以就想來試一些比較好玩的東西。

剛好想到一些相當萌的桌面小幫手(例如偽春菜之類的),執行的時候,那些美美的人物自然不會被醜陋的視窗困住,那麼能不能用 GtkD 做出這個效果呢?剛開始的時候因為不知道要用哪些 API 來做,所以花了很長的時間找資料和 Try & Error,但沒想到真的拼出來後竟是意外的簡單。

另外,小小抱怨一下,GtkD 上的 API 文件實在太舊啦,害我不時得直接去翻原始碼,一整個囧啊!

以下,就是這次的成果,其實除了顯示我心愛的蜜爾菲優外,什麼事也不能做。上圖則是是在 Windows XP 上跑的情況。

而這個小實驗,應該也證明了 D 語言已經足以用來開發視窗程式囉,這下可以直接把 Java 丟一旁啦,D 語言萬歲!

最後,這個程式主要是參考這個範例修改而來的,如果你是使用原始的 GTK+ 函式庫,可以參考那個範例,一樣可以做出相同的效果。

import tango.io.Stdout;

import gdk.Pixmap;
import gdk.Bitmap;
import gdk.Pixbuf;

import gtk.Widget;
import gtk.Main;
import gtk.Window;
import gtk.Image;

// 我們只需要 Image 與 Bitmap mask
Image loadFromFile (char [] filename, 
                    out Bitmap mask)
{
    // 因應 API 需求,我們用不到
    GdkPixmap * pixmap;  

    // 建立圖型
    Image image = new Image ("test.png");

    // 取得 mask
    image.getPixbuf.
    renderPixmapAndMask (pixmap, mask, 100);

    return image;
}

void main(char[][] args)
{
    // 當使用者按下右鍵離開
    bool buttonPressed (
        GdkEventButton * event, 
        Widget widget)
    {
        Stdout.format ("Button Prssed:{}", 
                       event.button).newline;

        if ( event.button == 3 ) {
            Main.exit (0);
        }

        return true;
    }


    // 初始化 GTK
    Main.init (args);

    // 主視窗,採用彈出式視窗,所以沒有標題列
    Window window;
    window = new Window (
        GtkWindowType.POPUP
    );

    window.addOnButtonRelease (
        &buttonPressed
    );

    // 讀取圖片檔並取得遮罩
    Bitmap mask;
    Image  image = loadFromFile ("test.png", 
                                 mask);

    window.add (image);

    // 重點是這行,把除了圖案的部份全部遮掉
    window.shapeCombineMask (mask, 0, 0);

    // 顯示所有東西
    window.showAll ();
    Main.run ();
}

回響