【发布时间】:2011-08-13 00:10:44
【问题描述】:
我正在使用 Delphi 编写一个简单的应用程序,该应用程序需要接受拖放的目录名称。虽然我使用的是 Delphi,但这个程序是直接的 Windows API(没有 VCL,没有面向对象的东西),就像在普通 C 中一样。
我有一些代码已经使用普通窗口(由 CreateWindowEx 创建)工作。当我将该代码转换为使用对话框时,拖放功能中断,我无法弄清楚原因。
这是(部分)我运行良好的代码:
函数 WndProc(Wnd:hWnd;Msg,wParam,lParam:DWORD):DWORD;标准调用; {主应用程序/窗口处理函数} 常量 DROPPED_FILE_COUNT = -1; 变量 FileCnt:整数; { 删除的文件数 } 文件名:char 的打包数组[0..MAX_PATH]; {文件名缓冲区} DropInfo : HDROP 绝对 wParam; { wParam 指向 Drop...} 我:整数; { for 循环 } 开始 WndProc := 0; { 让 Windows 默认处理程序处理所有事情} 案例信息 WM_CREATE: 开始 初始化通用控件; 如果 CreateWindowEx(WS_EX_CLIENTEDGE 或 WS_EX_RIGHTSCROLLBAR, '列表框', 零, WS_CHILD 或 WS_HSCROLL 或 WS_VSCROLL 或 WS_CLIPSIBLINGS 或 WS_CLIPCHILDREN 或 WS_VISIBLE 或 LBS_NOINTEGRALHEIGHT, 0, 0, 0, 0, Wnd, IDC_LISTBOX, 实例, 无)= 0 然后 开始 消息框(Wnd, '无法创建列表框', '主窗口', MB_OK); WndProc := -1; 结尾; { 让 Windows 知道我们接受将文件拖到我们的客户端上} { 区域。 } DragAcceptFiles(Wnd, TRUE); { 告诉列表框使用漂亮的字体 } SendMessage(GetDlgItem(Wnd, IDC_LISTBOX), WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), 0); 出口; 结尾; { WM_CREATE } WM_DROPFILES: 开始 { 一个或多个文件已丢给我们! } FileCnt := DragQueryFile(DropInfo, DROPPED_FILE_COUNT, nil, 0); 对于 I := 0 到 FileCnt - 1 做 开始 { 获取删除的文件名并将它们添加到列表框} DragQueryFile(DropInfo, I, Filename, sizeof(Filename)); ListBox_AddString(GetDlgItem(Wnd, IDC_LISTBOX), 文件名); 结尾; { 告诉 Windows 我们已完成抓取删除的文件} DragFinish(DropInfo); 出口; 结尾; { WM_DROPFILES } ...其次是与拖放无关的其他内容...我把它转换成这个:
程序 ExecWM_INITDIALOG(wnd : hWnd); 开始 {确保列表框不接受丢弃的文件} DragAcceptFiles(GetDlgItem(Wnd, IDC_DIRECTORIES), FALSE); { 确保主对话窗口接受丢弃的文件 } DragAcceptFiles(Wnd, TRUE); {加载注册表中的当前值} LoadRegistrySettings(RegistryKey, RegistrySettings, RegistrySettingsCount) 结尾; 程序 ExecWM_DROPFILES(Wnd : hWnd; wParam : 字; lParam : longint); 常量 DROPPED_FILE_COUNT = -1; 变量 FileCnt:整数; { 删除的文件数 } 文件名:char 的打包数组[0..MAX_PATH]; {文件名缓冲区} DropInfo : HDROP 绝对 wParam; { wParam 指向 Drop...} 我:整数; { for 循环 } 开始 { 一个或多个文件已丢给我们! } { -->>> 问题似乎出现在这个语句中:} { DropInfo (wParam) 的值似乎太低 ($20) } {当使用有效的代码时,价值要大得多} FileCnt := DragQueryFile(DropInfo, DROPPED_FILE_COUNT, nil, 0); 对于 I := 0 到 FileCnt - 1 做 开始 { 获取删除的文件名并将它们添加到列表框} DragQueryFile(DropInfo, I, Filename, sizeof(Filename)); ListBox_AddString(GetDlgItem(Wnd, IDC_DIRECTORIES), 文件名); 结尾; { 告诉 Windows 我们已完成抓取删除的文件} DragFinish(DropInfo); 结尾; 功能 BackupConfigProc(wnd : hWnd; 味精:单词; wParam:单词; lParam : longint) : bool;标准调用; 开始 BackupConfigProc := FALSE; { 默认返回值 } 案例信息 WM_COMMAND: 开始 ExecWM_COMMAND (wnd, wParam, lParam); BackupConfigProc := TRUE; 结尾; WM_DROPFILES: 开始 ExecWM_DROPFILES(Wnd, wParam, lParam); //BackupConfigProc := TRUE; {这是在黑暗中拍摄的} 结尾; WM_INITDIALOG: 开始 ExecWM_INITDIALOG (wnd); BackupConfigProc := TRUE; 结尾; WM_CLOSE: 开始 EndDialog(wnd, 0); { 并返回默认的 FALSE } 结尾; 结尾; 结尾; 开始 对话框(hInstance,'BackupConfigDlg',0,@BackupConfigProc); 结尾。对话框接收到的 DropInfo (wParam) 的值似乎无效(因为它的值远低于正常工作的非对话框代码接收到的值)。
我将感谢所有能够阐明为什么 Dialog 版本不起作用以及需要做什么才能使其起作用的人。
谢谢你,
约翰。
【问题讨论】:
标签: delphi winapi drag-and-drop dialog