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

ウィンドウサイズの変更(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 )
« ボタンに画像... 「onclick」命... »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。