Pregunta para principiantes de VC: arrastrar archivos al cuadro de texto para obtener la ruta del archivo es una pregunta sencilla
Añadir otro método.
1. Agregue shellapi.h al archivo de encabezado o agregue el siguiente código directamente: #ifndef?_INC_SHELLAPI
#define?_INC_SHELLAPI
//< / p>
//?Definir?API?decoración?para?importación?directa?de?referencias?DLL.
//
#ifndef?WINSHELLAPI
#if?!definido(_SHELL32_)
#define?WINSHELLAPIDECLSPEC_IMPORT
#else
#define?WINSHELLAPI
# endif
#endif?//?WINSHELLAPI
#ifndef?SHSTDAPI
#if?!definido(_SHELL32_)
# definir ?SHSTDAPI?EXTERN_C?DECLSPEC_IMPORT?HRESULT?STDAPICALLTYPE
#define?SHSTDAPI_(tipo)EXTERN_C?DECLSPEC_IMPORT?tipo?STDAPICALLTYPE
#else
#define ? SHSTDAPI?STDAPI
#define?SHSTDAPI_(tipo)STDAPI_(tipo)
#endif
#endif?//?SHSTDAPI
#ifndef?SHDOCAPI
#if?!definido(_SHDOCVW_)
#define?SHDOCAPI?EXTERN_C?DECLSPEC_IMPORT?HRESULT?STDAPICALLTYPE
#define? SHDOCAPI_ (tipo)EXTERN_C?DECLSPEC_IMPORT?tipo?STDAPICALLTYPE
#else
#define?SHDOCAPI?STDAPI
#define?SHDOCAPI_(tipo)STDAPI_(tipo )
#endif
#endif?//?SHDOCAPI
#if?!?(definido(lint)?||?definido(_lint)? | |?definido(RC_INVOKED))
#if?(?_MSC_VER?gt;=?800?)?||?definido(_PUSHPOP_SUPPORTED)
#pragma?warning(disable) : 4103)
#if?!(definido(?MIDL_PASS?))?||?definido(?__midl?)
#pragma?pack(push)
#endif
#pragma?pack(1)
#else
#pragma?pack(1)
# endif
#endif?//?!?(definido(lint)?||?definido(_lint)?||?definido(RC_INVOKED))<
/p>
#ifdef?__cplusplus
extern?"C"?{/*?Assume?C?declarations?for?C ?*/
#endif?/ *?__cplusplus?*/
DECLARE_HANDLE(HDROP);
WINSHELLAPI?UINT?APIENTRY?DragQueryFileA(HDROP, UINT, LPSTR, UINT);
WINSHELLAPI ?UINT?APIENTRY?DragQueryFileW(HDROP, UINT, LPWSTR, UINT);
#ifdef?UNICODE
#define?DragQueryFile?DragQueryFileW
#else
#define?DragQueryFile?DragQueryFileA
#endif?//?!UNICODE
WINSHELLAPI?BOOL?APIENTRY?DragQueryPoint(HDROP, LPPOINT);
WINSHELLAPI?VOID?APIENTRY?DragFinish(HDROP);
WINSHELLAPI?VOID?APIENTRY?DragAcceptFiles(HWND, BOOL);
#ifdef?__cplusplus
}
#endif?/*?__cplusplus?*/
#if?!?(definido(lint)?||?definido(_lint)?||? definido(RC_INVOKED))
#if?(?_MSC_VER?gt;=?800?)?||?definido(_PUSHPOP_SUPPORTED)
#pragma?warning(disable: 4103)
#if?!(definido(?MIDL_PASS?))?||?definido(?__midl?)
#pragma?pack(pop)
#else
#pragma?pack()
#endif
#else
#pragma?pack()
#endif
#endif?//?!?(definido(lint)?||?definido(_lint)?||?definido(RC_INVOKED))
# endif?/*?_INC_SHELLAPI?*/
2. Marque Aceptar archivos en las propiedades del cuadro de diálogo
3. Agregar procesamiento de mensajes: case?WM_DROPFILES:
HDROP?hDropInfo?=?(HDROP)?wParam; //Obtiene el puntero de la estructura de datos del archivo arrastrado y soltado del mensaje WM_DROPFILES
DragQueryFile(hDropInfo, 0, szFilePath, _MAX_PATH); /Obtener la ruta del archivo
DragFinish(hDropInfo); //Después de arrastrar y soltar, ¿liberar la memoria?
SendDlgItemMess
age(hWnd, IDC_FILEPATH_EDIT, WM_SETTEXT, MAX_PATH, (LPARAM)szFilePath);
El siguiente es el código completo: #include?lt; windows.hgt;
#include?lt; ;shellapi .hgt;
#include?lt;commdlg.hgt;
#include?"resource.h"
LRESULT?CALLBACK MainDlgProc(HWND, ?UINT ,?WPARAM,?LPARAM);
BOOLOpenFileDlg(HWND);?
char?szFilePath[MAX_PATH];
HINSTANCE?hInst
p>
int?APIENTRY?WinMain(HINSTANCE?hInstance, HINSTANCE?hPrevInstance, LPSTR?lpCmdLine, intnCmdShow)
{
hInst?=?hInstance;
DialogBox(hInstance,?(LPCTSTR)IDD_MAIN_DLG,?NULL,?(DLGPROC)MainDlgProc);
return?0;
}
LRESULT ?CALLBACK ?MainDlgProc(HWND?hWnd, ?UINT?message, ?WPARAM?wParam, ?LPARAM?lParam)
{
int?wmId, ?wmEvent;
¿cambiar?(mensaje)?
{
caso?WM_COMMAND:
wmId=?LOWORD(wParam);?
wmEvent ?=?HIWORD(wParam);?
cambiar?(wmId)
{
caso?IDC_OPEN_BTN:
si (! OpenFileDlg(hWnd))
return?FALSE;
SendDlgItemMessage(hWnd, IDC_FILEPATH_EDIT, WM_SETTEXT, MAX_PATH, (LPARAM)szFilePath
return? VERDADERO;
}
romper
caso?WM_CLOSE:
EndDialog(hWnd,?0); p> break;
case?WM_DROPFILES:
HDROP?hDropInfo?=?(HDROP)?wParam //Obtiene el puntero de la estructura de datos del archivo arrastrado y soltado desde el mensaje WM_DROPFILES
p>DragQueryFile(hDropInfo, 0, szFilePath, MAX_PATH); //Obtener la ruta del archivo
DragFinish(hDropInfo); //Después de completar el proceso de arrastrar y soltar; , ¿liberar la memoria?<
/p>
SendDlgItemMessage(hWnd, IDC_FILEPATH_EDIT, WM_SETTEXT, MAX_PATH, (LPARAM)szFilePath);
return?TRUE;
return?0;
}
BOOL?OpenFileDlg(HWND?hwnd)
{
OPENFILENAME ?ofn;
memset(szFilePath, 0, MAX_PATH);
memset(amp; ofn, ?0, ?sizeof(ofn)); .lStructSize?=sizeof(ofn);
ofn.hwndOwner=hwnd;
ofn.hInstance=GetModuleHandle(NULL);
ofn.nMaxFile?= MAX_PATH;
ofn.lpstrInitialDir?=".";
ofn.lpstrFile=szFilePath;
ofn.lpstrTitle="Abrir...";
ofn.Flags=OFN_PATHMUSTEXIST?|?OFN_FILEMUSTEXIST?|?OFN_HIDEREADONLY;
ofn.lpstrFilter?="*.*\0*.*\0";
if(!GetOpenFileName(amp; ofn))
{
ZeroMemory(amp; ofn, sizeof(OPENFILENAME)); //Liberar memoria
return?FALSE;
}
ZeroMemory(amp; ofn, sizeof(OPENFILENAME)); //Liberar memoria
return?TRUE;
}