全然更新しないブログ
HSPメモ帳
ファイルの暗号化
◆一覧リスト: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
ウィンドウ付属のメモ帳等は、
文字を選択した状態で非アクティブになっても
選択した部分が見えます。
しかし、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
#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プログラミングメモ
このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
◆HSPプログラミングメモ
- ●「onclick」
- onclick *label
マウスのクリックが押された時に、
*labelで指定したラベルに処理を移します。
※ただし、mesbox等オブジェクトの上でクリックしても
無効になります。クライアント領域のみです。
命令が実行されると、システム変数「iparam」「wparam」「lparam」
に数値が入ります。ヘルプにはなかったので調べてみました。
システム変数の数値 - iparam wparam lparam 左クリック 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」を使用してクリックした時に処理をします。
- 「onclick」命令を追加
- 押された瞬間のx,y座標を変数に代入
- マウスボタンが離されるまで
ループして現在のマウス位置と押された前回の差を
「listbox」「mesbox」に反映させる。
- ☆実行画面
- ☆ソースコード
- 青の部分は追加したコード、赤の部分は変更したコードです。
ソフト名 未定 HSP Ver 2.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プログラミングメモ
※HSPはウィンドウの移動、サイズ変更中は処理が
止まってしまうので移動中のオブジェクトの変更などはできません。
このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
◆HSPプログラミングメモ
- ●screen 0 のウィンドウサイズ変更可能にする その1
- #include "llmod.as"
「dllproc」命令を使用する為、「llmod.as」をインクルードする。
- screen 0,dispx,dispy,0,10,20
width 300,400
上記のように、ウィンドウを作成する。
dispx,dispyはシステム変数でディスプレイの横、縦サイズです。
それぞれがウィンドウの最大サイズとなります。
10,20は、ウィンドウの横、縦位置です。
300,400は、ウィンドウの横、縦幅です。
- 「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
- #include "llmod.as"
※HSPはウィンドウの移動、サイズ変更中は処理が
止まってしまうので移動中のオブジェクトの変更などはできません。
- ●screen 0 のウィンドウサイズ変更可能にする その2
- その1と同様にウィンドウを作成する。
- 「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 Ver 2.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プログラミングメモ
このページはHSP勉強中のメモです
不具合が起こらない様に配慮はしていますが
各ソースの使用は各自の責任においてご利用お願いします
◆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
実行結果
- ★文字検索ソフト作成記録
- ◆間違いの手直し
- 「*findlist」ルーチン内の if listdata!="" : objprm 4,listdata
if listdata=!"" は必要ありません。
◆変更点
- ボタンに画像を貼り付ける。
- ウィンドウの初期化エリアの変更。
現在ウィンドウのサイズ変更ができません。
今後可能なようにする為の前準備です。
- テキストデータの選択の際、ウィンドウ内で情報表示
することで判りやすくする。
- 現在、テキストファイルを開く際に一度ウィンドウを
作り直しています。作り直さず、mesboxを使用しない
場合はウィンドウの奥に隠します(邪道?)。
- 「*findlist」ルーチン内の if listdata!="" : objprm 4,listdata
- ☆実行画面
- 起動画面
選ボタンから、HSPヘルプ(width)をクリックした時の画面
※取得したテキストを表示しています。
- ☆ソースコード
- 青の部分は追加したコード、赤の部分は変更したコードです。
ソフト名 未定 HSP Ver 2.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 )
« 前ページ | 次ページ » |