waiei -blog-

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

スポンサーサイト

--------------:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HSPプログラムコンテストに作品を出さない理由

2017-07-25-Tue-22:00
いわゆるただの愚痴です。
これからプログラムコンテストに作品出すぞーって方の
やる気をそぐ内容になっているかもしれないんでご了承を。
また、HSPコンテスト事務局に対して強い不信感を持っているため
事務局の対応をネガティブにとらえている可能性もあります。

結構長いので続きを読むからどうぞ



スポンサーサイト

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]

薬切れ

2009-05-24-Sun-01:30
ほとんどの人にはわからない
スーパーマニアック日記はじまるよー\(^O^)/

BDSV3の設定ファイルは、
ワケありでUTF-8で保存しようかなと思ったんですが
HSPではShift-JISが基本コードであるため
そのままでは使えません。
しかし、かろうじでUnicode(UTF-16)も扱えるので
一旦UTF-8をUnicodeに変換しておけば
たとえShift-JISで出せない文字が入っていても(ハートなど)
読み取ることができるわけです。

スクリプトはこんな感じ↓
#uselib "user32"
#func DrawText "DrawTextW" int,wptr,int,int,int
#uselib "kernel32"
#define CP_UTF8         65001   ; UTF-8
#func MultiByteToWideChar "MultiByteToWideChar" sptr,sptr,sptr,sptr,sptr,sptr

//----Unicode(UTF-16)
    sdim h16,64     ;確保
    lpoke h16,0,38<<24|97<<16|254<<8|255    ;Unicodeでハート(255 254 97 38)
                                            ;↓これと同等の処理
    ;poke h16,0,255 : poke h16,1,254 : poke h16,2,97 : poke h16,3,38
    pos 50,50:sysfont 17
    mes "Unicodeの文字を描画"
    font msgothic,150,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h16),-1,varptr(rect),0
    redraw  ;必須

//----UTF-8
;最終的にはUnicodeに変換しないといけない
    sdim h8,64      ;確保
    poke h8,0,239
    poke h8,1,187
    poke h8,2,191
    poke h8,3,226
    poke h8,4,153
    poke h8,5,161   ;UTF-8でのハート(でかすぎフイタw 6byte)
    
    pos 200,50:sysfont 17
    mes "UTF-8の文字をUnicodeと同じように描画"
    font msgothic,150,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h8),-1,varptr(rect),0
    pos 200,250:sysfont 17
    mes "ですよねー。\n\nと言うわけで変換して描画"

    sdim h8to16,64  ;変換後の変数
    MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255

    font msgothic,150,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h8to16),-1,varptr(rect),0
    redraw  ;必須
    stop



※追記:
 ここででかすぎ6バイトといっていたが調べてみると
 メモ帳などでUTF-8のテキストと判断するための
 フラグが先頭3バイトを占領していることが判明、
 つまり実質UTF-8でのハートの文字は3バイト


※さらに追記:
 Unicodeの方も先頭2バイトは判別フラグみたいです。
 つまりUnicodeのハートは2バイト


これを実行するとこんな感じ。
uni.png

とまあこんな感じでUTF-8の文字を描画することができました。
しかしここで問題が、
読み込むときはそれで良いですが、
保存する時はどうすれば良いのか・・・!?

変換部分のここ
    MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255

ここの第1パラメーターのCP_UTF8の部分を
Unicodeに該当する定数にすれば良いのかなと思いきや

MultiByteToWideChar 関数 - MSDN
文字列をワイド文字列(Unicode)にマップします
定数意味
CP_ACPANSI コードページ
CP_MACCPMacintosh コードページ
CP_OEMCPOEM コードページ
CP_SYMBOLシンボルコードページ(42)
CP_THREAD_ACP現在のスレッドの ANSI コードページ
CP_UTF7UTF-7 を使った変換
CP_UTF8UTF-8 を使った変換


あれ、無い。

これはもう他の方法を探すしかないなと思い
とりあえずMultiByteToWideCharでググっていると
MultiByte.png
ん?

「WideCharToMultiByte」?

WideCharToMultiByte 関数 - MSDN
ワイド文字列を新しい文字列にマップします

逆版があるだと!?

#uselib "user32"
#func DrawText "DrawTextW" int,wptr,int,int,int
#uselib "kernel32"
#define CP_UTF8         65001   ; UTF-8
#func MultiByteToWideChar "MultiByteToWideChar" sptr,sptr,sptr,sptr,sptr,sptr
#func WideCharToMultiByte "WideCharToMultiByte" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr

//----UTF-8
;最終的にはUnicodeに変換しないといけない
    sdim h8,64      ;確保
    poke h8,0,239
    poke h8,1,187
    poke h8,2,191
    poke h8,3,226
    poke h8,4,153
    poke h8,5,161   ;UTF-8でのハート(でかすぎフイタw 6byte)
    
    pos 50,30:sysfont 17
    mes "UTF-8の文字をUnicodeと同じように描画"
    font msgothic,100,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h8),-1,varptr(rect),0
    pos 50,170:sysfont 17
    mes "ですよねー。\n\nと言うわけで変換して描画"

    sdim h8to16,64  ;変換後の変数
    MultiByteToWideChar CP_UTF8, 0, varptr( h8 ), -1, varptr( h8to16 ), 255

    font msgothic,100,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h8to16),-1,varptr(rect),0

    pos 50,300:sysfont 17
    mes "無事描画成功!じゃあ今度は戻してみよう!"

    sdim h16to8,64  ;変換後の変数
    WideCharToMultiByte CP_UTF8, 0, varptr( h8to16 ), -1, varptr( h16to8 ), 255, 0, 0

    font msgothic,100,16
    rect=ginfo_cxginfo_cyginfo_winxginfo_winy     ;文字の描画領域
    DrawText hdc,varptr(h16to8),-1,varptr(rect),0

    redraw  ;必須



utf8.png

         ,,x-ー:: ":::::
        ,x '"::::::::::::::::::::
      ,、'":::::::::::::,, x-‐ ァ:
    ,,x '"::::::,,、- '"     |:::
    `"i`ー'"        ヾ
      !  、 、,,,,,,,,,;;;;;;;;;彡ミ
     |,,,,ノi `ーヾ;; '"----、
     ヾ::ヽ     -┴'~
      ~|:/ ' ' ' `ー ' "'"
      /_
     l    '' )    i
      ヽ,,、'~`      U
       ゙, __ ,-、_,ノ`
 |/      ゙, `'" ,,y
 |/  彡  ゙、`-'"
   /|/     i
   /        !    ,, -'"
    |     `ー '"|::
    |      /|||ヽ
          /|||||/心
          |ヾ/ /`ー


というわけで無事にUTF-8が扱えそうです^q^





Web拍手レス
なるほど、早速やってみようと思います。
DDR Xはリミックス解禁したんですねー。
結局最後までクリアできませんでしたが。
○の中には⑨が入ると思いますw
らのっちぇさん
改めてみるとセイバーリミ鬼の途中50連近くの部分が
人間業じゃない気がしますねーw
今日やりに行こうかなと思いましたけど
風邪治らないしインフルで外出控えるよう言われてるし雨だしで
多分無理な予感w

雑談劇場の「背景の謎1」見てたんですけど、
やっぱりH500ってトムさんが「HELP!」って言おうとして
最初の部分を言いにくくて、「h...h.h....(ry」
って500回も言ったんですよね?
(D.J.Sin さん)
CATASTROPHEの文字のとおり大惨事に見舞われた
トムさんが必死になって言ったわけですよっ!

[日記マンガ] [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]
HOME NEXT
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。