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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1016
kanahironウィンドウのサイズ変更を一定の比に保とうとするとビクビクする2解決


kanahiron

リンク

2014/10/16(Thu) 01:17:49|NO.65574

タイトルがなんか怪しいですが…
screen 1以降のウィンドウはサイズを変更させることができますが、そのサイズ変更を一定の比に保とうとして適当に書いてみたら一応出来てはいるのですがビクビクします

#define WM_SIZE 0x0005 screen 0,200,100 screen 1,1000,600 hwnd1 = hwnd oncmd gosub *windowsize, WM_SIZE hi = 0.6 hi2 = 1.0 / hi repeat redraw 0 color 255,255,255 boxf color line 0,0,1000,600 title strf("%4d,%4d %4d,%4d %4d,%4d",mousex,mousey,int(hi2*mousey),int(hi*mousex),x,y) if mousex >= int(hi2*mousey){ x = int(hi2*mousey) y = mousey } else { ;if mousey >= int(hi*mousex): x = mousex y = int(hi*mousex) } line mousex,-1,mousex,601 line -1,mousey,1001,mousey pos mousex,mousey mes strf(" %4d,%4d",mousex,mousey) color 0,200,0 line x,-1,x,601 line -1,y,1001,y pos x,y mes strf(" %4d,%4d",x,y) redraw 1 await 16 loop stop *windowsize oncmd 0 if wparam = 0{ scrsizex = lparam & 0x0000FFFF scrsizey = (lparam & 0xFFFF0000) >> 16 if scrsizex >= int(hi2*scrsizey){ x = int(hi2*scrsizey) y = scrsizey } else { ;if scrsizey > int(hi*scrsizex) x = scrsizex y = int(hi*scrsizex) } x = limit(x,200,1000) y = limit(y,120,600) title strf("%4d,%4d",x,y) width x,y ;await 16 } oncmd 1 return
が書いてみたものです
実数型を整数に直すときの切り捨てが原因だと思って適当に+1してみたりしたのですが結局変わらず
await 16がコメントアウトになっていますがそれをとってもほんの少しましになるだけです
解決方法や別の方法があったら教えて下さい



この記事に返信する


zero

リンク

2014/10/16(Thu) 08:29:13|NO.65575

1つの解法としてはWM_SIZEではなくWM_SIZINGを使う方法があります。
WM_SIZINGだとRECT構造体が与えられ、これに上書きすることで
ウィンドウサイズを変更することができます。
以下は一例

// 四捨五入 #define ctype round(%1) int(strf("%%0.0f", %1)) #define WM_SIZING 0x0214 // 初期ウィンドウサイズ (この比を保つ) cx = 640 : cy = 480 // AspectRAtio:= 横の長さに対する縦の長さの比 (実数) AspectRatio = 1.0 * cy / cx gsel 0, -1 screen 1, ginfo_dispx, ginfo_dispy, , , , cx, cy // 縁の幅 framesx = ginfo_sizex - ginfo_winx framesy = ginfo_sizey - ginfo_winy oncmd gosub *onMessage, WM_SIZING stop *onMessage // lparam には RECT 構造体が送られる dupptr left, lparam, 4 dupptr top, lparam+4, 4 dupptr right, lparam+8, 4 dupptr bottom, lparam+12, 4 // マウスカーソルの位置とwParamの関係: // 4 3 5 // ┌─-─┐ // 1│ │2 // └─-─┘ // 7 6 8 switch wparam case 1 case 2 case 7 case 8 // LEFT, RIGHT, BOTTOMLEFT, BOTTOMRIGHT bottom = top + round(AspectRatio * (right - left - framesx)) + framesy swbreak case 3 case 5 case 6 // TOP, TOPRIGHT, BOTTOM right = left + round(1.0/AspectRatio * (bottom - top - framesy)) + framesx swbreak case 4 // TOPLEFT left = right - round(1.0/AspectRatio * (bottom - top - framesy)) - framesx swbreak swend title "クライアントのアス比=" + (1.0 * ginfo_winy / ginfo_winx) return 1



kanahiron

リンク

2014/10/16(Thu) 16:02:51|NO.65579

zeroさんありがとうざいます
WM_SIZINGなんてあったのですね
試したところ怪しい動作もなく完璧です
ありがとうございました



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