ページ 1 / 1
ドラッグ&ドロップ
Posted: 2007年11月13日(火) 21:29
by Taro
ドラッグ&ドロップイベントの取り方を教えてください。
ウィンド全体へ許可してのイベントは取得できましたが、Buttonに限定しての取得ができません。
ウィンドの拡張スタイル ドラッグ&ドロップのチェックを外し、CommandButton1の拡張スタイル ドラッグ&ドロップのチェックをONにしても、ButtonのイベントコードはClickとDbClickしか表示せずにDropFileのイベント記載ができません。
また、MainWnd_DropFiles()にもイベントがきません。
どうすれば取れますか?
Posted: 2007年11月14日(水) 01:17
by konisi
よく見ないで解答してしまったorz [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Const Print_Size=1024
Sub MainWnd_DropFiles(hDrop As HDROP)
Dim buf As *Byte,buf2 As *Byte,buf3[2] As Byte
Dim FileNameLen As Long
Dim i As Long,j As Long
j=DragQueryFile(hDrop,-1,0,0)-1
buf2=calloc(Print_Size+1)
buf3[0]=&H0D'buf3は改行用
buf3[1]=&H0A
buf3[2]=0
For i=0 To j
FileNameLen=DragQueryFile(hDrop,0,buf,NULL)+1
buf=calloc(FileNameLen)
DragQueryFile(hDrop,i,buf,FileNameLen)
If lstrlen(buf2)+FileNameLen<Print_Size-2 then
lstrcat(buf2,buf)'追加
lstrcat(buf2,buf3)'改行
End If
free(buf)
Next
MessageBox(hMainWnd,buf2,"test",MB_OK)'表示
DragFinish(hDrop)'D&Dのハンドルの開放
free(buf2)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
DragAcceptFiles(hMainWnd,TRUE)'D&Dを許可
End Sub
これでいけると思います。
MainWndProc内で頑張ってDropFilesイベントを取得して、GetCursorPosとScreenToClientでマウス座標を取得して分岐するとかそういう手段を昔使用しました。
dwMsg=WM_DROPFILESの時hDrop=wParamです。
Posted: 2007年11月15日(木) 00:24
by Taro
どうも。
分岐するのでは、マウスポインターでD&D可能な場所判別が付かないんですょ。
サブクラス化すれば出来そうなので調べていますが、よく分かりません。
Posted: 2007年11月15日(木) 08:03
by 7
> 分岐するのでは、マウスポインターでD&D可能な場所判別が付かないんですょ。
DragAcceptFiles()関数を使ってみてはどうでしょう?
Posted: 2007年11月15日(木) 09:23
by Taro
試してみました。
コード: 全て選択
DragAcceptFiles(hMainWnd,TRUE)
ボタン部以外の場所へのD&DはDropFilesイベントが上がりますが、ボタン部でのD&Dではイベントが上がりません。
またマウスポインターでのD&D可能場所の判断もできません。
下記では、マウスポインターは期待通りですが、D&Dのイベントを受け取れません。
(コードが有っても、無くても同じ状況です)
コード: 全て選択
DragAcceptFiles(GetDlgItem(hMainWnd,CommandButton1),TRUE)
Posted: 2007年11月15日(木) 13:33
by Tomorrow
前作ったプログラムから切り貼りして作ってみました。
サブクラス化を使って実装したものです。
エディットボックス用ですが、参考にしてみてください。
http://www.2chab.net/uploader/src/up0054.zip
Posted: 2007年11月15日(木) 16:38
by Taro
EditBox1を消しButton1を貼り付けてドラッグ&ドロップ許可し下記のコードで動きました。
(D&Dを表現する手段が無かったので、Static1に表示してみました。)
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim DefEditProc As Long
Function DropEditProc(hWnd As HWND, message As DWORD, wParam As DWORD, lParam As DWORD) As DWORD
Select Case message
Case WM_DROPFILES
Dim hDrop As HDROP
Dim FileName[MAX_PATH] As Byte
hDrop=wParam As HDROP
'ドロップされたファイル名を取得
DragQueryFile(hDrop, 0, FileName, MAX_PATH)
SetWindowText(GetDlgItem(hMainWnd,Static1), FileName)
DragFinish(hDrop)
DropEditProc=0
Exit Function
End Select
DropEditProc=CallWindowProc(DefEditProc As VoidPtr, hWnd, message, wParam, lParam)
End Function
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
SetWindowLong(GetDlgItem(hMainWnd, CommandButton1), GWL_WNDPROC, DefEditProc)
TextboxDrop_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
DefEditProc=SetWindowLong(GetDlgItem(hMainWnd, CommandButton1), GWL_WNDPROC, AddressOf(DropEditProc) As Long)
End Sub
ありがとうございました。