ドラッグ&ドロップイベントの取り方を教えてください。
ウィンド全体へ許可してのイベントは取得できましたが、Buttonに限定しての取得ができません。
ウィンドの拡張スタイル ドラッグ&ドロップのチェックを外し、CommandButton1の拡張スタイル ドラッグ&ドロップのチェックをONにしても、ButtonのイベントコードはClickとDbClickしか表示せずにDropFileのイベント記載ができません。
また、MainWnd_DropFiles()にもイベントがきません。
どうすれば取れますか?
ドラッグ&ドロップ
よく見ないで解答してしまったorz [ここをクリックすると内容が表示されます]これでいけると思います。
MainWndProc内で頑張ってDropFilesイベントを取得して、GetCursorPosとScreenToClientでマウス座標を取得して分岐するとかそういう手段を昔使用しました。コード: 全て選択
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
dwMsg=WM_DROPFILESの時hDrop=wParamです。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
前作ったプログラムから切り貼りして作ってみました。
サブクラス化を使って実装したものです。
エディットボックス用ですが、参考にしてみてください。
http://www.2chab.net/uploader/src/up0054.zip
サブクラス化を使って実装したものです。
エディットボックス用ですが、参考にしてみてください。
http://www.2chab.net/uploader/src/up0054.zip
EditBox1を消しButton1を貼り付けてドラッグ&ドロップ許可し下記のコードで動きました。
(D&Dを表現する手段が無かったので、Static1に表示してみました。)
(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