goo blog サービス終了のお知らせ 
goo

ファイルの暗号化

一覧リスト:HSP Ver2.61 ブログ関連 ・・・ 人気blogランキング

xorを使った暗号化
暗号化する方法はいくつかあると思いますが
今回はxor(^)を使用します。
例えば、100^10は110になります。
次に110^10として同じ10をxorすると100に戻ります。
つまり ^10とすることで100を110に暗号化
もう一度することで110を100に複合化できたことになります。

HSPには「peek」で変数の任意の場所の1バイトを読み込むことができます
また、「poke」で任意の場所の1バイトを変更できます。

例)
//暗号するデータ
data="aaabcdefg"
//1バイトを格納する整数変数
d=0
//暗号化前のデータを表示
mes ""+data
//データの長さをdatasizeに代入
strlen datasize,data
//長さの分だけ繰り返す
repeat datasize
peek d,data,cnt
//dの数値がxorする10と同じの時
//10^10は0になります
//0を代入すると変数の終わりになってしまうので
//その場合はそのままの数値をdataに代入します

if d!=10:d=d^10
poke data,cnt,d
loop
mes ""+data
stop
上記を実行すると
aaabcdefg
kkkhinolm
となります。
ところで、aaaのところがkkkとなり
同じ文字が3つあることがあることがばれてます。

乱数を使用することで見た目ばらばらに見せる事が可能です。
簡単な暗号なので、詳しい人なら複合化できるかもしれませんが・・・
以下サンプルです。
乱数について 参照)

暗号化サンプル
ファイルを読み込むか、mesboxに自分で文字を入力して
変換ボタンを押すことで、暗号⇔複合します。保存はしていません。
※重要箇所は青文字にしています
#include "llmod.as"
#include "obj.as"
    screen 0,dispx,dispy,0,10,20
    width 600,600
    title "TEST 暗号"
    sdim mb1,65536

    //ウィンドウサイズ変更
    mref bmscr,67
    prm = bmscr.13 , -16
    dllproc "GetWindowLongA", prm, 2, D_USER    
    prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000
    dllproc "SetWindowLongA", prm, 3, D_USER

    pos 0,25:mesbox mb1,winx,winy-25,1
    pos 0,0 : objsize winx/2,25:button "ファイルを開く",*load
    pos winx/2,0 : objsize winx/2,25:button "変換",*angou

    wx=winx : wy=winy
*main
    //ウィンドウサイズが変更した時
    if winx!=wx |(winy!=wy){
        prm=winx,winy-25,0,25 : resizeobj 0,prm
        prm=winx/2,25,0,0 : resizeobj 1,prm
        prm=winx/2,25,winx/2,0 : resizeobj 2,prm
        wx=winx : wy=winy
    }
    wait 1
goto *main

*angou
    //mb1を「peek」で1バイトずつ読込んで値を変更して
    //「poke」で1バイト書き直しています
    randomize 10
    strlen tmp,mb1
    repeat tmp
        peek tmp,mb1,cnt
        rnd r,256
        if tmp!=r : tmp=r^tmp
        poke mb1,cnt,tmp
    loop
    objprm 0,mb1
goto *main

*load
    dialog "",16,""
    if stat!=0{
        bload refstr,mb1
        objprm 0,mb1
    }
goto *main
実行結果
暗号化前

暗号化後

コメント ( 2 ) | Trackback ( 0 )

フォーカスが消えないEDITの作成

一覧リスト:HSP Ver2.61 ブログ関連 ・・・ 人気blogランキング


ウィンドウ付属のメモ帳等は、
文字を選択した状態で非アクティブになっても
選択した部分が見えます。
しかし、HSPの「mesbox」のように
見えない物もあります。

しかし、以前サイズ変更可能なscreen 0でサイズ変更
したような方法では実現できません。
エディットボックスで変更可能なパラメータは、
ES_LEFT (0x0000) 左揃えで表示
ES_CENTER (0x0001) 中央揃えで表示
ES_RIGHT (0x0002) 右揃えで表示
ES_UPPERCASE (0x0008) 文字を大文字に変換
ES_LOWERCASE (0x0010) 文字を小文字に変換
ES_PASSWORD (0x0020) パスワード入力(文字が全て*)
ES_OEMCONVERT (0x0400) OEM文字セットに変換
ES_READONLY (0x0800) 入力不可能
ES_WANTRETURN (0x1000) ENTERキーで改行する
ES_NUMBER (0x2000) 数字のみ入力可能

不可能なパラメータは、
ES_MULTILINE (0x0004) 複数行のエディットボックス
ES_AUTOVSCROLL (0x0040) 最下行のENTERで自動的に上スクロール
ES_AUTOHSCROLL (0x0080) 行末で自動的に右スクロール
ES_NOHIDESEL (0x0100) 非アクティブでも選択表示をする


一度「mesbox」を作成してから変更はできませんので、
「mesbox」を使用しないで作成します。
※自作のエディットボックスには
「objprm」「objsel」などの命令は使用できません。

dllproc "CreateWindowExA",prm,12,D_USER
12個もパラメータがありますが簡単だと思います。
prm.0=拡張ウィンドウスタイル 例)0x200
prm.1=クラス名 固定)"EDIT"
prm.2=ウィンドウ名 固定)0
prm.3=ウィンドウスタイル 例)0x503001C4
prm.4~7=ウィンドウ横、縦位置、横サイズ、縦サイズ
prm.8=親ウィンドウ 例)mref bmscr,67 : bmscr.13
prm.9=識別子 0~1023は使えないようです。
   それより大きい値 例)3000
prm.10=インスタンスハンドル 例)bmscr.14
prm.11=ウィンドウ作成データ 特に必要ないので 固定)0

フォーカスが消えない「EDIT」のサンプル
#include "llmod.as"
    screen 0,300,300 : title "TEST EDIT"
    sdim data,64

    mref bmscr,67
    prm=0x0200
    data="EDIT" : getptr prm.1,data
    prm.2=0,0x503001c4,0,0,winx,winy,bmscr.13
    prm.9=3000,bmscr.14,0
    dllproc "CreateWindowExA",prm,12,D_USER
    //戻り値のハンドルを代入
    //この後EDITの操作はhEditを使用します
    hEdit=dllret
stop

コメント ( 0 ) | Trackback ( 0 )

「onclick」命令(HSP Ver2.61)

一覧リスト:HSP Ver2.61 ブログ関連 ・・・ 人気blogランキング


◆HSPプログラミングメモ
●「onclick」
onclick *label
マウスのクリックが押された時に、
*labelで指定したラベルに処理を移します。
※ただし、mesbox等オブジェクトの上でクリックしても
無効になります。クライアント領域のみです。

命令が実行されると、システム変数「iparam」「wparam」「lparam」
に数値が入ります。ヘルプにはなかったので調べてみました。
システム変数の数値
-
iparamwparamlparam
左クリック
0
1
右クリック
3
2
ホイールクリック
6
16

「lParam」の下位ワードには、マウスのx座標(x=lparam & 0xFFFF)
上位ワードには、マウスのy座標が入ります。(y=(lparam >>16) & 0xFFFF)
※ウィンドウマウス座標です。

「onclick」のサンプル
    screen 0,300,300
    title "TEST onclick"
    color : boxf
    color 255,255,255
    pos 10,10 : mes "クライアント領域を黒塗りしています"
    sdim data,1024
    pos 50,50 : mesbox data,200,200,0,1024
    onclick *clk
    stop

*clk
    //半角¥が表示できない為、notesel使用
    data="" : notesel data
    noteadd "iparam="+iparam,0
    noteadd "wparam="+wparam,1
    noteadd "lparam="+lparam,2
    x=lparam & 0xFFFF
    y=(lparam >>16) & 0xFFFF
    noteadd "x座標="+x,3
    noteadd "y座標="+y,4
    objprm 0,data
stop
★文字検索ソフト作成記録
◆変更点
「listbox」と「mesbox」が表示されている場合
それぞれのサイズ変更を可能にする。
現在、クライアントエリアは全て隠れていますが
少し見せた状態にします。
上記の「onclick」を使用してクリックした時に処理をします。
  1. 「onclick」命令を追加
  2. 押された瞬間のx,y座標を変数に代入
  3. マウスボタンが離されるまで
    ループして現在のマウス位置と押された前回の差を
    「listbox」「mesbox」に反映させる。
☆実行画面

☆ソースコード
青の部分は追加したコード、赤の部分は変更したコードです。
ソフト名未定
HSP Ver2.61
内容任意のテキストを検索
btnimg.JPG
(60×20)
ソース
    #include "llmod.as"
    #include "misc.as"
    buffer 2 : picload "btnimg.JPG"
    screen 0,dispx,dispy
    width 160,340
    title "テスト"

    mref bmscr,67
    prm = bmscr.13 , -16
    dllproc "GetWindowLongA", prm, 2, D_USER    
    prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000
    dllproc "SetWindowLongA", prm, 3, D_USER

    wndx=winx : wndy=winy
    //クライアントエリアをグレーに塗りつぶし
    color 192,192,192 : boxf
    objsize 20,20
    pos 0,0 : button "開",*fileopen  //ID:0
    btnimg 0,2,0,0,20,20
    pos 20,0 : button "選",*textselect  //ID:1
    btnimg 1,2,20,0,20,20
    sdim ftext,64 : pos 40,0 : input ftext,100,20,64 //ID:2
    pos 140,0 : button "調",*find  //ID:3
    btnimg 3,2,40,0,20,20
    listno=-1 : listno2=-1
    sdim listdata,1024
    listx=winx-3
    objsize listx,320
    pos 0,20 : listbox listno,0,listdata  //ID:4
    sdim str1,1024
    sdim str2,1024
    sdim editdata,65536
    sdim editdata2,65536
    pos winx,20 : mesbox editdata,0,0,5,65536
    //mesboxの状態変数
    mbflag=0
    onclick *clk

*main
    if (winx!=wndx) | (winy!=wndy){
        _hspobjhandle 2
        prm=stat,40,0,winx-60,20,1
        dllproc "MoveWindow",prm,6,D_USER
        _hspobjhandle 3
        prm=stat,winx-20,0,20,20,1
        dllproc "MoveWindow",prm,6,D_USER

        
        listx+=winx-wndx
        _hspobjhandle 4
        if listx>0{
            prm=stat,0,20,listx,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            _hspobjhandle 5
            prm=stat,listx+4,20,winx-(listx+4),winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        else{
            prm=stat,0,20,0,0,1
            dllproc "MoveWindow",prm,6,D_USER
            _hspobjhandle 5
            prm=stat,4,20,winx-4,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        wndx=winx : wndy=winy
    }
    if listno2!=listno{
        notesel listdata : noteget str1,listno
        getstr str1,str1,1,']':int str1 : str1--
        notesel editdata : noteget str2,str1
        instr tmp.0,str2,ftext,0
        strlen tmp.1,ftext
        prm=hedit,0xBB,str1,0
        dllproc "SendMessageA",prm,4,D_USER
        tmp.0+=dllret : tmp.1+=tmp.0
        prm=hedit,0xB1,tmp.0,tmp.1
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xB7,0,0
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xCE,0,0
        dllproc "SendMessageA",prm,4,D_USER
        str1=(str1-dllret)/2
        prm=hedit,0xB6,0,str1
        dllproc "SendMessageA",prm,4,D_USER

        str str1
        listno2=listno
    }
        wait 10
goto *main

/////////////////////////////////////////////////////////
// クリックが押された時(onclick)
*clk
    //左クリックされたとき
    if wparam=1{
        ginfo 0 : x=prmx
        repeat
            //ボタンを押していない時はループを抜けます
            stick st,256
            if st!=256 : break

            ginfo 0
            if prmx!=x{
                tmp=listx+prmx-x
                //クライアント領域が残るようにする
                if (tmp>=0) & (tmp < (winx-3)){
                    listx=tmp
                    _hspobjhandle 4
                    prm=stat,0,20,listx,winy-20,1
                    dllproc "MoveWindow",prm,6,D_USER
                    _hspobjhandle 5
                    prm=stat,listx+4,20,winx-(listx+4),winy-20,1
                    dllproc "MoveWindow",prm,6,D_USER
                    x=prmx
                }
            }
            wait 1
        loop
    }
goto *main

*fileopen
    dialog "*",16,""
    if stat=1{
        exist refstr
        if strsize < 0:goto *main
        if strsize > 65536:goto *main
        _hspobjhandle 5:hedit=stat
        //mesbox,listboxを移動
        if mbflag=0{
            _hspobjhandle 4
            listx=winx/2
            prm=stat,0,20,listx,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            prm=hedit,listx+4,20,winx-(listx+4),winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            mbflag=1
        }
        notesel editdata:noteload refstr:objprm 5,editdata
    }
    gosub *findlist
goto *main

*textselect
    gsel 0,-1
    screen 3,400,225 : title "テキストを左クリックして下さい"
    gsel 3,2
    cls 1
    /* //現在選択しているテキストを取得
    if hedit!=0{
        prm=hedit,0x000D,65536
        getptr prm.3,editdata2
        dllproc "SendMessageA",prm,4,D_USER
    }*/
    pos 2,3 : mes "取得テキスト:"
    pos 0,25 : mesbox editdata2,400,200
    objsize 60,25
    pos 260,0 : button "決定",*wnd3ok
    pos 330,0 : button "取消",*wnd3cancel
    mref bmscr,67

    *wnd3loop
        stick st,0,0
        prm=0 : dllproc "GetForegroundWindow",prm,0,D_USER
        if st=256 &(bmscr.13!=dllret){
            ginfo 0
            prm=prmx,prmy
            dllproc "WindowFromPoint",prm,2,D_USER
            hedit=dllret
            if dllret!=0{
                prm=hedit,0x000D,65536
                getptr prm.3,editdata2
                dllproc "SendMessageA",prm,4,D_USER
                objprm 0,editdata2
            }
        }
        wait 10
    goto *wnd3loop

*wnd3ok
    //mbflagが1の時はmesboxを隠す
    if mbflag=1{
        gsel 0 : width listx+4 : objprm 5,""
        mbflag=0
    }
    editdata=editdata2
    gosub *findlist

*wnd3cancel
    gsel 3,-1 : gsel 0,1
goto *main

*find
    gosub *findlist
goto *main

*findlist
    notesel editdata : notemax tmp
    listdata=""
    repeat tmp
        notesel editdata : noteget str1,cnt
        instr tmp,str1,ftext,0
        if tmp!=-1{
            getstr str1,str1,tmp,''
            tmp=cnt+1
            notesel listdata : noteadd "["+tmp+"] "+str1,-1
        }
    loop
    objprm 4,listdata
return


このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
コメント ( 0 ) | Trackback ( 0 )

ウィンドウサイズの変更(HSP)

一覧リスト:HSP Ver2.61 ブログ関連 ・・・ 人気blogランキング


◆HSPプログラミングメモ
●screen 0 のウィンドウサイズ変更可能にする その1
  1. #include "llmod.as"
    「dllproc」命令を使用する為、「llmod.as」をインクルードする。
  2. screen 0,dispx,dispy,0,10,20
    width 300,400
    上記のように、ウィンドウを作成する。
    dispx,dispyはシステム変数でディスプレイの横、縦サイズです。
    それぞれがウィンドウの最大サイズとなります。
    10,20は、ウィンドウの横、縦位置です。
    300,400は、ウィンドウの横、縦幅です。
  3. 「GetWindowLongA」で現在のウィンドウスタイル
    GWL_STYLE(-16)を取得します。
    その結果にサイズ変更可能な、WS_THICKFRAME(0x40000)、
    WS_MAXIMIZEBOX(0x10000)を足して「SetWindowLongA」で変更します。

サイズ変更可能ウィンドウのサンプル
#include "llmod.as"

    screen 0,dispx,dispy,0,10,20
    width 300,400

    mref bmscr,67
    prm = bmscr.13 , -16
    dllproc "GetWindowLongA", prm, 2, D_USER    
    prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000
    dllproc "SetWindowLongA", prm, 3, D_USER
stop

※HSPはウィンドウの移動、サイズ変更中は処理が
止まってしまうので移動中のオブジェクトの変更などはできません。
●screen 0 のウィンドウサイズ変更可能にする その2
  1. その1と同様にウィンドウを作成する。
  2. 「mousex」「mousey」「ginfo」で値を調べて
    「width」でウィンドウサイズを変更する。
例)
ウィンドウサイズが300×400の場合、
クライアントエリアは横0~299、縦0~399です。
mousex,mouseyの値を見てみると横300以上、縦400以上
になるときがあります。その時、枠にマウスがあることが
わかります。また、左の枠に合わせるとmousexが65535に
なります。それを利用して作ってみました。
試しに作ってみましたが、マウスカーソルがそのままだったり
いまいちです。
サイズ変更可能ウィンドウのサンプル
    screen 0,dispx,dispy,0,10,20
    width 300,400
*main
    stick st,256,1
    if st=256{
        mw=0
        if mousex>=winx : mw=1
        if mousey>=winy : mw=2
        if mousex=65535 : mw=3
        if (mousex>=(winx-16)) & (mousey>=(winy-16)) : mw=4
        if mw!=0{
            ginfo 0 : mx=prmx : my=prmy

            repeat
                stick st,256,1
                if st!=256 : break
                ginfo 0 : mwx=prmx : mwy=prmy
                if (mwx!=mx) | (mwy!=my){
                    if mw=1 : width winx+(mwx-mx)
                    if mw=2 : width ,winy+(mwy-my)
                    if mw=3 {
                        ginfo 2
                        width winx-(mwx-mx),,prmx+(mwx-mx)
                    }
                    if mw=4 : width winx+(mwx-mx),winy+(mwy-my)
                    mx=mwx : my=mwy
                }
                wait 1
            loop
        }
    }
    title "[mousex="+mousex+" mousey="+mousey+"]"
    wait 10
goto *main



★文字検索ソフト作成記録

◆変更点
  1. ウィンドウサイズ変更可能にしました。
    *mainループでウィンドウサイズが変わったときに
    オブジェクトのサイズ大きさを変更しています。
    また、前回の screen 0,dispx,dispy,0,,,160,340
    の部分を変更しました。



☆実行画面




☆ソースコード
青の部分は追加したコード、赤の部分は変更したコードです。
ソフト名未定
HSP Ver2.61
内容任意のテキストを検索
btnimg.JPG
(60×20)
ソース
    #include "llmod.as"
    #include "misc.as"

    buffer 2 : picload "btnimg.JPG"

    //dispx:ディスプレイ横幅(システム変数)
    //dispy:ディスプレイ縦幅(システム変数)

    //前回の方法では表示がおかしかったので訂正
    screen 0,dispx,dispy
    width 160,340
    title "テスト"

    mref bmscr,67
    prm = bmscr.13 , -16
    dllproc "GetWindowLongA", prm, 2, D_USER    
    prm = bmscr.13 , -16 , dllret | 0x40000 | 0x10000
    dllproc "SetWindowLongA", prm, 3, D_USER

    wndx=winx : wndy=winy

    objsize 20,20
    pos 0,0 : button "開",*fileopen  //ID:0
    btnimg 0,2,0,0,20,20
    pos 20,0 : button "選",*textselect  //ID:1
    btnimg 1,2,20,0,20,20
    sdim ftext,64 : pos 40,0 : input ftext,100,20,64 //ID:2
    pos 140,0 : button "調",*find  //ID:3
    btnimg 3,2,40,0,20,20
    //dim listno
    listno=-1 : listno2=-1
    sdim listdata,1024
    objsize 160,320
    pos 0,20 : listbox listno,0,listdata  //ID:4
    sdim str1,1024
    sdim str2,1024
    sdim editdata,65536
    sdim editdata2,65536
    //mesbox を作成するが見えないようにする
    pos -10,-10 : mesbox editdata,0,0,5,65536
    //mesboxの状態変数
    mbflag=0

*main
    // ウィンドウサイズ変更時
    if (winx!=wndx) | (winy!=wndy){
        //検索文字インプットボックス
        _hspobjhandle 2
        prm=stat,40,0,winx-60,20,1
        dllproc "MoveWindow",prm,6,D_USER
        //検索ボタン
        _hspobjhandle 3
        prm=stat,winx-20,0,20,20,1
        dllproc "MoveWindow",prm,6,D_USER
        //mesboxがない時
        if mbflag=0{
            //リストボックス
            _hspobjhandle 4
            prm=stat,0,20,winx,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        //mesboxがある時
        else{
            //リストボックス
            _hspobjhandle 4
            prm=stat,0,20,winx/2,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            //mesbox
            _hspobjhandle 5
            prm=stat,winx/2,20,winx/2,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
        }
        wndx=winx : wndy=winy
    }

    // リストボックス処理
    if listno2!=listno{
        notesel listdata : noteget str1,listno
        getstr str1,str1,1,']':int str1 : str1--
        notesel editdata : noteget str2,str1
        instr tmp.0,str2,ftext,0
        strlen tmp.1,ftext
        prm=hedit,0xBB,str1,0
        dllproc "SendMessageA",prm,4,D_USER
        tmp.0+=dllret : tmp.1+=tmp.0
        prm=hedit,0xB1,tmp.0,tmp.1
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xB7,0,0
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xCE,0,0
        dllproc "SendMessageA",prm,4,D_USER
        str1=(str1-dllret)/2
        prm=hedit,0xB6,0,str1
        dllproc "SendMessageA",prm,4,D_USER

        str str1
        listno2=listno
    }
        wait 10
goto *main

*fileopen
    //ファイルを開くダイアログの表示
    dialog "*",16,""
    if stat=1{
        exist refstr
        if strsize < 0:goto *main
        if strsize > 65536:goto *main
        _hspobjhandle 5:hedit=stat
        //mesbox,listboxを移動
        if mbflag=0{
            //width winx+200
            _hspobjhandle 4
            prm=stat,0,20,winx/2,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER

            prm=hedit,winx/2,20,winx/2,winy-20,1
            dllproc "MoveWindow",prm,6,D_USER
            mbflag=1
        }
        notesel editdata
        noteload refstr
        objprm 5,editdata
    }
    gosub *findlist
goto *main

*textselect
    gsel 0,-1
    //screen 3 にマウス下の情報を表示
    screen 3,400,225 : title "テキストを左クリックして下さい"
    gsel 3,2
    cls 1
    //現在選択しているテキストを取得
    if hedit!=0{
        prm=hedit,0x000D,65536
        getptr prm.3,editdata2
        dllproc "SendMessageA",prm,4,D_USER
    }
    pos 2,3 : mes "取得テキスト:"
    pos 0,25 : mesbox editdata2,400,200
    objsize 60,25
    pos 260,0 : button "決定",*wnd3ok
    pos 330,0 : button "取消",*wnd3cancel
    mref bmscr,67
    *wnd3loop
        stick st,0,0
        //フォアグラウンドウィンドウハンドル取得
        prm=0 : dllproc "GetForegroundWindow",prm,0,D_USER
        if st=256 &(bmscr.13!=dllret){
            ginfo 0
            prm=prmx,prmy
            dllproc "WindowFromPoint",prm,2,D_USER
            hedit=dllret
            if dllret!=0{
                prm=hedit,0x000D,65536
                getptr prm.3,editdata2
                dllproc "SendMessageA",prm,4,D_USER
                objprm 0,editdata2
            }
        }
        wait 10
    goto *wnd3loop

*wnd3ok
    //mbflagが1の時はmesboxを隠す
    if mbflag=1{
        gsel 0
        width winx-200
        _hspobjhandle 5
        prm=stat,-10,-10,0,0,1
        dllproc "MoveWindow",prm,6,D_USER
        mbflag=0
    }
    editdata=editdata2
    gosub *findlist

*wnd3cancel
    gsel 3,-1
    gsel 0,1
goto *main

*find
    gosub *findlist
goto *main

*findlist
    notesel editdata : notemax tmp
    listdata=""
    repeat tmp
        notesel editdata : noteget str1,cnt
        instr tmp,str1,ftext,0
        if tmp!=-1{
            getstr str1,str1,tmp,''
            tmp=cnt+1
            notesel listdata : noteadd "["+tmp+"] "+str1,-1
        }
    loop
    objprm 4,listdata
return


このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
コメント ( 0 ) | Trackback ( 0 )

ボタンに画像表示(HSP)

一覧リスト:HSP Ver2.61 ブログ関連 ・・・ 人気blogランキング



◆HSPプログラミングメモ
●ボタンに絵を貼り付ける
① 「misc.as」をインクルードする
② ボタンを作成する
③ 「btnimg」命令を使用する
btnimg n1, n2, n3, n4, n5, n6
n1 : イメージを貼りつけるボタンのID(0~63)
n2 : イメージが描画されているウィンドウのID(0~7)
n3 : イメージの位置
n4 : イメージの位置
n5 : イメージの幅
n6 : イメージの高さ
ボタンに画像を貼り付けるサンプル
使用画像ファイル
ファイル名: btntest.JPG
画像サイズ: 200×50
#include "llmod.as"

// 「btnimg」命令を使用する為
#include "misc.as"
    //ボタンに貼り付ける画像を、buffer 2 に用意する
    buffer  2 : picload "btntest.JPG"
    screen 0,200,100 : title "btnimg TEST"
    color : boxf 0 , 50 , 200 , 100
    objsize 50,50
    repeat 4
        pos cnt*50,0 : button "",*btnclick
        btnimg cnt , 2 , cnt*50 , 0 , 50 , 50
    loop
stop

// ボタンを押した時の処理
*btnclick
    sdim data,64
    //statにボタンIDが代入される
    objsel -1
    if stat=0 : data="丸が押されました"
    if stat=1 : data="三角が押されました"
    if stat=2 : data="四角が押されました"
    if stat=3 : data="星が押されました"
    color : boxf 0 , 50 , 200 , 100
    color 255 , 255 , 255 : pos 10 , 64 : mes ""+data
stop
実行結果



★文字検索ソフト作成記録
◆間違いの手直し
  1. 「*findlist」ルーチン内の if listdata!="" : objprm 4,listdata
    if listdata=!"" は必要ありません。

◆変更点
  1. ボタンに画像を貼り付ける。
  2. ウィンドウの初期化エリアの変更。
    現在ウィンドウのサイズ変更ができません。
    今後可能なようにする為の前準備です。
  3. テキストデータの選択の際、ウィンドウ内で情報表示
    することで判りやすくする。
  4. 現在、テキストファイルを開く際に一度ウィンドウを
    作り直しています。作り直さず、mesboxを使用しない
    場合はウィンドウの奥に隠します(邪道?)。



☆実行画面
起動画面

選ボタンから、HSPヘルプ(width)をクリックした時の画面
※取得したテキストを表示しています。




☆ソースコード
青の部分は追加したコード、赤の部分は変更したコードです。
ソフト名未定
HSP Ver2.61
内容任意のテキストを検索
btnimg.JPG
(60×20)
ソース
/////////////////////////////////////////////////////////
// インクルード
    #include "llmod.as"
    //「btnimg」使用の為
    #include "misc.as"

/////////////////////////////////////////////////////////
// ボタンイメージ読込
    buffer 2 : picload "btnimg.JPG"

/////////////////////////////////////////////////////////
// メインウィンドウの作成
    //dispx:ディスプレイ横幅(システム変数)
    //dispy:ディスプレイ縦幅(システム変数)
    screen 0,dispx,dispy
    width 160,340
    title "テスト"
    objsize 20,20
    pos 0,0 : button "開",*fileopen  //ID:0
    btnimg 0,2,0,0,20,20
    pos 20,0 : button "選",*textselect  //ID:1
    btnimg 1,2,20,0,20,20
    sdim ftext,64 : pos 40,0 : input ftext,100,20,64 //ID:2
    pos 140,0 : button "調",*find  //ID:3
    btnimg 3,2,40,0,20,20
    //dim listno
    listno=-1 : listno2=-1
    sdim listdata,1024
    objsize 160,320
    pos 0,20 : listbox listno,0,listdata  //ID:4
    sdim str1,1024
    sdim str2,1024
    sdim editdata,65536
    sdim editdata2,65536
    //mesbox を作成するが見えないようにする
    pos -10,-10 : mesbox editdata,0,0,5,65536
    //mesboxの状態変数
    mbflag=0

/////////////////////////////////////////////////////////
// メインループ
*main
    // リストボックス処理
    if listno2!=listno{
        notesel listdata : noteget str1,listno
        getstr str1,str1,1,']':int str1 : str1--
        notesel editdata : noteget str2,str1
        instr tmp.0,str2,ftext,0
        strlen tmp.1,ftext
        prm=hedit,0xBB,str1,0
        dllproc "SendMessageA",prm,4,D_USER
        tmp.0+=dllret : tmp.1+=tmp.0
        prm=hedit,0xB1,tmp.0,tmp.1
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xB7,0,0
        dllproc "SendMessageA",prm,4,D_USER
        prm=hedit,0xCE,0,0
        dllproc "SendMessageA",prm,4,D_USER
        str1=(str1-dllret)/2
        prm=hedit,0xB6,0,str1
        dllproc "SendMessageA",prm,4,D_USER

        str str1
        listno2=listno
    }
        wait 10
goto *main

/////////////////////////////////////////////////////////
// 「開」のボタンを押した時
*fileopen
    //ファイルを開くダイアログの表示
    dialog "*",16,""
    if stat=1{
        exist refstr
        if strsize < 0:goto *main
        if strsize > 65536:goto *main
        /*
        screen 0,460,340
        title "テスト ["+refstr+"]"
        objsize 20,20
        pos 0,0 : button "開",*fileopen  //0
        pos 20,0 : button "選",*textselect  //1
        sdim ftext,64 : pos 40,0 : input ftext,100,20,64  //2
        pos 140,0 : button "調",*find  //3
        dim listno
        sdim listdata,1024
        objsize 160,320
        pos 0,20 : listbox listno,100,listdata  //4
        pos 160,0
        //sdim editdata,65536
        mesbox editdata,300,340,5,65536  //5
        */
        _hspobjhandle 5:hedit=stat
        //mesboxを移動
        if mbflag=0{
            width winx+200
            prm=hedit,160,0,200,winy,1
            dllproc "MoveWindow",prm,6,D_USER
            mbflag=1
        }
        notesel editdata
        noteload refstr
        objprm 5,editdata
    }
    gosub *findlist
goto *main

/////////////////////////////////////////////////////////
// 「選」のボタンを押した時
*textselect
    //dialog "OKを押した後、テキストをクリックして下さい",0,"確認"
    
    //screen 0 を隠す
    gsel 0,-1
    //screen 3 にマウス下の情報を表示
    screen 3,400,225 : title "テキストを左クリックして下さい"
    gsel 3,2
    //cls:ウィンドウのオブジェクトを消去して色を塗りつぶす
    cls 1
    //現在選択しているテキストを取得
    if hedit!=0{
        prm=hedit,0x000D,65536
        getptr prm.3,editdata2
        dllproc "SendMessageA",prm,4,D_USER
    }
    pos 2,3 : mes "取得テキスト:"
    pos 0,25 : mesbox editdata2,400,200
    objsize 60,25
    pos 260,0 : button "決定",*wnd3ok
    pos 330,0 : button "取消",*wnd3cancel

    //bmscrにウィンドウ情報が入ります
    mref bmscr,67

    //repeat ※breakで抜けれない為
    *wnd3loop
        stick st,0,0
        //フォアグラウンドウィンドウハンドル取得
        //screen 3がアクティブの時は何もしない
        prm=0 : dllproc "GetForegroundWindow",prm,0,D_USER
        if st=256 &(bmscr.13!=dllret){
            ginfo 0
            prm=prmx,prmy
            dllproc "WindowFromPoint",prm,2,D_USER
            hedit=dllret
            if dllret!=0{
                //sdim editdata,65536
                prm=hedit,0x000D,65536
                getptr prm.3,editdata2
                dllproc "SendMessageA",prm,4,D_USER
                objprm 0,editdata2
                //gosub *findlist
                //break
            }
        }
        wait 10
    goto *wnd3loop
    //loop
//goto *main

*wnd3ok
    //mbflagが1の時はmesboxを隠す
    if mbflag=1{
        gsel 0
        width winx-200
        _hspobjhandle 5
        prm=stat,-10,-10,0,0,1
        dllproc "MoveWindow",prm,6,D_USER
        mbflag=0
    }
    editdata=editdata2
    gosub *findlist

*wnd3cancel
    gsel 3,-1
    gsel 0,1
goto *main

// 「調」ボタンを押した時
*find
    gosub *findlist
goto *main

//テキスト検索+リストアップ
*findlist
    notesel editdata : notemax tmp
    listdata=""
    repeat tmp
        notesel editdata : noteget str1,cnt
        instr tmp,str1,ftext,0
        if tmp!=-1{
            getstr str1,str1,tmp,''
            tmp=cnt+1
            notesel listdata : noteadd "["+tmp+"] "+str1,-1
        }
    loop
    /* if listdata!="" : */objprm 4,listdata
return




このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
コメント ( 0 ) | Trackback ( 0 )
« 前ページ 次ページ »