當前位置:編程學習大全網 - 編程語言 - VC++菜鳥問題 拖拽文件到文本框獲取文件路徑簡單問題

VC++菜鳥問題 拖拽文件到文本框獲取文件路徑簡單問題

補充壹下另壹種方法。

1,在頭文件中添加shellapi.h,或者直接添加如下代碼:

#ifndef?_INC_SHELLAPI

#define?_INC_SHELLAPI

//

//?Define?API?decoration?for?direct?importing?of?DLL?references.

//

#ifndef?WINSHELLAPI

#if?!defined(_SHELL32_)

#define?WINSHELLAPIDECLSPEC_IMPORT

#else

#define?WINSHELLAPI

#endif

#endif?//?WINSHELLAPI

#ifndef?SHSTDAPI

#if?!defined(_SHELL32_)

#define?SHSTDAPI?EXTERN_C?DECLSPEC_IMPORT?HRESULT?STDAPICALLTYPE

#define?SHSTDAPI_(type)EXTERN_C?DECLSPEC_IMPORT?type?STDAPICALLTYPE

#else

#define?SHSTDAPI?STDAPI

#define?SHSTDAPI_(type)STDAPI_(type)

#endif

#endif?//?SHSTDAPI

#ifndef?SHDOCAPI

#if?!defined(_SHDOCVW_)

#define?SHDOCAPI?EXTERN_C?DECLSPEC_IMPORT?HRESULT?STDAPICALLTYPE

#define?SHDOCAPI_(type)EXTERN_C?DECLSPEC_IMPORT?type?STDAPICALLTYPE

#else

#define?SHDOCAPI?STDAPI

#define?SHDOCAPI_(type)STDAPI_(type)

#endif

#endif?//?SHDOCAPI

#if?!?(defined(lint)?||?defined(_lint)?||?defined(RC_INVOKED))

#if?(?_MSC_VER?>=?800?)?||?defined(_PUSHPOP_SUPPORTED)

#pragma?warning(disable:4103)

#if?!(defined(?MIDL_PASS?))?||?defined(?__midl?)

#pragma?pack(push)

#endif

#pragma?pack(1)

#else

#pragma?pack(1)

#endif

#endif?//?!?(defined(lint)?||?defined(_lint)?||?defined(RC_INVOKED))

#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?!?(defined(lint)?||?defined(_lint)?||?defined(RC_INVOKED))

#if?(?_MSC_VER?>=?800?)?||?defined(_PUSHPOP_SUPPORTED)

#pragma?warning(disable:4103)

#if?!(defined(?MIDL_PASS?))?||?defined(?__midl?)

#pragma?pack(pop)

#else

#pragma?pack()

#endif

#else

#pragma?pack()

#endif

#endif?//?!?(defined(lint)?||?defined(_lint)?||?defined(RC_INVOKED))

#endif?/*?_INC_SHELLAPI?*/

2,對話框屬性中勾選 接收文件(Accept files)

3,添加消息處理:

case?WM_DROPFILES:

HDROP?hDropInfo?=?(HDROP)?wParam; //從WM_DROPFILES消息中獲取所拖放文件的數據結構的指針

DragQueryFile(hDropInfo,0,szFilePath,_MAX_PATH); //獲取文件路徑

DragFinish(hDropInfo); //拖放結束後,釋放內存?

SendDlgItemMessage(hWnd,IDC_FILEPATH_EDIT,WM_SETTEXT,MAX_PATH,(LPARAM)szFilePath);

下面是完整代碼:

#include?<windows.h>

#include?<shellapi.h>

#include?<commdlg.h>

#include?"resource.h"

LRESULT?CALLBACK MainDlgProc(HWND,?UINT,?WPARAM,?LPARAM);

BOOLOpenFileDlg(HWND);?

char?szFilePath[MAX_PATH];

HINSTANCE?hInst;

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;

switch?(message)?

{

case?WM_COMMAND:

wmId=?LOWORD(wParam);?

wmEvent?=?HIWORD(wParam);?

switch?(wmId)

{

case?IDC_OPEN_BTN:

if(!OpenFileDlg(hWnd))

return?FALSE;

SendDlgItemMessage(hWnd,IDC_FILEPATH_EDIT,WM_SETTEXT,MAX_PATH,(LPARAM)szFilePath);

return?TRUE;

}

break;

case?WM_CLOSE:

EndDialog(hWnd,?0);

break;

case?WM_DROPFILES:

HDROP?hDropInfo?=?(HDROP)?wParam; //從WM_DROPFILES消息中獲取所拖放文件的數據結構的指針

DragQueryFile(hDropInfo,0,szFilePath,MAX_PATH); //獲取文件路徑

DragFinish(hDropInfo); //拖放結束後,釋放內存?

SendDlgItemMessage(hWnd,IDC_FILEPATH_EDIT,WM_SETTEXT,MAX_PATH,(LPARAM)szFilePath);

return?TRUE;

break;

}

return?0;

}

BOOL?OpenFileDlg(HWND?hwnd)

{

OPENFILENAME?ofn;

memset(szFilePath,0,MAX_PATH);

memset(&ofn,?0,?sizeof(ofn));

ofn.lStructSize?=sizeof(ofn);

ofn.hwndOwner=hwnd;

ofn.hInstance=GetModuleHandle(NULL);

ofn.nMaxFile?=MAX_PATH;

ofn.lpstrInitialDir?=".";

ofn.lpstrFile=szFilePath;

ofn.lpstrTitle="Open...";

ofn.Flags=OFN_PATHMUSTEXIST?|?OFN_FILEMUSTEXIST?|?OFN_HIDEREADONLY;

ofn.lpstrFilter?="*.*\0*.*\0";

if(!GetOpenFileName(&ofn))

{

ZeroMemory(&ofn,sizeof(OPENFILENAME)); //釋放內存

return?FALSE;

}

ZeroMemory(&ofn,sizeof(OPENFILENAME)); //釋放內存

return?TRUE;

}

  • 上一篇:本人正在學C和C++,但不知道C和C++都可以幹點什麽,
  • 下一篇:前端開發框架是什麽
  • copyright 2024編程學習大全網