MFC中窗口实现拖拽文件功能

MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示。


1 文件拖拽功能

实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响应拖拽消息,获取拖拽文件的绝对路径。

1将窗口注册为放置文件的目标

将窗口注册为放置文件目标的方法有两种:一种是通过MFC资源编辑器实现,另一种方法是通过代码实现。

1.1通过MFC资源编辑器实现

VS2015中创建一个基于对话框的MFC程序。接下来在VS2015的资源视图中,选择MFC程序的主对话框,然后在右侧的“属性”选项中将对话框的“Accept Files”属性设置为True,表示将对话框注册为放置拖放文件的目标,如图2所示。

 

2 修改对话框Accept Files属性

1.2通过代码实现

在对话框的OnInitDialog()函数中通过CWnd类的DragAcceptFiles()函数将对话框注册为放置拖放文件的目标。该函数的格式为

void DragAcceptFiles( BOOL bAccept = TRUE );
该函数的参数bAccept TRUE 时表示对话框接收拖拽的文件, bAccept FALSE 时表示不接受拖拽的文件。

2.文件拖拽消息的响应函数

在将窗口注册为放置文件的目标后,该窗口就可以接收文件拖拽的消息了,该消息为WM_DROPFILES

2.1 添加消息响应函数

VS2015资源管理器中选中窗口,之后在右侧的“属性”中选择“消息”,为WM_DROPFILES消息添加响应函数OnDropFiles(),如图3所示。当将文件拖拽入对话框时,OnDropFiles()函数就会被调用。

 

3 添加WM_DROPFILES消息响应函数

2.2 定义消息响应函数

OnDropFiles()函数中,获取拖拽文件的绝对路径,并在编辑框中显示出来。通过DragQueryFile()函数获取文件的绝对路径,该函数的格式为

UINT DragQueryFile(
  _In_  HDROP  hDrop,
  _In_  UINT   iFile,
  _Out_ LPTSTR lpszFile,
        UINT   cch
);
其中,参数hDrop 包含了拖拽文件的信息; iFile 指定了查询文件的索引号; lpszFile 是保存文件绝对路径的缓冲区; cch 是缓冲区的大小。如果成功获取拖拽文件的信息,则返回非零值。

在使用DragQueryFile()函数时,首先通过该函数获取拖拽文件的数量,之后遍历每个拖拽文件。一般来说,每次只拖拽一个文件。

2.2.1 获取拖拽文件的数量

通过DragQueryFile()函数获取拖拽到窗口上的文件的数量。

int count_droppedfile = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
其中,DragQueryFile() 函数的第二个参数设置为 0xFFFFFFFF -1 时,该函数的返回值即为拖拽文件的数量。

2.2.2 拖拽文件绝对路径的显示

2.2.1 获取拖拽文件的数量”中获取了拖拽文件的数量之后,接下来遍历拖拽到窗口的文件,获取文件的绝对路径,并且在窗口的Edit控件中显示出来。

(1)Edit控件添加成员变量

要想在Edit控件中显示拖拽文件的绝对路径,就要为该控件添加成员变量。如图4所示。

 

4 Edit控件添加变量

以上方法为窗口的编辑框控件添加了一个名为m_EditCtrl_FilePath的变量,该变量的类别为Control

(2)显示绝对路径

在对话框类的OnDropFiles()函数中,有如下代码

for (int i = 0; i < count_droppedfile; ++i)
{
wchar_t filepath[MAX_PATH] = { 0 };
if (DragQueryFile(hDropInfo, i, filepath, MAX_PATH)>0)
{
m_EditCtrl_FilePath.SetWindowTextW(filepath);
}
}
其中,for 循环的作用是遍历所有的拖拽文件, count_droppedfile 是在“ 2.2.1 获取拖拽文件的数量”中获取的拖拽文件数量;通过 DragQueryFile() 函数获取文件的绝对路径,并且保存在 filepath 中,最后,通过编辑框控件的变量 m_EditCtrl_FilePath 调用 SetWindowTextW() 函数将绝对路径显示出来。

实现MFC窗口的边缘拖动改变大小的功能,你可以按照以下步骤进行操作: 1. 打开你的MFC项目,并找到你想要实现拖动改变大小功能窗口的类文件(通常是CDialog或CFrameWnd的派生类)。 2. 在该类的头文件,添加一个BOOL类型的变量来标识是否正在进行拖动改变大小的操作。 ```cpp BOOL m_IsResizing; ``` 3. 在类的构造函数,初始化该变量为FALSE。 4. 打开类的消息映射表(通常在.cpp文件),找到WM_LBUTTONDOWN、WM_LBUTTONUP和WM_MOUSEMOVE消息对应的处理函数。如果没有这些消息对应的处理函数,你需要手动添加它们。 ```cpp ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ``` 5. 在消息映射表,添加上述消息的处理函数。 ```cpp void CYourWindowClass::OnLButtonDown(UINT nFlags, CPoint point) { // 检查是否在窗口边缘区域按下左键 // 这里可以根据你的需求来判断边缘区域的大小和位置 // 这里假设边缘区域为窗口的4个边界 if (point.x <= 5 || point.x >= (m_WindowWidth - 5) || point.y <= 5 || point.y >= (m_WindowHeight - 5)) { m_IsResizing = TRUE; SetCapture(); // 捕获鼠标消息 } CWnd::OnLButtonDown(nFlags, point); } void CYourWindowClass::OnLButtonUp(UINT nFlags, CPoint point) { if (m_IsResizing) { m_IsResizing = FALSE; ReleaseCapture(); // 释放鼠标消息的捕获 } CWnd::OnLButtonUp(nFlags, point); } void CYourWindowClass::OnMouseMove(UINT nFlags, CPoint point) { if (m_IsResizing) { // 在拖动过程更新窗口大小 int newWidth = point.x; int newHeight = point.y; SetWindowPos(nullptr, 0, 0, newWidth, newHeight, SWP_NOMOVE | SWP_NOZORDER); } CWnd::OnMouseMove(nFlags, point); } ``` 6. 现在,当你在窗口的边缘区域按下左键并拖动时,窗口应该会根据你的鼠标移动来改变大小。 请注意,这只是一种基本的实现方法。具体实现可能因你的项目结构和需求而有所不同。你可以根据需要调整边缘区域的判断条件和拖动的行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值