|
|
2016/1/4(Mon) 13:14:32|NO.73978
#module
/*━━━━━━━━━━
初期処理
──────────*/
#uselib "user32.dll"
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#define WM_MINMAXINFO 0x24
/*━━━━━━━━━━
割り当て
──────────
MaxX = 最大画面サイズX
MaxY = 最大画面サイズY
MinX = 最小画面サイズX
MinY = 最小画面サイズY
──────────*/
#deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat|0x00040000
oncmd gosub *ScrGndSiz_CMD, WM_MINMAXINFO ;コマンド設定
return
/*━━━━━━━━━━
メッセージ
──────────*/
*ScrGndSiz_CMD
dim info, 10 :dupptr info, lparam, 40, 4
info.6=MinX , MinY , MaxX , MaxY
return
#global
/*------------------------------------- 以下サンプル -------------------------------------*/
MinX = 300
MinY = 300
MaxX = ginfo_dispx
MaxY = ginfo_dispy
screen 0,MaxX,MaxY,0,-1,-1,640,480
ScrGndSiz_Set MaxX,MaxY,MinX,MinY
stop
画面可変の上限設定をするモジュールを作ってみたのですが、
画面を可変させるとランタイムエラーになってしまいます。
HSPバージョンは3.5bata
OSはwindos10-64bitです。
どなたか対策法になりそうなアドバイスを頂けないでしょうか?
|
|
2016/1/4(Mon) 15:02:27|NO.73980
kanamaruさんありがとうございます。
return 0 を指定してみたのですが、結果はランタイムエラーのままでした。
|
|
2016/1/4(Mon) 15:06:01|NO.73981
私も色々とやってみた結果、
#module
/*━━━━━━━━━━
初期処理
──────────*/
#uselib "user32.dll"
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#define WM_MINMAXINFO 0x24
/*━━━━━━━━━━
割り当て
──────────
MaxX = 最大画面サイズX
MaxY = 最大画面サイズY
MinX = 最小画面サイズX
MinY = 最小画面サイズY
──────────*/
#deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat|0x00040000
;oncmd gosub *ScrGndSiz_CMD, WM_MINMAXINFO ;コマンド設定
return 1
/*━━━━━━━━━━
メッセージ
──────────*/
*ScrGndSiz_CMD
dim info, 10 :dupptr info, lparam, 40, 4
info.6=MinX , MinY , MaxX , MaxY
return
#global
/*------------------------------------- 以下サンプル -------------------------------------*/
MinX = 300
MinY = 300
MaxX = ginfo_dispx
MaxY = ginfo_dispy
screen 0,MaxX,MaxY,0,-1,-1,640,480
ScrGndSiz_Set MaxX,MaxY,MinX,MinY
oncmd gosub *ScrGndSiz_CMD, 0x24 ;追加
stop
;追加
*ScrGndSiz_CMD
dim info, 10 :dupptr info, lparam, 40, 4
info.6=MinX , MinY , MaxX , MaxY
return
モジュール外で作動させると正常に動作しました。
しかし、今回ラベルの部分もモジュール内に埋め込みたいので、未解決のままといたします。

| |
|
2016/1/4(Mon) 15:19:26|NO.73982
ラベルを命令化させたらできました。
#module
#uselib "user32.dll"
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#define WM_MINMAXINFO 0x24
#deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat|0x00040000
MaxX2=MaxX : MaxY2=MaxY : MinX2=Minx : MinY2=MinY ;ScrGndSiz_CMD用に入れる(コピー?)
return 1
#deffunc ScrGndSiz_CMD
dim info, 10 :dupptr info, lparam, 40, 4
info.6=MinX2 , MinY2 , MaxX2 , MaxY2
return 0
#global
MinX = 300
MinY = 300
MaxX = ginfo_dispx
MaxY = ginfo_dispy
screen 0,MaxX,MaxY,0,-1,-1,640,480
ScrGndSiz_Set MaxX,MaxY,MinX,MinY
oncmd gosub *ScrGndSiz_CMD_RUN, 0x24 ;割り込み
stop
*ScrGndSiz_CMD_Run
ScrGndSiz_CMD;割り込みがあったからScrGndSiz_CMDを実行する
return
ScrGndSiz_CMDは命令化させて、コマンド割り込みがあったらScrGndSiz_CMDを実行させる
ような仕組みです。
|
|
2016/1/4(Mon) 15:21:15|NO.73983
でもこれだとラベルを追加する必要があるから目的には合わないかもしれません。
|
|
2016/1/4(Mon) 15:26:12|NO.73984
モジュール外で動作させれば動くという事は、原因は1つ。
oncmdのジャンプ先のラベルが命令の定義外にあると解釈されてしまった。
試しに、*ScrGndSiz_CMDの前のreturnをstopに変えて、
#globalの前にreturnを追加してみてください。
|
|
2016/1/4(Mon) 15:30:12|NO.73985
補足すると、モジュール内でoncmdを使うのはおすすめできません。
モジュール外で同じウィンドウメッセージに対してoncmd使われちゃったら、
モジュールが動作しなくなるので。
対策としては、oncmd2というのをネットで探してきて、それを使う。
まああまりこのウィンドウメッセージは使われない気もしますが。
|
|
2016/1/4(Mon) 17:48:26|NO.73989
最初のスクリプトの *ScrGndSiz_CMD ラベルにおいて
> info.6=MinX , MinY , MaxX , MaxY
とありますが、この MinX などは ScrGndSiz_Set 命令の引数です。
この命令が実行されていないときに (oncmd により) このラベルが呼ばれると、
存在しない MinX を使おうとして、まずいことになります。
解決策は、引数の値をモジュールの内側に保存しておくのがよいでしょうか。
https://www.diffchecker.com/nyfolhld
> kanamaru さん
> oncmdのジャンプ先のラベルが命令の定義外にあると解釈されてしまった。
命令の定義の範囲は、次の #deffunc 系命令または #global までです。
|
|
2016/1/4(Mon) 18:05:10|NO.73990
>>存在しない MinX を使おうとして、まずいことになります。
スプリクトを見返しましたが、確かにそうですね。
変数の事すっかり見落としていました。
まさか「ScrGndSiz_Set」の引数を指定したなんて・・。
kanamaruさん、くちくんさん、ue_daiさんありがとうございました!
|
|