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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1103
pumpkinD&Dのモジュールが上手く作動してない12解決


pumpkin

リンク

2015/11/3(Tue) 15:46:22|NO.72733

/*====================================================================
          Drag And Drop モジュール2号 HSP3.0β5? 1号作成 HSP3.22 2011.04.04 新規作成 ---------------------------------------------------------------------- 現在のウィンドウにDandDを受け入れる DandD_SetWindow flag flag = 0(受け入れ拒否) or 1(受け入れ許可) DandD割り込み実行指定(#defineで定義) DandD_SetSubLabel ジャンプ先ラベル(*xxx) ユーザーがDandDした時にサブルーチンジャンプを実行する(return必須) ラベル省略で割り込み無効 DandDを受け取った時の情報を取得する関数 DandD_GetInfo( flag ) flag = 0(ファイル数) or 1(X座標) or 2(Y座標) or 3(WinID) 複数回DandDした場合は最後の状態を取得する DandDで受け取ったファイルの一覧を取得する DandD_GetList 一覧を受け取る変数 メモリーノート形式で代入する 複数回DandDした場合は最後のDandDで受け取ったファイルの一覧 DandDで受け取ったファイルパスを取得する関数(メモリーノート+1) DandD_GetPath( Index ) Index = 0〜(一覧のインデックス) ====================================================================*/ #ifndef DragAndDropModuleIncluded #define DragAndDropModuleIncluded #module DragAndDropModule #uselib "shell32.dll" ; ★ドラッグ&ドロップをするAPI #func DragAcceptFiles "DragAcceptFiles" int, int #func DragQueryFile "DragQueryFileA" int, int, var, int #func DragQueryPoint "DragQueryPoint" int, var #func DragFinish "DragFinish" int #define WM_DROPFILES $0233 ; DragAndDrop #define global DandD_SetSubLabel(%1=0) DadmLabel@DragAndDropModule=%1 #deffunc DandD_SetWindow int f if f { oncmd gosub *DadmGetMessageL, WM_DROPFILES DragAcceptFiles hwnd, 1 ; On } else { DragAcceptFiles hwnd, 0 ; Off } return #deffunc DandD_GetList var s s = DadmList return #defcfunc DandD_GetPath int i notesel DadmList : noteget sb, i : noteunsel return sb #defcfunc DandD_GetInfo int f return DadmInfo(f) *DadmGetMessageL ; メッセージ到着 hDrop = wParam ; 内部ハンドル DadmInfo(3) = ginfo_intid ; 対象のウィンドウID DragQueryPoint hDrop, DadmInfo(1) ; 座標 DragQueryFile hDrop, -1, DadmInfo, 0 ; 変数はダミー DadmInfo = stat ; ファイル数 DadmList = "" repeat DadmInfo DragQueryFile hDrop, cnt, sb, 0 ; 文字数は? if sbleng <= stat : sbleng = stat + 1 : sdim sb, sbleng DragQueryFile hDrop, cnt, sb, sbleng ; 取得 DadmList += sb + "\n" loop DragFinish hDrop ; 内部ハンドル解放 if vartype(DadmLabel) == 1 : gosub DadmLabel ; サブルーチン return 0 ; メッセージ処理完了 ; http://www.tvg.ne.jp/menyukko/ ; Copyright(C) 2011 衣日和 All rights reserved. #global #endif

昔どこかで拾ったモジュールなんですが
DandD_GetInfoのx座標、y座標の関数が上手くいってないようなんです
直そうにもAPIとかグローバル命令とかさっぱりなので…
どこがどうおかしいのか教えてもらえないでしょうか?



この記事に返信する


pumpkin

リンク

2015/11/3(Tue) 20:45:01|NO.72749

根本的なところを直してるわけじゃないとは思いますが
#defcfunc DandD_GetInfo int f
if f&1 : return mousex if f&2 : return mousey return DadmInfo(f)
getinfoのとこを、こんな感じでシンプルにmousex,mousey値を返すようにしました。
仕組みがちゃんと分かってないので、あとから無理矢理継ぎ足したような修正になってますが…

別に今のところ問題はないので、ひとまず解決にしますが
コメント受け付けてるので、もっと綺麗な修正ができる方は宜しくお願いします。



End

リンク

2015/11/3(Tue) 20:51:37|NO.72750


〜上記モジュール略〜 //----初期化 screen ,400,300 :mes "ここにファイルをドロップしてね。" DandD_SetSubLabel *CMD_WM_DROPFILES ;ドラック&ドロップされたときにジャンプするラベル名 DandD_SetWindow 1 ;ドロップの受け入れを許可する stop //----ジャンプ先の処理 *CMD_WM_DROPFILES dialog {" 結果 ファイル数:"}+DandD_GetInfo(0)+{" 座標X:"}+DandD_GetInfo(1)+{" 座標Y:"}+DandD_GetInfo(2)+{" "} return

これで取得できませんか?
私の環境では正常に作動しました。



pumpkin

リンク

2015/11/3(Tue) 21:12:53|NO.72751

すみません、説明不足でした
//----初期化
screen ,400,300 :mes "ここにファイルをドロップしてね。" DandD_SetSubLabel *CMD_WM_DROPFILES ;ドラック&ドロップされたときにジャンプするラベル名 DandD_SetWindow 1 ;ドロップの受け入れを許可する stop //----ジャンプ先の処理 *CMD_WM_DROPFILES dialog {" 結果 ファイル数:"}+DandD_GetInfo(0)+{" 座標X:"}+DandD_GetInfo(1)+{" 座標Y:"}+DandD_GetInfo(2)+{" mousex:"}+mousey+{" mousey:"}+mousex+{" "} return

こういうことです。思ったような場所にドロップできないんですよね…



Noap

リンク

2015/11/8(Sun) 13:03:02|NO.72841

わたしは初心者なのでおかしいかもしれません
モジュールは使わないほうが分かりやすいかもしれません
一応念のため書いてから上のスクリプトも見てみましたがおかしいところは見当たりませんし、結果も正しいです。

説明用に書いてみたスクリプト


//ただmesではなくprintを使っているのはprintを使ってみたかっただけです #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" sptr,int #func DragQueryFile "DragQueryFileA" sptr,int,sptr,int #func DragQueryPoint "DragQueryPoint" sptr,sptr #func DragFinish "DragFinish" sptr #func SystemParametersInfo "SystemParametersInfoA" int,int,var,int #define WM_DROPFILES $00000233 #define MAX_PATH 260 dim dqppoint,2 dim hdrop,1 dim numfile,1 sdim filename,MAX_PATH cls title "ドラッグアンドドロップ" DragAcceptFiles hwnd,1 oncmd gosub *filedraged,WM_DROPFILES stop *filedraged //WM_DROPFILESというメッセージがHSPのウィンドウに来た(ファイルがドロップされた) hdrop=wparam color 255,255,255 : boxf color : pos 0,0 DragQueryFile hdrop,-1,0 numfile=stat DragQueryPoint hdrop,varptr(dqppoint) print "DragQueryPointで取得した座標 X="+dqppoint.0+" Y="+dqppoint.1+"\nmousex="+mousex+" mousey="+mousey repeat numfile //事前にファイルパスの長さが知りたいならばNULLを渡せばいい //DragQueryFile hdrop,cnt,0 : print "長さ="+stat DragQueryFile hdrop,cnt,varptr(filename),MAX_PATH print filename// : print "長さ="+stat loop DragFinish hdrop return 0

またpumpkinさんの修正についてですが


if f&1: return mousex if f&2: return mousey

よりは


if f=1 : return mousex if f=2 : return mousey

または


if f==1: return mousex if f==2: return mousey

のほうがいいと思います
理由はこのスクリプトとそのコメントでわかると思います


flag=3 mes "ビットのand演算" repeat flag+1 if flag&cnt : mes cnt loop mes "イコール" repeat flag+1 if flag==cnt : mes cnt loop //二進法で各桁がどちらとも1になっているとその桁が1になります //0001 (1) //0010 (2) //0011 (3) //0100 (4) //0101 (5) //...


わたしの思い浮かぶ原因としてはわざとであればすみませんが、pumpkinさんのスクリプトの中でmousexとmouseyが逆になっていることだけです。
とんちんかんな答えであればすみません。
ところで昔どこかで拾ったモジュールとのことですがURLが分かっているのでそのモジュールへのURL(http://www.tvg.ne.jp/menyukko/cauldron/hmdandd.html)を書くだけでいいと思います。あくまでも「思います」です。



pumpkin

リンク

2015/11/8(Sun) 13:29:14|NO.72842

普通にURL載ってましたね。見落としてました…

mousexとmouseyは素直にミスなんですが、そのミスを直しても正常に出来ず…
もしかしてwindows10だからなんですかね…?



Noap

リンク

2015/11/8(Sun) 13:51:29|NO.72844

スクリプトの訂正
#func  SystemParametersInfo    "SystemParametersInfoA"  int,int,var,int

はインデントのひな形として適当なAPIを自分の別のスクリプトからのを消し忘れていただけなのでいりません。 DragQueryPointがどうして動かないのかは分かりません。10はないので確認もできません。



seasalt

リンク

2015/11/8(Sun) 19:07:25|NO.72856

windows10環境で試してみましたが、問題なくきちんと取得されているようです。
(座標X、Yともmousex、mouseyと一致する)
よくわかりませんね。



774

リンク

2015/11/8(Sun) 19:17:07|NO.72859

>DandD_GetInfoのx座標、y座標の関数が上手くいってないようなんです
>思ったような場所にドロップできないんですよね…
>mousexとmouseyは素直にミスなんですが、そのミスを直しても正常に出来ず…
D&D自体はできているものの、座標の値が想定していた結果とは異なる。という事でしょうか?

pumpkin様の想定する結果と、実際の結果との食い違いについて
できるだけ具体的に書いて頂けると解決の糸口になるかも知れません。

(個人的には、座標に関して何かの思い込みや勘違いがあるんじゃないかな。と…



inovia

リンク

2015/11/8(Sun) 20:31:08|NO.72865

高DPI環境だと、D&D時にドロップ座標がずれる現象が発生しますね。
以下のスクリプトを実行して、
「高DPI環境です(スケーリングが働いています)」
と表示されれば、間違いないです。


#include "gdi32.as" #include "user32.as" #uselib "user32" // 非推奨API #func SetProcessDPIAware "SetProcessDPIAware" #module #define LOGPIXELSX 88 #define LOGPIXELSY 90 #deffunc getDPI var dpiX, var dpiY GetDC 0 sHdc = stat GetDeviceCaps sHdc, LOGPIXELSX dpiX = stat GetDeviceCaps sHdc, LOGPIXELSY dpiY = stat ReleaseDC 0, sHdc return #global getDPI dpiX, dpiY SetProcessDPIAware getDPI newDpiX, newDpiY if (dpiX != newDpiX || dpiY != newDpiY) { mes "高DPI環境です(スケーリングが働いています)" }else{ mes "問題ありません" } mes "システム: " + newDpiX + "dpi" mes "HSP(デフォルト): " + dpiX + "dpi"

SetProcessDPIAware関数はアプリケーションが高DPI対応
であることをWindowsに通知します。(=スケーリング無効化)
通常はマニフェストで指定するのが推奨とのこと。
https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd756596(v=vs.85).aspx
http://d.hatena.ne.jp/tsukaban/20130623/p1

DragQueryPointの座標がずれる条件としては、
------------------------------------------
ドラッグ元  |ドロップ先  | 結果 |
------------------------------------------
高DPI対応 |高DPI非対応|ずれる
高DPI非対応|高DPI対応 |ずれる
高DPI対応 |高DPI対応 |ずれない
高DPI非対応|高DPI非対応|ずれない
------------------------------------------
となりました。

ドラッグ元のウィンドウのDPIの値で、座標を計算しているようで、
ドラッグ元とドラッグ先のDPIに差があるとずれが発生する模様です。

普通にHSPでプログラミングを行うと、高DPI対応にはなりません。
しかし、エクスプローラなどは高DPIに対応しているため、この現象が発生すると思われます。



pumpkin

リンク

2015/11/8(Sun) 20:55:14|NO.72867

inoviaさん>>
「高DPI環境です(スケーリングが働いています)」表示されました
システムが120dpiです

残念なことにパソコンの仕組みとかちんぷんかんぷんなんですよね…;
面倒なこと頼んで申し訳ないんですが、具体的な解決方法とか教えてもらえませんか?



Noap

リンク

2015/11/8(Sun) 21:30:47|NO.72873

スケーリングは見にくいのでいつも無効(100%)にしていました。スケーリングが原因とは思いにも思いませんでした。inoviaさん感謝します。



pumpkin

リンク

2015/11/8(Sun) 21:52:05|NO.72875

検索すれば普通に出てきたので自己解決
今度こそ本当に解決です。ありがとうございました。



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