balloon(fukidasi) を四隅に配置しちゃう

たまにはUWSCのネタも書かなくてはいけない
ここは本来そういう場所だ

balloon または fukidasi 関数、便利ですよね
座標指定しないと画面の左上に表示されますよね
でも右上だったり右下だったり左下だったりに表示したいこともありますよね
はい

できます
ついでにマルチモニタ対応
タスクバーに被さらないという配慮

module Balloon
    const POS_TOP_LEFT     = 0
    const POS_TOP_RIGHT    = 1
    const POS_BOTTOM_LEFT  = 2
    const POS_BOTTOM_RIGHT = 3

    dim fontName        = "MS Gothic"
    dim fontSize        = 13
    dim fontColor       = $000000
    dim backgroundColor = 0
    dim transparency    = 0

    procedure Show(text, position = POS_TOP_LEFT, display = 0)
        balloon(text, G_SCREEN_W, 0, 0, fontSize, fontName, fontColor, backgroundColor, transparency)
        point = GetPoint(getid(GET_FUKIDASI_WIN), position, display)
        balloon(text, point[0], point[1], 0, fontSize, fontName, fontColor, backgroundColor, transparency)
    fend

    function GetPoint(id, position, display)
        result = safearray(0, 1)
        dim MonitorInfo[9]
        MonitorInfo[0] = 40

        GetMonitorInfoW(MonitorFromPoint(monitor(display, MON_X), monitor(display, MON_Y), 0), MonitorInfo)

        MonitorRect = slice(MonitorInfo, 1, 4)
        MonitorRect[2] = MonitorRect[2] - MonitorRect[0]
        MonitorRect[3] = MonitorRect[3] - MonitorRect[1]
        DesktopRect = slice(MonitorInfo, 5, 8)
        DesktopRect[2] = DesktopRect[2] - DesktopRect[0]
        DesktopRect[3] = DesktopRect[3] - DesktopRect[1]
        select position
            case POS_TOP_LEFT
                result[0] = DesktopRect[0]
                result[1] = DesktopRect[1]
            case POS_TOP_RIGHT
                width = MonitorRect[2]
                result[0] = MonitorRect[0] + width - status(id, ST_WIDTH)
                result[0] = result[0] - (width - DesktopRect[2])
                result[1] = DesktopRect[1]
            case POS_BOTTOM_LEFT
                height = MonitorRect[3]
                result[0] = DesktopRect[0]
                result[1] = MonitorRect[1] + height - status(id, ST_HEIGHT)
                result[1] = result[1] - (height - DesktopRect[3])
            case POS_BOTTOM_RIGHT
                width  = MonitorRect[2]
                height = MonitorRect[3]
                result[0] = MonitorRect[0] + width  - status(id, ST_WIDTH)
                result[0] = result[0] - (width - DesktopRect[2])
                result[1] = MonitorRect[1] + height - status(id, ST_HEIGHT)
                result[1] = result[1] - (height - DesktopRect[3])
        selend
    fend

    DEF_DLL MonitorFromPoint(long,long,DWORD): DWORD: user32
    DEF_DLL GetMonitorInfoW(DWORD,var long[]): BOOL: user32
endmodule

使い方
Balloon.Show(表示内容, 表示位置, 表示モニタ番号) です
表示位置は Balloon.POS_* 定数で指定
モニタ番号はプライマリなら0です

フォントや色の変更はそのままだと出来ませんが、必要なら SetFontName みたいな関数定義したらいいと思います

以下サンプル

dim p[] = "左上", "右上", "左下", "右下"
m = 0
n = 0
if monitor() > 1 then slctMon = "モニタを選択 [" + m + "]" else slctMon = ""
with Balloon
    .Show(p[n] + " に表示しています", n, m)
    while TRUE
        r = slctbox(SLCT_BTN or SLCT_NUM, 0, "選ぶ", p, slctMon)
        if r = -1 then exit
        if r > length(p) - 1 then
            tmp = ""
            for i = 0 to monitor() - 1
                tmp = tmp + " " + i
            next
            m = slctbox(SLCT_CMB or SLCT_STR, 0, "モニタを選ぶ", split(tmp, " ", TRUE, TRUE))
            if m = -1 then exit
            slctMon = "モニタを選択 [" + m + "]"
        else
            n = r
        endif
        .Show(p[n] + " に表示しています", n, m)
    wend
endwith

ここでもしれっと使ってるけど slctbox のボタン要素に空文字やEMPTYを渡すとボタンが表示されないのを逆手に取って条件に合えばボタンが表示されるみたいなことが出来るんですね
おぼえとくとべんりだよ

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中