65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义“浏览文件夹”对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.47/5 (12投票s)

2003年4月21日

2分钟阅读

viewsIcon

133942

downloadIcon

4024

这个程序通过几行代码自定义了“浏览文件夹”对话框...

Sample Image - Customize_FolderDialog_1.jpg

引言

我正在使用 WIN32 API,并且我意识到在使用“浏览文件夹”对话框时,没有显示完整路径。因此,我编写了这个程序。

它是如何工作的?

这段代码完全基于 win32 API。我使用基本函数来实现此功能,我们逐一讨论它们...

逻辑

这个程序使用了简单的 win32 API 函数调用,例如 FindWindowExCreateWindow 等。通过这些函数,我们可以创建编辑框和静态控件。CreateWindowEx 函数用于创建子控件,即一个编辑框和一个静态控件。然后将其添加到“浏览文件夹”对话框中。

代码

首先,将 lpofn 声明到 BorwseCallbackProc 过程。然后,当“浏览文件夹”对话框初始化时,它会向该过程发送消息“BFFM_INITIALIZED”。这时,创建编辑框和静态控件如下...

//Create the edit and static control on the dialog box
edit=CreateWindowEx(0,"EDIT","Yogesh M Joshi.",WS_CHILD|WS_VISIBLE|WS_BORDER|
   ES_AUTOHSCROLL,0,100,100,50,hwnd,0,ghInstance,NULL);
HWND caption=CreateWindowEx(0,"STATIC","You have selected the folder :",
   WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,0,100,100,50,hwnd,0,ghInstance,NULL);

这里 ghInstance 是对话框的实例。“EDIT”和“STATIC”是类名。标志设置控件的样式。然后,我们需要调整列表视图控件的大小,但首先需要在“浏览文件夹”对话框中找到它,这很简单,只需使用 FindWindowEx 函数即可。

HWND ListView=FindWindowEx(hwnd,NULL,"SysTreeView32",NULL);

这样,我们找到了列表视图的句柄,然后调整其大小。使用 GetWindowRect 函数获取“浏览文件夹”对话框的矩形。这将以以下方式进行...

//Gets the dimentions of the windows
GetWindowRect(hwnd,&Dialog);
GetWindowRect(ListView,&ListViewRect);

//Sets the listview controls dimentions
SetWindowPos(ListView,0,(ListViewRect.left-Dialog.left),
            (ListViewRect.top-Dialog.top )-20,290,170,0);
//Sets the window positions of edit and dialog controls
SetWindowPos(edit,HWND_BOTTOM,(ListViewRect.left-Dialog.left),
            (ListViewRect.top-Dialog.top )+170,290,20,SWP_SHOWWINDOW);
SetWindowPos(caption,HWND_BOTTOM,(ListViewRect.left-Dialog.left),
            (ListViewRect.top-Dialog.top )+152,290,16,SWP_SHOWWINDOW);

然后,我使用了 SetFont 函数来设置静态控件和编辑控件的字体。

//This will set the font of the controls
void SetFont(HWND hwnd,LPTSTR FontName,int FontSize)
{
    
    HFONT hf;
    LOGFONT lf={0};
    HDC hdc=GetDC(hwnd);
    
    GetObject(GetWindowFont(hwnd),sizeof(lf),&lf);
    lf.lfWeight = FW_REGULAR;
    lf.lfHeight = (LONG)FontSize;
    lstrcpy( lf.lfFaceName, FontName );
    hf=CreateFontIndirect(&lf);
    SetBkMode(hdc,OPAQUE);
    SendMessage(hwnd,WM_SETFONT,(WPARAM)hf,TRUE);
    ReleaseDC(hwnd,hdc);
   
}

这样,我们调整了控件的大小。但主要的事情还没有结束,如果选择任何文件夹,编辑控件必须显示它。为此,使用回调消息“BFFM_SELCHANGED”并使用 SetWindowText API 设置编辑控件的文本。

//Selection change message
if(uMsg==BFFM_SELCHANGED)
{
    t = SHGetPathFromIDList((ITEMIDLIST*)lParam, c);

    //Sets the text of the edit control to the current folder
    SetWindowText(edit,c);
        
}

就这样,我们可以自定义“浏览文件夹”对话框了。

结论

此代码仅用于教育目的。请将您的评论发送至:yogmj@hotmail.com,并访问我的主页 http://www.stechome.netfirms.com/ 以获取一些很酷的 Windows 实用程序。我期待您的来信。

© . All rights reserved.