
补充一下另一种方法。
1,在头文件中添加shellapih,或者直接添加如下代码:
#ifndef _INC_SHELLAPI#define _INC_SHELLAPI
//
// Define API decoration for direct importing of DLL references
//
#ifndef WINSHELLAPI
#if !defined(_SHELL32_)
#define WINSHELLAPI DECLSPEC_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 <windowsh>#include <shellapih>
#include <commdlgh>
#include "resourceh"
LRESULT CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL OpenFileDlg(HWND);
char szFilePath[MAX_PATH];
HINSTANCE hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
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));
ofnlStructSize =sizeof(ofn);
ofnhwndOwner =hwnd;
ofnhInstance =GetModuleHandle(NULL);
ofnnMaxFile =MAX_PATH;
ofnlpstrInitialDir ="";
ofnlpstrFile =szFilePath;
ofnlpstrTitle ="Open";
ofnFlags =OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofnlpstrFilter ="\0\0";
if(!GetOpenFileName(&ofn))
{
ZeroMemory(&ofn,sizeof(OPENFILENAME)); //释放内存
return FALSE;
}
ZeroMemory(&ofn,sizeof(OPENFILENAME)); //释放内存
return TRUE;
}
这个简单:
在Button的点击函数中加入如下代码
CFileDialog Open(TRUE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Bitmap Files (bmp)|bmp|JPEG Files (jpg)|jpg|All Files ()|||",NULL););
if(OpenDoModal()==IDOK)
{
strPath=OpenGetPathName();//这就是你要的路径了。
}
"Bitmap Files (bmp)|bmp|JPEG Files (jpg)|jpg|All Files ()|||"
这一串是文件过滤器,就是在列表中显示什么扩展名的文件。
创建dll工程,工程名定为dll,新建并添加头文件dllDemoh
//dlldemoh
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT int add(int a,int b) ;
EXPORT int sub(int a,int b);
新建并添加源文件dllDemoc
//dlldemoc
#include <windowsh>
#include "dlldemoh"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {
return TRUE ;
}
EXPORT int add(int a,int b) {
return a+b;
}
EXPORT int sub(int a,int b){
return a-b;
}
编译成功后会生成一个dll文件。
再新建一个普通的win32 console工程,工程属性里面的字符集要设为多字节,不要使用Unicode。将dll文件放到目录下面。新建并添加mainc
#include <WINDOWSH>
#include <WINBASEH>
#include <stdioh>
typedef int (MYPROC)(int, int);
int main()
{
HINSTANCE LibHandle;
MYPROC ProcAdd,ProcSub;
char dllbuf[] = "dlldll";//dll的路径
char sysbuf[] = "add"; /过程名/
char sysbuf1[] = "sub";
LibHandle = LoadLibrary(dllbuf); /载入dll/
ProcAdd = (MYPROC)GetProcAddress(LibHandle, sysbuf); /获取函数sysbuf的地址/
ProcSub = (MYPROC)GetProcAddress(LibHandle, sysbuf1);
printf("%d\n",(ProcAdd)(3,6));
printf("%d\n",(ProcSub)(3,6));
}
编译执行便可成功。
以上就是关于VC++菜鸟问题 拖拽文件到文本框获取文件路径简单问题全部的内容,包括:VC++菜鸟问题 拖拽文件到文本框获取文件路径简单问题、vc怎样获取文件路径、C程序如何调用dll 文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)