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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1025
pwdhangWindows10 64bitになったら動きがおかしくなりました。5解決


pwdhang

リンク

2019/10/25(Fri) 17:17:29|NO.88691

2×3の欄があり、写真をdrag & dropでその欄に落として、印刷するというソフトです。
Windows7 32bitでは、問題なかったのですが、うまくdrag & dropできなくなりました。
HSP3.51に変更してinclude "hsp3_64.as”つけたし、コンパイルしなおしたのですがダメでした。
ここがおかしいというのはないでしょうか?


#module
;▼必要となるAPIや定数の定義
#include "hsp3_64.as"
#uselib "comdlg32.DLL"
#cfunc PrintDlg "PrintDlgA" var

#uselib "gdi32.dll"
#func SetMapMode "SetMapMode" int,int
#func SetWindowOrgEx "SetWindowOrgEx" int,int,int,nullptr
#func SetViewportOrgEx "SetViewportOrgEx" int,int,int,nullptr
#func SetWindowExtEx "SetWindowExtEx" int,int,int,nullptr
#func SetViewportExtEx "SetViewportExtEx" int,int,int,nullptr
#func ScaleViewportExtEx "ScaleViewportExtEx" int,int,int,int,int,nullptr
#cfunc StartDoc "StartDocA" int,var
#func StartPage "StartPage" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#func EndPage "EndPage" int
#func EndDoc "EndDoc" int
#cfunc GetDeviceCaps "GetDeviceCaps" int,int
#func DeleteDC "DeleteDC" int

#deffunc ghardcopy int prm1
;
; nMode =1 : 用紙に合わせて拡大・縮小して印刷
; nMode =0 : そのまま印刷
;
mref bmscr,67

#define dispSizeX bmscr(1)
#define dispSizeY bmscr(2)
#define HORZRES 8
#define VERTRES 10
#define LOGPIXELSX 88
#define LOGPIXELSY 90
#define PD_RETURNDC $00000100

nMode = prm1 : if (nMode<=0)|(nMode>1) : nMode=0

dim pd,20 ;PRINTDLG構造体

pd(0) = 66 ;lStructSize
pd(1) = hwnd ;hwndOwner
pd(2) = 0 ;hDevMode
pd(3) = 0 ;hDevNames
pd(5) = PD_RETURNDC ;Flags

ret=PrintDlg(pd)
PDhdc = pd(4) ;PrinterHDC
if ret!0 {
pdevcaps=HORZRES,VERTRES,LOGPIXELSX,LOGPIXELSY
repeat 4 : prnInfo(cnt)=GetDeviceCaps(PDhdc,pdevcaps(cnt)) : loop
prnInfo(4)=GetDeviceCaps(hdc,pdevcaps(2))
prnInfo(5)=GetDeviceCaps(hdc,pdevcaps(3))
}else{
return -1
}
SetMapMode PDhdc ,7 : SetWindowOrgEx PDhdc, 0,0
SetViewportOrgEx PDhdc, 0,0
SetWindowExtEx PDhdc, dispSizeX,dispSizeY
if nMode=0 {
SetViewportExtEx PDhdc, dispSizeX,dispSizeY
ScaleViewportExtEx PDhdc, prnInfo(2), prnInfo(4), prnInfo(3), prnInfo(5)
} else {
SetViewportExtEx PDhdc, prnInfo(0),prnInfo(1)
}
;DOCINFO構造体
dim dci,5 : pDOCNAME = "HSPDocument": dci= 20,varptr(pDOCNAME)
ret=StartDoc(PDhdc,dci)
if ret<0 { DeleteDC PDhdc : return -1 }
StartPage PDhdc
BitBlt PDhdc ,0,0,dispSizeX,dispSizeY, hdc, 0,0, $CC0020
EndPage PDhdc : EndDoc PDhdc : DeleteDC PDhdc
return
#global

;***** sample *****
#uselib "shell32.dll"
#func DragAcceptFiles "DragAcceptFiles" int,int
#func DragQueryFile "DragQueryFileA" int,int,int,int
#func DragQueryPoint "DragQueryPoint" int,int
#func DragFinish "DragFinish" int
#define WM_DROPFILES 0x0233
sdim jpgfile,6

buffer 2,800,1200,0
screen 0,500,600,0,10,10
;
dim py,4:dim px,3:dim py2,4:dim px2,3
py(0)=10:py(1)=190:py(2)=370:py(3)=550:px(0)=10:px(1)=250:px(2)=490
py2(0)=100:py2(1)=394:py2(2)=688:py2(3)=982:px2(0)=100:px2(1)=412:px2(2)=724

pos px(0),py(0):line px(0),py(3):line px(2),py(3):line px(2),py(0):line px(0),py(0)
pos px(0),py(1):line px(2),py(1)
pos px(0),py(2):line px(2),py(2)
pos px(1),py(0):line px(1),py(3)
pos 400,560:button "印刷",*PRT

;
oncmd gosub *OnDropFiles, WM_DROPFILES // WM_DROPFILES メッセージハンドラを設定
DragAcceptFiles hwnd, 1 // ファイルをドラッグ&ドロップできるように設定
stop

*OnDropFiles
; --- ファイルがドロップされたとき ---
; ドロップされたファイルの数を取得する
hdrop = wParam ; ドロップファイル情報のハンドル
DragQueryFile hdrop, -1, 0, 0
ndrop = stat ; ファイルの数
if ndrop > 1 :return
if ndrop =0 :return
;
xmse=mousex : ymse=mousey

if xmse > px(2) or xmse < px(0) {return}
if ymse < py(0) {return}
if ymse > py(3) {return}

nx=0:ny=0
if xmse > px(1) {nx=1}
if ymse > py(1) {ny=1}
if ymse > py(2) {ny=2}

; 画面をクリア
syscolor 5 : boxf px(nx)+1,py(ny)+1,px(nx+1)-1,py(ny+1)-1
syscolor 8 : pos px(nx)+3,py(ny)+3

; ファイル名を取得して表示
sdim filename, 260
DragQueryFile hdrop, cnt, varptr(filename), 260
;nxy=2*ny+nx
;jpgfile(nxy)=filename
buffer 1,640,680
picload filename
X_size=ginfo(12)
Y_size=ginfo(13)
gsel 0
gzoom 234,174,1,1,1,X_size,Y_size
; ++++++++ここからbuffer1に描画++++++++++++
gsel 2
syscolor 5 : boxf px2(nx)+1,py2(ny)+1,px2(nx+1)-1,py2(ny+1)-1
syscolor 8 : pos px2(nx)+3,py2(ny)+3
;gsel 1
;picload filename
;X_size=ginfo(12):Y_size=ginfo(13)
;gzoom 308,243,1,50,90,411,324,1;CT
gzoom 300,224,1,1,1,X_size,Y_size,1; ..内視鏡
;gzoom 300,285,1,10,50,X_size,900,1;..胸部Xp
;gzoom 285,285,1,28,28,456,456,1;MRI

gsel 0
; ドロップファイル情報をクリア (これをしないとメモリリークになる)
DragFinish hdrop
return
;
*PRT
objprm 0, "実行中"
gsel 2
ghardcopy 0
end



この記事に返信する


ゆうやん

リンク

2019/10/25(Fri) 18:06:27|NO.88692

実行していないのでわかりませんが、
HSPの64bit版の文字のエンコードがShift-JISからUTF-8に変更されているので、動作がおかしくなっているんだと思います。
DragQueryFileAをDragQueryFileWに変えてみてはどうですか?



pwdhang

リンク

2019/10/26(Sat) 09:07:23|NO.88697

お返事ありがとうございました。

DragQueryFileAをDragQueryFileWに替えても改善はありませんでした。が、DragQueryFileAが
Key pointという印象をもったので、DragQueryFileAで検索したらポインターの位置をとらえ
るがおかしくなるというここでの過去の質問を見つけました。どうも私の場合もこれのような
気がします。貴重なご助言、ありがとうございました。



暇人

リンク

2019/10/27(Sun) 00:19:38|NO.88708

hsp3_64無しなら
表示位置はずれてるけどドロップファイル表示はできる
>xmse=mousex : ymse=mousey
これを

xmse=ginfo_mx-ginfo_wx1-2 : ymse=ginfo_my-ginfo_wy1-20
に置き換えれば問題なくなった
ラッグ中はmousex、mouseyの取得は出来ないけど
ドロップした時も現在のマウス位置じゃなくて
ウィンドウ外に出る前の座標が取得されてた
win10以外ならドロップした時の座標は現在位置だったんだろう
(動作が異なるのは問題あるような・・・)


後hsp3_64を使うと下の問題が出てドロップファイル0になって
ファイル読み込みまで進まない感じ
https://github.com/vim/vim/pull/2504
機械和訳
>WM_DROPFILES によって渡される hDrop ハンドルは、これらの条件で壊れます。
> D&D が 32 ビット アプリケーションから D&D を取得すると、
>ハンドルは 32 ビットに切り捨てられ、64 ビットまで拡張された符号が付くように見えます。



MillkeyStars

リンク

2019/10/27(Sun) 12:35:35|NO.88713

#include "hsp3_64.as" で 64Bit 版を作成しても、HSPが標準で扱える変数の型は、32Bit のままなので注意です。
現在の hsp3_64 はベータ版としての最低限の機能しか作成されていません。変数の型のサイズも基本的に 32Bit 版HSPと同じです。

なので、暇人さんの指摘な通りに、32Bit値を超える部分については破棄されますので、64Bit値を扱っている HDROP が誤動作を引き起こします。

直に 32Bit 版HSPのままスクリプトを作成してください。現時点では 64Bit版で実行するメリットがありません(というかメリットがあるのかわかりません)。



pwdhang

リンク

2019/10/28(Mon) 07:53:14|NO.88723

暇人さん、お返事ありがとうございました。バッチリ、作動します。
一週間悩んでいたのが嘘のようです。実はJavascriptやPythonで同じような
のができないかも挑戦したのですが、HSP3に比べ(私には)鬼のように難しかったです。
暇人さんに感謝するとともに、HSP作者のおにたまさんにも本当に感謝しています。

MillkeyStarsさん、ご助言ありがとうございました。
Windwosが64bit版に変わったので、そこが原因かと思い、なんとなくしてみました。
ありがとうございました。



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