waiei -blog-

その日の出来事を簡単に紹介する日記

HSPでAeroのグラスウインドウに描画

2013-09-14-Sat-23:30
5年越しの悲願
日記マンガ

黒文字も透けません!
全画面グラス
一部グラス




こんにちは、A.Cです。
今回はHSPの記事です。超マニアックです。

かなり長いんで続きの方に書きました。右のRead moreから⇒

HSPでタスクバープログラミング

2010-08-02-Mon-13:00
Web拍手レス
どうも。
Stepmania用の矢印を作ってみたのですが、リフトのデザインを
A.Cさんの「YA_SOLO2」のリフトデザインを
模倣したものにしてしまいました。
すいません
(D.J.Sinさん)
どうもですー。
まあ、矢印を踏むな的な画像と言えばあー言うデザインになるのは
仕方ないと思いますけどねー。




HSPでWindows7のタスクバープログラミング!

はい、どうもこんにちは。A.Cです。
久々の更新ですが今回はHSP系の小ネタを書いていこうかと思います。
たまに参考記事でリンクされることあるみたいなんで
今回からHSP系の話はいつもの日記と混ぜずに別記事にしています。

・タスクバープログラミングとは
Win7からタスクバーのデザインが一新されていろいろ弄れるようになりました。
まあこの辺はMSのサイトでも見てもらったほうが早いんですけどね。
この辺とか。

・COMコンポーネントの登録
このタスクバープログラミング、Aero機能やGDI+などみたいに
Win32 APIを呼び出してうんたらと言うやり方が出来ないんで
COMコンポーネントを利用します。
ちなみに、インターフェースIDやクラスID、メソッドindex値の調べ方は
イノビアさんのHSP3.x講座に載っていたので参考にしました。(ありがたやー)
とりあえず、今回使う分だけ登録するとこんな感じ
#define CLSID_TaskbarList "{56FDF344-FD6D-11d0-958A-006097C9A090}"
#define IID_ITaskbarList3 "{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}"

#include "user32.as"
#usecom ITaskbarList3 IID_ITaskbarList3 CLSID_TaskbarList
#comfunc ITaskbarList3_SetProgressValue 9 int,double,double
#comfunc ITaskbarList3_SetProgressState 10 int,int
#comfunc ITaskbarList3_ThumbBarAddButtons 15 int,int,int
#comfunc ITaskbarList3_SetOverlayIcon 18 int,int,wstr

#define THB_BITMAP    0x00000001
#define THB_ICON      0x00000002
#define THB_TOOLTIP   0x00000004
#define THB_FLAGS     0x00000008
#define THBN_CLICKED        0x1800

#define TBPF_NOPROGRESS     0x00000000
#define TBPF_INDETERMINATE  0x00000001
#define TBPF_NORMAL         0x00000002
#define TBPF_ERROR          0x00000004
#define TBPF_PAUSED         0x00000008

    screen 0,400,80
    pos 10,10:font "meiryo",16
    mes "HSPでタスクバープログラミング!"
    newcom iTask3, ITaskbarList3
    onexit *e
    stop
*e
    delcom iTask3
    end


ITaskbarList3のメソッドインデック値は
ITaskbarListとITaskbarList2も含めて数えるので9からになります。
さて、登録してる命令からわかるように、
今回はオーバーレイアイコンとプログレスバー、
縮小表示ツールバーを実装してみます。

・オーバーレイアイコン
タスクバーのアイコンサイズが32x32以上の場合、
その上に小さなアイコンを重ねて表示させることができます。
たとえば、お馴染みメッセンジャーの場合
オンライン時
オンライン
取り込み中
取り込み中
とまあ、本来の人型アイコンの上に色のついた四角形アイコンを重ねています。
これは、LoadImageなどで読み込んだアイコンを
SetOverlayIconで登録させるだけです。
#define CLSID_TaskbarList "{56FDF344-FD6D-11d0-958A-006097C9A090}"
#define IID_ITaskbarList3 "{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}"

#include "user32.as"
#usecom ITaskbarList3 IID_ITaskbarList3 CLSID_TaskbarList
#comfunc ITaskbarList3_SetProgressValue 9 int,double,double
#comfunc ITaskbarList3_SetProgressState 10 int,int
#comfunc ITaskbarList3_ThumbBarAddButtons 15 int,int,int
#comfunc ITaskbarList3_SetOverlayIcon 18 int,int,wstr

#define THB_BITMAP    0x00000001
#define THB_ICON      0x00000002
#define THB_TOOLTIP   0x00000004
#define THB_FLAGS     0x00000008
#define THBN_CLICKED      0x1800

#define TBPF_NOPROGRESS     0x00000000
#define TBPF_INDETERMINATE  0x00000001
#define TBPF_NORMAL         0x00000002
#define TBPF_ERROR          0x00000004
#define TBPF_PAUSED         0x00000008

    screen 0,400,80
    pos 10,10:font "meiryo",16
    mes "HSPでタスクバープログラミング!"
    newcom iTask3, ITaskbarList3

    ;----アイコンハンドルの取得
    LoadImage 0,32513,1,16,16,0x8000
    hIco=stat

    ;----オーバーレイアイコン
    ITaskbarList3_SetOverlayIcon iTask3,hwnd,hIco,""

    onexit *e

    stop
*e
    delcom iTask3
    DestroyIcon hIco
    end


実行結果はこちら
オーバーレイアイコン
ね、簡単でしょ?
ホントは、ハンドルの取得に成功しているかどうか
チェックするべきなんですけど長くなるんで省略。





続きー。

・プログレスバー
作業が何%完了したのか示すアレです。
最近のMediaPlayerClassicでも採用されています。
(あれは使い方間違ってるような気がしないでもないが)
task_prg.jpg
これはSetProgressValueというそのまんまな物を使います。
ただ、現在の値と最大値の指定はULONGLONG型、
つまり64ビット符号なし整数という誰得な型を使うため
HSP側からの指定には少し工夫が要ります。
簡単に言うと、lpokeで直接書き込む。
#define CLSID_TaskbarList "{56FDF344-FD6D-11d0-958A-006097C9A090}"
#define IID_ITaskbarList3 "{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}"

#include "user32.as"
#usecom ITaskbarList3 IID_ITaskbarList3 CLSID_TaskbarList
#comfunc ITaskbarList3_SetProgressValue 9 int,double,double
#comfunc ITaskbarList3_SetProgressState 10 int,int
#comfunc ITaskbarList3_ThumbBarAddButtons 15 int,int,int
#comfunc ITaskbarList3_SetOverlayIcon 18 int,int,wstr

#define THB_BITMAP    0x00000001
#define THB_ICON      0x00000002
#define THB_TOOLTIP   0x00000004
#define THB_FLAGS     0x00000008
#define THBN_CLICKED      0x1800

#define TBPF_NOPROGRESS     0x00000000
#define TBPF_INDETERMINATE  0x00000001
#define TBPF_NORMAL         0x00000002
#define TBPF_ERROR          0x00000004
#define TBPF_PAUSED         0x00000008

    screen 0,400,80
    pos 10,10:font "meiryo",16
    mes "HSPでタスクバープログラミング!"
    newcom iTask3, ITaskbarList3

    onexit *e

    ddim c,1    ;現在位置
    ddim m,1    ;最大値
    lpoke m,0,100   ;直接書き込む
    repeat 100
    lpoke c,0,cnt
    ITaskbarList3_SetProgressValue iTask3,hwnd,c,m
    title ""+lpeek(c,0)+"%"
    wait 10
    loop
    lpoke c,0,lpeek(m,0)
    ITaskbarList3_SetProgressValue iTask3,hwnd,c,m
    title "完了"

    stop
*e
    delcom iTask3
    DestroyIcon hIco
    end


実行結果
task_prg_hsp.jpg

エラー時など、特殊状態にしたい場合はSetProgressStateメソッドを呼ぶ。
    ITaskbarList3__SetProgressState iTask3,hwnd,TBPF_INDETERMINATE

未確定時

    ITaskbarList3__SetProgressState iTask3,hwnd,TBPF_PAUSED

一時停止時

    ITaskbarList3__SetProgressState iTask3,hwnd,TBPF_ERROR

エラー時

・縮小表示ツールバー
メッセンジャーなど、サムネイルプレビュー上でボタン操作が出来るアレです。
task_tool.jpg
これは、まずThumbBarAddButtonsメソッドで登録し、
ボタンを押されたときにWM_COMMANDメッセージを処理します。
ただ、これに関しては2つ以上のボタンを表示しようとすると
エラーが発生するのでとりあえず1つの状態のみ。
誰か2つ以上のボタン表示解読してー(投げやり)
#define CLSID_TaskbarList "{56FDF344-FD6D-11d0-958A-006097C9A090}"
#define IID_ITaskbarList3 "{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}"

#include "user32.as"
#usecom ITaskbarList3 IID_ITaskbarList3 CLSID_TaskbarList
#comfunc ITaskbarList3_SetProgressValue 9 int,double,double
#comfunc ITaskbarList3_SetProgressState 10 int,int
#comfunc ITaskbarList3_ThumbBarAddButtons 15 int,int,int
#comfunc ITaskbarList3_SetOverlayIcon 18 int,int,wstr

#define THB_BITMAP    0x00000001
#define THB_ICON      0x00000002
#define THB_TOOLTIP   0x00000004
#define THB_FLAGS     0x00000008
#define THBN_CLICKED      0x1800

#define TBPF_NOPROGRESS     0x00000000
#define TBPF_INDETERMINATE  0x00000001
#define TBPF_NORMAL         0x00000002
#define TBPF_ERROR          0x00000004
#define TBPF_PAUSED         0x00000008


    screen 0,400,80
    pos 10,10:font "meiryo",16
    mes "HSPでタスクバープログラミング!"
    newcom iTask3, ITaskbarList3

    LoadImage 0,32513,1,16,16,0x8000
    hIco=stat

    onexit *e

    ;----サムネイルツールバー
    sdim tip,260    ;ツールチップに表示させる文字
    cnvstow tip,"押すなよ!"    ;Unicode文字で登録
    dim buttons,115
    buttons=THB_ICON|THB_TOOLTIP|THB_FLAGS, 0,0,hIco
    ;                   ここの値がボタンID ┘
    memcpy buttons,tip,260,16,0 ;ツールチップ内容をメモリコピー
    ITaskbarList3_ThumbBarAddButtons iTask3,hwnd,1,varptr(buttons)

    oncmd gosub *WM_COMMAND,0x111
    stop

*WM_COMMAND
    if ((wparam>>16)&0x0000FFFF)=THBN_CLICKED{
        if (wparam&0x0000FFFF)=0{   ;ボタンID
            dialog "ボタンが押されました!"
        }
    }
    return

*e
    delcom iTask3
    DestroyIcon hIco
    end


実行結果
task_tool_hsp.jpg

これでツール系ソフト作るときに
ちょっと便利な機能を付けることができるかもですね!




あー、それにしても久しぶりにまともな日記だw

[HSP]

HSP3.2β2

2009-04-16-Thu-03:00
ほとんどの人がわからないネタ日記始まるよー\(^O^)/

HSP3.2β2公開

いろいろ追加されているけど今回個人的に気になったのは
文字列関連とオブジェクト関連かなー
以下更新履歴から引用
HSP3.2では、文字列処理のための機能2つ(split命令、及びstrtrim関数)が標準で追加されています。
split命令は、文字列から区切り文字を使って分割された要素を取得するための命令です。たとえば、「12,34,56」のように「,」で区切られた文字列から、「12」「34」「56」の要素を取り出して、別々の変数に代入することができます。

例 :
  buf="12,34,56"
  split buf, ",", a, b, c
  mes a
  mes b
  mes c

最初これみた時配列に入れたいとき使えないなと思ったが
第3引数に配列変数を指定すると代入できるっぽい。
たとえば上のスクリだと
  buf="12,34,56"
  dim a
  split buf, ",", a
  mes a(0)
  mes a(1)
  mes a(2)

こんな感じ。
まーでもこれはrepeat・loopとgetstrを組み合わせたら
普通にできるからそんなに使わない気がするけど
もう一つ↓
strtrim関数は、文字列の中や、両端にある特定の文字を除去します。

例 :
  a=" ABC DEF "
  b = strtrim(a,0,' ')
  mes b

これはすごく便利な悪寒。
ステマニのsm形式とか結構半角スペースが入っているので
いちいち除去するのめんどくさいなーと思っていたところ。
これ使えばすばやく処理できそうだなー。

次にオブジェクト関連
objenable命令は、一時的なオブジェクトの有効化、無効化を設定
おぉ、ついに標準命令でできるようになった!
といっても3.1でもモジュール読み込んだらいけたはずだが
まー、ややこしい記述がなくなるのは良いことだ。

そしてこれ、今回一番気になったネタ
HSP3.2では、objimage命令によりカスタムボタンを設定することができるようになっています。カスタムボタンとは、ユーザーが用意した画像をボタンの外観とするもので、アプリケーションのイメージを変えることが可能です。
なんかキタ━━━━━━(゚∀゚)━━━━━━━!!!!!
早速実験
まず普通にコードを書く

    screen 0,200,100
    title "ボタンテスト"
    objmode 1,1
    boxf
    objsize 80,25
    button gosub "あたい",*btn
    button gosub "ってば",*btn
    button gosub "最強ね",*btn
    stop
*btn
    return


するとこんな感じ
atai_1.png
すごく・・・、普通です。

次にこんな画像を用意して
あたいボタン(80x25)
少しコードを書き足す

    chdir dir_exe
    buffer 1
    picload "crn_btn.gif"
    screen 0,200,100
    title "ボタンテスト"
    objmode 1,1
    boxf
    objsize 80,25
    objimage 1,0,0,0,50,0,25
    button gosub "あたい",*btn
    button gosub "ってば",*btn
    button gosub "最強ね",*btn
    stop
*btn
    return


するとこうなる!
atai_2.png
これ便利だねー。
あ、上のボタン画像を使いたいって人は勝手に使ってくださいw
改造してもOKです。
ボタン以外のオブジェクトに対応していなかったり
上記の無効化時用画像は設定できなかったりと問題もあるけど
今まで面倒だったことが一気にできるようになったなー。


[日記] [HSP]

くかくかすーすー

2008-04-29-Tue-22:00
最近漫画のほう全然更新してないなー

Web拍手レス
4/27
ホントに紹介されてるwwすげぇ!
ネタじゃないよwww
しかし思うが窓の杜はどこでソフトの情報拾ってきてるんだろうなー

4/28
おまえはよく頑張ったの条件に、
ネットワーク使用率の平均を追加して欲しい!!

おっと、またもや通信関係ですか
通信関連になるととりあえずDLLが増えるから
ファイルサイズが合計で1MBほどになる予感w
ネットワークバージョンと通常版の2つ作るのもありかなー
とりあえず、バージョンアップネタとして考えておきますー




HSPでVista専用のプログレスバーネタ

というわけでサンプルコードの載せる練習をしつつ
小ネタな記事を書いてみる

Kpanさんプログレスバーメモを見ていると
対応がVista以降なるものがいくつかあったので
どんな効果なのか実際に作ってみることに

スクリプト(トリプルクリックで選択可能)
#define PBS_MARQUEE 0x08
#define PBST_NORMAL 0x0001
#define PBST_ERROR  0x0002
#define PBST_PAUSED 0x0003
#define PBM_SETSTATE 0x0410
#define PBM_GETSTATE 0x0411
#define PBM_SETMARQUEE 0x040A

#module
#defcfunc getprgstat int p1
sendmsg p1,0x0411:prgstat=stat
if prgstat=0x0001{
    return "通常"
}else:if prgstat=0x0002{
    return "エラー"
}else:if prgstat=0x0003{
    return "一時中断"
}else{
    return "なぁにこれ~?"
}
#global

    screen 0,240,260:title "VistaPBで遊ぶ"
    pos 20:sysfont 17
    mes "\n(0) 通常"
    winobj "msctls_progress32""", , $50000000, 200, 20
    prg0=objinfo(stat,2)
    mes "\n(1) エラー"
    winobj "msctls_progress32""", , $50000000, 200, 20
    prg1=objinfo(stat,2)
    mes "\n(2) 一時中断"
    winobj "msctls_progress32""", , $50000000, 200, 20
    prg2=objinfo(stat,2)
    mes "\n(3) セットアップ時のアレ(XP以降)"
    winobj "msctls_progress32""", , $50000000 | PBS_MARQUEE, 200, 20
    prg3=objinfo(stat,2)
    sendmsg prg0,0x402,50                   //メモリを50%の位置に設定
    sendmsg prg0,PBM_SETSTATE,PBST_NORMAL   //状態設定(p3の値で設定)
    sendmsg prg1,0x402,50
    sendmsg prg1,PBM_SETSTATE,PBST_ERROR
    sendmsg prg2,0x402,50
    sendmsg prg2,PBM_SETSTATE,PBST_PAUSED
    sendmsg prg3,PBM_SETMARQUEE,1,20        //p3=1で有効 , p4=メモリの速さ(ミリ秒)
    mes "\n"
    mes "(0) の状態:"+getprgstat(prg0)
    mes "(1) の状態:"+getprgstat(prg1)
    mes "(2) の状態:"+getprgstat(prg2)
    mes "(3) の状態:"+getprgstat(prg3)
    


実行するとこんな感じ
vistapb.png

50% になるまでは全部緑色なんですけど
なった瞬間色が変わります。
ちなみに一番下はおまけw
XP以降で動作するアレです。

XPで見たほうがわかりやすいかも
xppb.png

状態取得&変更はVista以降なので正しく出ていません。
ちなみにXPだと一番下のバーの動作がちょっと速いような。
50ミリ秒くらいにするほうが良いかとおもうけど
それだとVistaじゃ逆に遅い…
むーん、何でこんなめんどい仕様なんだYO

ちなみにクラシック環境だとこうなる
vistaclpb.png


だけど98だとかなり悲惨w
98pb.png


[HSP]

どうでもいい話

2008-03-04-Tue-02:00
Web拍手レス
YOSINACと検索していつもここに来ているのですが、
間違えて「YOSINAX」に・・・w

某アニメ会社名みたいになってますねw

DDRSN2買ったぜーうへーい
ダイアリーの日付がすごいことになってる・・・
プリンが最初からずっとBPM800だったらよかった

おめー
日付が新しかったら強制で一番上に記事になるみたい
でも2038年以降は設定できない(2038年問題参照
ずっとBPM800だと目が追いついても足が動かないと思われ




grbox.gif

この間知ったんだがHSPでグループボックスを
置いてもちゃんと表示されない現象は
後ろにスタティックテキストを置いておけば大丈夫なんだな

てなわけでKpanさんのサンプルスクリ見ながらモジュってみたが


/*      グループボックスモジュール      */
;
;       grbox str p1,int p2
;           p1...表示する文字
;           p2...0 以外で objmode 1 相当
;           objsize の大きさで描画
;
/*          By sin@YOSINAC              */

#module
#deffunc grbox str p1,int p2
#uselib "gdi32"
#cfunc GetStockObject "GetStockObject" int
    x=ginfo_cx:y=ginfo_cy
    pos x,y:winobj "static""", , $50000000
    pos x,y:winobj "button"""+p1, , $50000000:s=stat
    sendmsg objinfo(s,2),0x00F4,0x0007,-1
    if p2:sendmsg objinfo (s, 2), $30, GetStockObject (17)
    return
#global

;    ↓実験
    objsize 160,120
    pos 100,100:grbox "グループボックステスト",1



これだとオブジェクトしか置けなくなるんだよねー
文字書きたかったらスタティックテキスト使うしかないみたい
使えねー( ゚∀゚)つ)Д`)
HOME