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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0510
可憐windowsの拡大鏡ツールのような物9解決


可憐

リンク

2015/5/10(Sun) 01:31:10|NO.69121

先日質問したばかりですが、また新しいことで分からなくなってしまい
試行錯誤したのですが答えが見つからなかったので書き込みさせて頂きました

windowsの拡大鏡ツールのような物を現在作成しておりまして

screen 0の一部を拾ってscreen 1に反映させているのですが
screen 0に四角のような囲まれた範囲をコピーしてます。。的な表示をしたいのですが
どうもうまくいきません。。
誰かいいアイデア、知恵を分けてください。
よろしくお願いします


#module #deffunc boxfa int ax, int ay, int bx, int by pdx = ax, bx, bx, ax pdy = ay, ay, by, by gsquare -1,pdx, pdy return #global screen 0,680,480 randomize repeat 300 pos rnd(640),rnd(480) color rnd(255),rnd(255),rnd(255) mes "●" loop screen 1,200,200,,1000,0 repeat x=mousex y=mousey ;color 50,50,50 ;gmode 3,,,20 ;boxfa mousex,mousey,mousex+150,mousey+150 gsel 1,0 gzoom 200,200,0,x-75,y-75,150,150 gsel 0,1 wait 10 loop



この記事に返信する


スペース(HSP歴3年)

リンク

2015/5/10(Sun) 02:18:16|NO.69123

こういう事でしょうか??

Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。 //このソースコードではわかりやすいようにScreenで作成しています。 randomize repeat 300 pos rnd(640),rnd(480) color rnd(255),rnd(255),rnd(255) mes "●" loop screen 0,680,480 screen 1,200,200,,1000,0 repeat gsel 0,1 x=mousex y=mousey redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。 pos 0,0:gcopy 2,0,0,680,480 color 50,50,50:boxf x,y,x+150,y+150 pos x+1,y+1:gcopy 2,x+1,y+1,149,149 redraw 1 gsel 1 gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。 await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。 loop



スペース(HSP歴3年)

リンク

2015/5/10(Sun) 02:21:25|NO.69124

gzoomのコピー元の座標を見落としてました。
正しくはこっちですね。

Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。 //このソースコードではわかりやすいようにScreenで作成しています。 randomize repeat 300 pos rnd(640),rnd(480) color rnd(255),rnd(255),rnd(255) mes "●" loop screen 0,680,480 screen 1,200,200,,1000,0 repeat gsel 0,1 x=mousex y=mousey redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。 pos 0,0:gcopy 2,0,0,680,480 color 50,50,50:boxf x-75,y-75,x+75,y+75 pos x-74,y-74:gcopy 2,x-74,y-74,149,149 redraw 1 gsel 1 gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。 await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。 loop



名無し

リンク

2015/5/10(Sun) 03:45:25|NO.69125

>NO.69124
はわわ、このコードだと、四角の選択枠が画面から一部出た際に
コピー先の絵が多少おかしくなる(領域外が反映されない)のです……
それと、マウス画面外に出た時全く動かないのは個人的にちょっと操作しにくいのです
ということで適当に修正してみました


// 各種定数 ;画面ID #enum kMainID = 0 ;メイン画面 #enum kSubID ;サブ画面(ルーペ) #enum kBufID ;メイン画面用のバッファ ;オブジェクトのサイズ #const kWinX 640 #const kWinY 480 #const kLoupeSize 200 #const kLoupeSize2 kLoupeSize / 2 // メインルーチン randomize ;表示用画像を作成 buffer kBufID, kWinX, kWinY repeat 300 pos rnd(kWinX), rnd(kWinY) color rnd(255), rnd(255), rnd(255) mes "●" loop ;メイン画面およびサブ画面を表示 screen kMainID, kWinX, kWinY screen kSubID, kLoupeSize, kLoupeSize, 4 title "サブ画面" ;メインループ color 50, 50, 50 ;ルーペ枠の色 repeat ;表示座標をマウス位置から決定 ;(mousex, mouseyはマウスが画面外に出ると機能しなくなるので……) gsel kMainID mx = limit(ginfo_mx - ginfo_wx1, kLoupeSize2, kWinX - kLoupeSize2) my = limit(ginfo_my - ginfo_wy1, kLoupeSize2, kWinY - kLoupeSize2) title "メイン画面(マウス:" + mx + ", " + my + ")" ;表示座標に従い、各種オブジェクトを再描画する gsel kMainID redraw 0 ;背景 pos 0, 0 gcopy kBufID, 0, 0, kWinX, kWinY ;ルーペ枠 line mx - kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my - kLoupeSize2 line mx + kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my + kLoupeSize2 line mx + kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my + kLoupeSize2 line mx - kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my - kLoupeSize2 redraw 1 gsel kSubID redraw 0 pos 0, 0 gcopy kBufID, mx - kLoupeSize2, my - kLoupeSize2, kLoupeSize, kLoupeSize redraw 1 await 1000 / 30 ;とりあえず、約30fpsとした loop



名無し

リンク

2015/5/10(Sun) 03:58:45|NO.69126

ついでに拡大機能も付けてみたのです(左クリックで拡大、右クリックで縮小)

// 各種定数 ;画面ID #enum kMainID = 0 ;メイン画面 #enum kSubID ;サブ画面(ルーペ) #enum kBufID ;メイン画面用のバッファ ;オブジェクトのサイズ #const kWinX 640 #const kWinY 480 #const kLoupeSize 200 #const kLoupeSize2 kLoupeSize / 2 ;その他 #const kZoomPerStep 10 ;この%だけズーム率が変化する // メインルーチン randomize ;表示用画像を作成 buffer kBufID, kWinX, kWinY repeat 300 pos rnd(kWinX), rnd(kWinY) color rnd(255), rnd(255), rnd(255) mes "●" loop ;メイン画面およびサブ画面を表示 screen kMainID, kWinX, kWinY screen kSubID, kLoupeSize, kLoupeSize, 4 title "サブ画面" ;メインループ color 50, 50, 50 ;ルーペ枠の色 zoom_per = 100 ;ズーム率(500%まで対応) repeat ;表示座標をマウス位置から決定 ;(mousex, mouseyはマウスが画面外に出ると機能しなくなるので……) gsel kMainID mx = limit(ginfo_mx - ginfo_wx1, kLoupeSize2, kWinX - kLoupeSize2) my = limit(ginfo_my - ginfo_wy1, kLoupeSize2, kWinY - kLoupeSize2) title "メイン画面(マウス:" + mx + ", " + my + " ズーム率:" + zoom_per + "%)" ;ズーム率をマウスクリックで変化させる stick ky, 256 + 512 if(ky & 256) :zoom_per = limit(zoom_per + kZoomPerStep, 100, 500) if(ky & 512) :zoom_per = limit(zoom_per - kZoomPerStep, 100, 500) ;表示座標に従い、各種オブジェクトを再描画する gsel kMainID redraw 0 ;背景 pos 0, 0 gcopy kBufID, 0, 0, kWinX, kWinY ;ルーペ枠 line mx - kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my - kLoupeSize2 line mx + kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my + kLoupeSize2 line mx + kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my + kLoupeSize2 line mx - kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my - kLoupeSize2 redraw 1 gsel kSubID redraw 0 pos 0, 0 kLoupeSize3 = 100.0 * kLoupeSize2 / zoom_per gzoom kLoupeSize, kLoupeSize, kBufID, mx - kLoupeSize3, my - kLoupeSize3, kLoupeSize3 * 2, kLoupeSize3 * 2, 1 redraw 1 await 1000 / 30 ;とりあえず、約30fpsとした loop



可憐

リンク

2015/5/10(Sun) 22:11:26|NO.69138

スペース(HSP歴3年) 様
名無し様

ありがとうございます。
画面描画処理だったりscreen処理だったりと、自分の苦手分野なので
先輩方のコードを見て勉強します。
ありがとうございました(^^)ノ
また何かあると思うのでよろしくお願いしますm(_ _)m



可憐

リンク

2015/5/11(Mon) 00:21:00|NO.69140

解決した後にすみません。
gcopyで画面をコピーすると
マウスのカーソルは反映されません。
これをどうにか導入したいのですが
何か方法はないでしょうか?



名無し

リンク

2015/5/11(Mon) 00:44:29|NO.69142

>NO.69140
カーソルのアイコン画像をDLLから抽出して……は可能だけど、
そんなことするぐらいなら自前でカーソル画像をでっち上げて
マウスがある座標に表示させる処理組んだ方が手っ取り早いかと



Moz

リンク

2015/5/11(Mon) 19:52:16|NO.69144

マウスカーソル表示はこんな感じです。

#include "user32.as"	//マウスカーソルの表示に使います。
Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。 //このソースコードではわかりやすいようにScreenで作成しています。 randomize repeat 300 pos rnd(640),rnd(480) color rnd(255),rnd(255),rnd(255) mes "●" loop screen 0,680,480 screen 1,200,200,,0,0 repeat gsel 0,1 x=mousex y=mousey redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。 pos 0,0:gcopy 2,0,0,680,480 color 50,50,50:boxf x-75,y-75,x+75,y+75 pos x-74,y-74:gcopy 2,x-74,y-74,149,149 redraw 1 gsel 1 redraw 0 gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。 gosub *mouse_draw ;マウスカーソル表示 redraw 1 await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。 loop *mouse_draw // マウスアイコンハンドルを取得 dim CURSORINFO,5 CURSORINFO.0=20 GetCursorInfo varptr(CURSORINFO) // ホットスポットを取得 dim ICONINFO,5 GetIconInfo CURSORINFO.2,varptr(ICONINFO) // アイコンを描画 DrawIconEx hdc,(ginfo_sx/2)-ICONINFO.1,(ginfo_sy/2)-ICONINFO.2,CURSORINFO.2,0,0,0,0,0x0003 ;とりあえず画面中央に描画してみる return



可憐

リンク

2015/5/12(Tue) 02:27:08|NO.69154

Moz 様
座標あれこれで難しいですがなんとかやってみます

ありがとうございます



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