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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0626
p->nドロップではなく、ドラッグ動作の検出について。8解決


p->n

リンク

2010/6/26(Sat) 00:34:05|NO.33437

ウインドウ上を、ドロップではなく、
"ドラッグ中"であることを検出する方法はありますでしょうか。

適当なファイルを、ドラッグでタスクバーのタスクボタン上に持っていきますと、
そのボタンのウインドウがアクティブになるところを見ると、何らかの方法があるように思われます。

そこで、左クリックがされているかどうかを条件に処理すれば良いのではないかと思ったのですが、
他のウインドウからのドロップであるためか、上手く動いてくれないようです。

何方か助言をお願いします。



この記事に返信する


あり

リンク

2010/6/26(Sat) 01:12:21|NO.33439

OLEドロップみたいな事がやりたいのかな?
そうであればHSP用のプラグインがあったはずですが・・・



p->n

リンク

2010/6/26(Sat) 13:30:56|NO.33440

ありさん、回答有難うございます。
私の文章に間違いがあった為、修正します。

他のウインドウからのドロップであるためか、上手く動いてくれないようです。

他のウインドウからのドラッグであるためか、上手く動いてくれないようです。

ドロップではなく、ドラッグの検出でした。
申し訳ございません。



あり

リンク

2010/6/27(Sun) 01:05:06|NO.33449

GetAsyncKeyStateを使うとHSPウィンドウ外のマウスクリックを
検出できるみたいですがあまり詳しく調べていないので
使い方が間違っているかもしれませんし、他にも方法があるとは思います。

#include "user32.as" #define VK_LBUTTON $01 ;マウス左ボタン #define VK_RBUTTON $02 ;マウス右ボタン #define VK_MBUTTON $04 ;マウス中央ボタン gsel 0, 2 *main GetAsyncKeyState VK_LBUTTON if stat ! 0 : LBF = "○" : else : LBF = "X" GetAsyncKeyState VK_RBUTTON if stat ! 0 : RBF = "○" : else : RBF = "X" GetAsyncKeyState VK_MBUTTON if stat ! 0 : MBF = "○" : else : MBF = "X" title "左ボタン" + LBF + " 中央ボタン" + MBF + " 右ボタン" + RBF wait 10 goto *main
簡単に調べたかぎりではHSPのデバッグウィンドウの
リストビュー上のクリック検出だけ上手くできませんでした。



木村

リンク

2010/6/27(Sun) 20:35:40|NO.33466

 素直にgetkey命令で情報を獲得するというのは野暮なのでしょうか? 以下は一例

screen 0,160,120,0 repeat //演算 presum=sum getkey br,1 : if br : sum+ : bx=ginfo_mx : by=ginfo_my : else : sum=0 if sum=1 : ax=ginfo_mx : ay=ginfo_my //描画 redraw 0 color : boxf if sum>0 { pos 0,0 color 255,128,128 : mes "ドラッグ時間"+sum color 128,255,128 : mes "開始地点("+ax+","+ay+")" color 128,128,255 : mes "終了地点("+bx+","+by+")" } redraw 1 //ドロップ判定 if (presum>0)&(sum=0) { log="ドロップしました" : notesel log noteadd "ドラッグ時間"+presum noteadd "開始と終了\t("+ax+","+ay+") ⇒ ("+bx+","+by+")" dialog log } //ウェイト wait 5 loop
 問題は『ドラッグ』ですからファイル獲得の是非をチェックせねばならないという点
でしょうか。そこまでは分かりません、申し訳ありません。



MillkeyWeler

リンク

2010/6/28(Mon) 03:21:00|NO.33482

質問がいまいち把握できませんが、一応、ドラッグ&ドロップについてのスクリプトがありますので、提供しておきます。


#uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int,int #func DragFinish "DragFinish" int #cfunc DragQueryFile "DragQueryFileA" int,int,sptr,int #cfunc DragQueryPoint "DragQueryPoint" int,var screen 0,800,600,0 : cls 4 DragAcceptFiles hwnd,1 ; ファイルドロップの受付を設定 (ウィンドウハンドル,可否[0 : 受け付けない / 1 : 受付) oncmd gosub *filedrop,0x0233 ; ファイルをドロップされた時にサブルーチンジャンプ stop ;---------------------------------------- ここからが、ドロップデータを取得する ---------------------------------------------------------- *filedrop alloc DropFileData,20480 ; ドロップされたファイルデータを格納する変数のメモリを確保 dim DropPosi,8 ; ドロップされた時の、マウス位置 drophnd=wparam ; ドロップデータ構造体のハンドル ;DragQueryFile 関数説明 ; ; 引数説明 DragQueryFile (p1,p2,s1,p3) ; ; p1 は、↑で取得した、ドロップデータ構造体のハンドル ; p2 は、インデックス番号 : ここの場所に -1 を指定した場合、ドロップされたファイルデータの総数が返る ; s1 は、インデックス番号に格納されている、ファイル名文字変数を取得する ; p3 は、ドロップされたファイルデータを格納するメモリの最大サイズ( 基本的に、10240ほどでok) ind_max=DragQueryFile(drophnd,-1,varptr(DropFileData),20480) ; 引数 p2 に対して、-1 が指定されてるので、インデックスの総数を取得 DropFileString="" notesel DropFileString repeat ind_max ind_max=DragQueryFile(drophnd,cnt,varptr(DropFileData),20480) ; 引数 p2 に対して、-1 が指定されてるので、インデックスの総数を取得 noteadd DropFileData,-1 loop WinFlg=DragQueryPoint(drophnd,DropPosi) ; 戻り値には、ウィンドウのクライアント上にドロップしたか、そうでないかの情報(0は、クライアント領域に 1 は、キャプションバーなど) DragFinish drophnd ; ドロップデータ構造体を開放 ← 必ず notesel 命令などに格納したら、その時点で、開放すること。 noteunsel ;------------------------------------------ ここまでがドロップデータ処理 ----------------------------------------------------------------- ; ここから先に、独自の処理を記載する。 cls 4 : color 255,255,255 notesel DropFileString ntmax=notemax pos 0,0 if WinFlg=0 : mes "クライアント領域以外にドロップされました。" if WinFlg=1 : mes "クライアント領域 X."+DropPosi(0)+" x Y."+DropPosi(1)+" 上にドロップされました。" repeat ntmax noteget temp,cnt pos 0,(15*cnt)+15 : mes ""+temp loop return

↑のソースは、ファイルをドラッグ&ドロップして内容を表示するというソースです。
ウィンドウ自体に対しての移動などの検出は、別なので、その場合は、その趣旨を説明してください。



pizza

リンク

2010/6/29(Tue) 14:47:34|NO.33495

C用のOLEドラッグ&ドロップのDLL(OleDragDrop.dll)をHSPで使ってみましたが、ドラッグ中の判定もできるみたいです。



テック

リンク

2010/6/29(Tue) 22:24:33|NO.33502

>ウインドウ上を、ドロップではなく、
>"ドラッグ中"であることを検出する方法はありますでしょうか。
ドラッグ中であるかどうかは、
木村さんの記述どおり、
getkey命令で情報を取得してチェックするのが
一番簡単だと思います。

毎フレームごとにgetkey命令で情報を取得し、
取得した情報を保持しておき、
1つ前のフレームで、マウスの左ボタンが押されていて、かつ
現在のフレームで、マウスの左ボタンが押されていたら、
ドラッグ中であるとすればいいと思います。

下記にサンプルスクリプトを載せておきます。

// マクロ宣言 #define DIALOG_TITLE_CONFIRM "確認メッセージ" #define DIALOG_TITLE_WARNING "警告メッセージ" #define MESSAGE_HSP_END "HSPを終了してもよろしいですか?" // グローバル変数宣言 g_nMouseLeftStateOld = 0 // マウスの左ボタンの状態(過去) g_nMouseLeftStateNow = 0 // マウスの左ボタンの状態(現在) g_nMouseLeftStateNew = 0 // マウスの左ボタンの状態(未来) ldim g_lstLabel, 4 // ラベル配列 // 新 古  // 0 0 0:離されたまま(ニュートラル) // 0 1 1:離された瞬間(リリース) // 1 0 2:押された瞬間(クリック) // 1 1 3:押されたまま(ドラッグ) // ラベル配列を初期化する g_lstLabel.0 = *LeftNeutral g_lstLabel.1 = *LeftRelease g_lstLabel.2 = *LeftClick g_lstLabel.3 = *LeftDrag // クローズボックス(ウィンドウ右上の終了ボタン)が // 押された場合に呼び出されるラベルを指定する onexit gosub *CloseBox // HSPループ *HspLoop // 画面をクリアする cls // マウスの左ボタンの入力状態を取得する getkey g_nMouseLeftStateNew, 1 // マウスの左ボタンの状態(新)*2とマウスの左ボタンの状態(古)を加算する g_nMouseLeftStateNow = g_nMouseLeftStateNew * 2 + g_nMouseLeftStateOld // マウスの左ボタンの状態に対応したラベルにジャンプする gosub g_lstLabel.g_nMouseLeftStateNow // マウスの左ボタンの入力状態を保持する g_nMouseLeftStateOld = g_nMouseLeftStateNew await 30 goto *HspLoop // クローズボックス(ウィンドウ右上の終了ボタン)が // 押された場合の処理を行う *CloseBox // 確認ダイアログを表示する dialog MESSAGE_HSP_END, 2, DIALOG_TITLE_CONFIRM // 「はい」ボタンが押下された場合 if (stat = 6) { // HSPを終了する end // 「いいえ」ボタンが押下された場合 } else { } stop // マウスの左ボタンのニュートラル時 *LeftNeutral mes "マウスの左ボタンはニュートラルです" return // マウスの左ボタンのクリック時 *LeftClick mes "マウスの左ボタンは押されました" return // マウスの左ボタンのドラッグ時 *LeftDrag mes "マウスの左ボタンはドラッグ中です" return // マウスの左ボタンのリリース時 *LeftRelease mes "マウスの左ボタンは離されました" return



p->n

リンク

2010/6/30(Wed) 17:22:39|NO.33508

皆様回答有難うございます。
pizza氏が仰った"OleDragDrop.dll"を検討したいと思います。



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