HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0921
玄冬windowのリサイズ制限5解決


玄冬

リンク

2019/9/21(Sat) 14:29:03|NO.88466

初期化サイズよりも小さなサイズでリサイズに制限をかけたいです。

screen 1, 800, 800 width 400,400 mref BMSCR, 67 BMSCR(1) = 640, 480

上記のようにBMSCRを書き換えることで実装できましたが、
ginfo_sX, ginfo_sYの値自体が変わるのは本意ではありません。



X = 640 : Y = 480 screen 1, 800, 800 width 400,400 oncmd gosub *sub_LIMIT, $005 stop *sub_LIMIT v_temp = ginfo_winX, ginfo_winY, 0 if X < ginfo_winX { v_temp(0) = X : v_temp(2)++ } if Y < ginfo_winY { v_temp(1) = Y : v_temp(2)++ } if v_temp(2) { width v_temp(0), v_temp(1), -1, -1} return
そこで、上記のような記述を試みましたが、リサイズ制限実行時に
初期化サイズと制限サイズの間にちらつきのようなものが出ます。

ginfoの値が変わらず、ちらつきの出ないリサイズ制限についてお教え願えれば幸いです。
ご回答お願いいたします。



この記事に返信する


MIZUSHIKI

リンク

2019/9/21(Sat) 14:46:27|NO.88468

WM_GETMINMAXINFO = 0x0024
というメッセージを処理してあげるとウィンドウのリサイズ制限ができるみたいです。

以下の過去記事を参考にしてみてください。

『ウィンドウサイズの制限 (width=300 未満を許可しない)』
http://hsp.tv/play/pforum.php?mode=pastwch&num=26678



玄冬

リンク

2019/9/21(Sat) 19:00:01|NO.88475

>>MIZUSHIKIさん
ご回答ありがとうございます。
クライアントサイズではなくウィンドウサイズを要求されるのが一癖ありますが、
一応は解決できました。

…一つ解決すると、欲が出るもので

#include "user32.as" X = 640 : Y = 480 screen 1, ginfo_dispX, ginfo_dispY width 400,400 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, ( stat | $00090000 ) oncmd gosub *sub_LIMIT, $005 stop *sub_LIMIT if wparam ! 2 { v_temp = ginfo_winX, ginfo_winY, 0 if X < ginfo_winX { v_temp(0) = X : v_temp(2)++ } if Y < ginfo_winY { v_temp(1) = Y : v_temp(2)++ } if v_temp(2) { width v_temp(0), v_temp(1), -1, -1} } return
上記ちらつき版
最大化に干渉せずドラッグによるリサイズだけ制限する方法(ちらつきなく)はないでしょうか?



MIZUSHIKI

リンク

2019/9/22(Sun) 07:17:28|NO.88485

WM_SIZE(=$005) は「ウィンドウが変更された後」に呼び出されるメッセージみたいです。
なので、1回はみ出して表示された後、width でリサイズしているのでガクガクした感じになってしまうようですね。

WM_SIZING = 0x0214

WM_SIZINGはサイズ変更中に呼び出されるメッセージで、lparamから得られるRECT構造体(ウィンドウの位置・サイズ)を上書きすることでウィンドウサイズを変更することができるみたいです。

#include "user32.as" X = 640 : Y = 480 screen 1, ginfo_dispX, ginfo_dispY width 400,400 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, ( stat | $00090000 ) oncmd gosub *sub_LIMIT, 0x0214 ;WM_SIZING stop *sub_LIMIT // lparam には RECT 構造体が送られる dupptr left, lparam, 4 dupptr top, lparam+4, 4 dupptr right, lparam+8, 4 dupptr bottom, lparam+12, 4 // ウィンドウ情報 color 255,255,255 :boxf :pos 0,0 size_x = right-left size_y = bottom-top color 255 mes strf("( onX, onY) = (%d,%d)", size_x, size_y) color mes strf("(sizeX,sizeY) = (%d,%d)", ginfo_sizex,ginfo_sizeY) mes strf("( winX, winY) = (%d,%d)", ginfo_winx,ginfo_winY) v_temp = right-left, bottom-top, 0 if X < v_temp(0) { v_temp(0) = X : v_temp(2)++ } if Y < v_temp(1) { v_temp(1) = Y : v_temp(2)++ } if v_temp(2) { right = left + v_temp(0) bottom = top + v_temp(1) } return
注意点として、WM_SIZING はウィンドウサイズ変更前に呼び出されるので、
size_x(=right-left), size_y(=bottom-top) は変更予定のサイズ、
ginfo_sizex, ginfo_sizeY は現在のサイズ(変更予定の1つ前)
となっていますので注意してください。

【参考】
『WM_SIZE vs WM_SIZING』
 https://suzulang.com/wm_size-vs-wm_sizing/
『ウィンドウのサイズ変更を一定の比に保とうとするとビクビクする』
 http://hsp.tv/play/pforum.php?mode=pastwch&num=65574



MIZUSHIKI

リンク

2019/9/22(Sun) 07:41:58|NO.88486

あ゛ー! ウィンドウの左(or上)をつまんでリサイズされるときのことを考えてませんでした(;^_^A
ずりずり動いてく・・・

なんか、うまいこと処理考えてみてください(^▽^;)(丸投げ・・・



玄冬

リンク

2019/9/22(Sun) 22:26:53|NO.88492

>>MIZUSHIKIさん

回答ありがとうございました。
wparamが3進数で上下左右の進行方向を表していることに気づくのに時間がかかりましたが、
何とか解決しました。

#include "user32.as" L = 640, 480 screen 1, 3000, 3000, 0 title "" + ginfo_sel GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, ( stat | $00090000 ) oncmd gosub *sub_onSIZING, $214 oncmd gosub *sub_onSIZE , $005 width 400,400 stop *sub_onSIZING dupptr RECT, lparam, 16, 4 D = (wparam \ 3), (wparam / 3) W = ginfo_sizeX - ginfo_winX + L(0), ginfo_sizeY - ginfo_winY + L(1) repeat 2 if ( 0 < D(cnt) ) & ( W(cnt) < (RECT(cnt + 2) - RECT(cnt)) ) { if D(cnt) \ 2 { RECT(cnt ) = RECT(cnt + 2) - W(cnt) } else { RECT(cnt + 2) = RECT(cnt ) + W(cnt) } } loop return *sub_onSIZE cls mes ginfo_winX, 1 mes ":", 1 mes ginfo_winY return
今回のことで、wm_getminmaxinfo($024)だったりwm_size($005)だったりwm_sizing($214)だったりリサイズするだけでプロシージャに大量にメッセージが飛んでる上にそれぞれでポインタの型がrectだったりpointだったり,windowsって本当にややこしいなと思いました。



ONION software Copyright 1997-2021(c) All rights reserved.