CBrowseCtrl -为您的项目轻松添加文件/文件夹浏览功能

介绍 通常,当我们需要将文件/ folder-browse特性添加到项目,我们要做的很长一段花絮:首先我们必须创建一个赛迪特铬镍钨这将显示路径名,然后,我们需要创建一个CButton和处理其ON_BN_CLICKED事件启动文件对话框并复制路径名赛迪特铬镍钨。此外,如果我们想让它看起来更好,我们将不得不包括一些图标或位图资源来装饰CButton。如果我们有多个对话框,它们都需要文件/文件夹浏览功能,这可能会引起一些麻烦。 我一直在想,如果在MFC中有这样一个控件就好了,它集成了一个CEdit和一个CButton,处理控制事件,弹出CFileDialog,自动更新CEdit文本。如果这个控件有一些内置的图像,那就更好了,也就是说,它有自己的绘图功能,而不需要我们提供任何图像资源给它。当然,有些工具提示也无伤大雅……不幸的是,在MFC中没有这样的控制,但幸运的是,我们总是可以自己做。 CBrowseCtrl正是为了满足我在上述段落中所描述的需要而制定的。它来自CButton,有一个编辑框,一个浏览按钮和一个工具提示。它还可以在browse按钮上绘制一些内置图像,因此您不需要为该控件包含任何图标或位图资源。它自己处理按钮事件,所以每当用户点击浏览按钮,一个文件/文件夹对话框弹出。 如何使用 您需要首先将源文件BrowseCtrl.h和BrowseCtrl.cpp添加到您的工作空间,并在需要的地方包括BrowseCtrl.h。要创建控件,您可以使用CBrowseCtrl:: create来在运行时创建控件,或者在对话框模板上绘制一个CButton,并将其与CBrowseCtrl变量绑定。 代码示例 指定控制方式 您可以随时访问控件样式以更改其外观和行为。可以使用“|”操作符组合多个样式标志。有效的样式标志是: 国旗影响bc_ctl_allowedit允许用户输入editbox bc_ctl_foldersonly浏览文件夹而不是文件bc_btn_left显示browse按钮的左侧editbox bc_btn_flat使用平按钮样式bc_btn_icon使用图标,没有文本将显示bc_ico_arrowfolder arrow-folder图标,必须结合bc_btn_icon bc_ico_folder文件夹图标,bc_ico_explorer的Windows资源管理器图标,必须与BC_BTN_ICON结合 要设置浏览按钮上的“Windows资源管理器”图标,将按钮设置为平面,最后,将控件设置为“浏览文件夹”: 隐藏,复制Code

DWORD dwStyle = m_wndBrowseCtrl.GetButtonStyle();
dwStyle |= BC_BTN_ICON; // Make sure to display icon instead of text
dwStyle |= BC_BTN_FLAT; // Flat button
dwStyle &= ~BC_ICO_ARROWFOLDER; // Remove other icons
dwStyle &= ~BC_ICO_FOLDER;
dwStyle |= BC_ICO_EXPLORER; // Set the explorer icon
dwStyle |= BC_CTL_FOLDERSONLY; // Browse for folders only
m_wndBrowseCtrl.SetButtonStyle(dwStyle); // Apply

我已经厌倦了图片,想要浏览按钮显示文本,说,“点击我!”,也让它显示工具提示“点击浏览你的文件。 隐藏,复制Code

m_wndBrowseCtrl.SetButtonStyle(m_wndBrowseCtrl.GetButtonStyle() & ~BC_BTN_ICON);
m_wndBrowseCtrl.SetButtonText(_T("Click Me!"));
m_wndBrowseCtrl.SetTooltipText(_T("Click to browse your files."));

浏览文件和文件夹 CBrowseCtrl自行处理按钮事件,因此每当用户点击浏览按钮时,一个文件或文件夹对话框就会自动弹出。当然,您也可以在代码中编程地处理它,通常您可能希望使用传入CFileDialog构造函数的内容初始化文件对话框。CBrowseCtrl提供了一组函数来允许做相同的初始化,你基本上可以把控件当作一个对话框: 隐藏,复制Code

m_wndBrowseCtrl.SetOpenSave(TRUE); // TRUE-"open", FALSE-"save as"
m_wndBrowseCtrl.SetDefExt(NULL); // Do not use any default extension
m_wndBrowseCtrl.SetFilter(_T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"));
m_wndBrowseCtrl.SetFileFlags(OFN_FILEMUSTEXIST | OFN_HIDEREADONLY);
m_wndBrowseCtrl.SetPathName(_T("c:\\MyApp\
eadme.txt"
)); // default path if (m_wndBrowseCtrl.DoModal() == IDOK) MessageBox(m_wndBrowseCtrl.GetPathName());

浏览文件夹: 隐藏,复制Code

m_wndBrowseCtrl.SetButtonStyle(m_wndBrowseCtrl.GetButtonStyle() 
                                            | BC_CTL_FOLDERSONLY);
// Display an editbox on the dialog
m_wndBrowseCtrl.SetFolderFlags(BIF_EDITBOX); 
m_wndBrowseCtrl.SetFolderDialogTitle(_T("Please select a folder"));

if (m_wndBrowseCtrl.DoModal() == IDOK)
    MessageBox(m_wndBrowseCtrl.GetPathName());

如果用户从文件对话框中选择了多个文件,则可以通过以下代码遍历所有路径名: 隐藏,复制Code

if (m_wndBrowseCtrl.GetSelectedCount() > 1)// Multiple files selected
{
    POSITION pos = m_wndBrowseCtrl.GetStartPosition();
    while (pos != NULL)
    {
        CString sPathName = m_wndBrowseCtrl.GetNextPathName(pos);
        // Process the path name...
    }
}

通知父窗口 在用户关闭文件/文件夹对话框后,一个通知消息被发送到父窗口。wParam是IDOK或IDCANCEL, lParam是指向CBrowseCtrl对象的指针。 要使控件通知父窗口,您需要提供CBrowseCtrl,这是一个大于0的自定义窗口消息。如果您提供的消息为0,则不会发送该消息。如果您不提供任何消息,也不会发送任何消息。 隐藏,复制Code

#define WM_BROWSE_NOTIFY WM_APP + 100
m_wndBrowseCtrl.SetNotifyMessageID(WM_BROWSE_NOTIFY);
// Now ready to receive the notification!

结论 就是这样。这是一个很好的小控件,我希望它能在某些情况下帮助你。欢迎提出任何建议,谢谢您的时间。 历史 2004年1月, 最初版本 2004年1月09年, 改进了绘图功能,以正确处理控制客户区域太小而无法绘制的情况。在调试模式下,它将提供一个消息框来通知开发人员这个问题。改进了编辑框,使其在接收和丢失输入焦点时能够更好地工作 2004年1月10日 修正了编辑框在某些事件时不能正确重绘的问题。感谢john11添加的方法CBrowseCtrl::GetSelectedCount,它返回用户在最近的文件/中选择的项目数量被idok终止的文件夹对话框改进了鼠标/焦点事件监控功能,修正了用户点击编辑框边缘时可能出现的绘图故障,改变了绘制区域计算性能改进方法,更新了源代码和演示项目 2004年1月14日, 更新后的SetPathName和GetPathName成员函数修改了消息发送方法,因此lParam现在是这个CBrowseCtrl对象的指针,从而更新了源代码和演示项目 2004年1月22日 增加了监视设置BC_CTL_ALLOWEDIT时用户是否手动更改编辑框内容的方法,GetPathName的返回值也会受到适当影响。现在可以通过调用SetDialogTitle和GetDialogTitle来访问文件/文件夹对话框的窗口标题。现在可以通过调用SetDialogBanner和GetDialogBanner访问文件夹对话框的横幅文本。添加了ModifyButtonStyle方法,允许方便地更改样式 2004年2月07 改进了绘图功能,如果没有足够的空间,浏览按钮上的图像/文本可以部分绘制。 2004年5月22日, 新增函数:GetDriveLetter, GetDirectory, GetFileName, GetFileTitle, GetFileExt 许可证 本文没有附带明确的许可,但可能包含文章文本或下载文件本身的使用条款。如果有疑问,请通过下面的讨论区联系作者。 可以在这里找到作者可能使用的许可证列表。 本文转载于:http://www.diyabc.com/frontweb/news454.html

posted @ 2020-08-07 03:13  Dincat  阅读(215)  评论(0编辑  收藏  举报