2024年2月7日发(作者:)

在VC++中定制CFileDialog

MFC为我们提供了OFileDialog的简单易用,但毕竟“千篇一律,没有性格”,在实际应用中往往需

要具有个性特色的用户界面和个性化的文件对话框。

要定制文件对话框,就必须获得对文件对话框中各个控件的控制。本文将通过一个简单的例子介绍

控制文件对话框中控件的方法。

把文件对话框的高度比一般情况扩大150个像素,并修改它的标题。

通过classwizard生成一个CFileDialog的派生类CCoolFileDialog,然后编辑

中处理WM_INITDIALOG的OnInitDialog函数。

在的开头必须加入#CoolFileDialog<dlgs.h>

BOOL CoolFileDialog::OnInitDialog()

//iExtraSize将按照你所要的确定对话框的最终尺寸

const UINT iExtraSize=150;

//要控制的文件对话框中的控件的个数

const UINT nControls=8;

//获得指向父对话框的指针

CWnd*wndDlg=GetParent();

//获得对话框的尺寸

RECT Rect;

wndDlg->GetWindowRect(&Rect);

//修改对话框的尺寸

wndDlg->GetWindowRect(&Rect);

//修改对话框的尺寸

wndDlg->SetWindowPos(NULL,0,0,

-,

-+iExtraSize,

SWP_NOMOVE);

//控件的ID在<dlgs.h>中定义

UINT Controls[nControls]={stc3,stc2,//两个label控件

edt1,cmb1,//edit控件和

//drop-down box控件

IDOK,IDCANCEL,

chx1,//check按钮

lst1//list控件

};

//获得对文件对话框中各个控件的控制,并把它们移到新的位置

for (int i=0;i<nControls ; i++)

{

CWnd *wndCtrl =wndDlg->GetDlgItem(Controls[i]);

wndCtrl->GetWindowRect(&Rect);

wndDlg->ScreenToClient(&Rect);

//根据对话框的新的尺寸移动各控件。

if (Controls[i]!=lst1)

wndCtrl->SetWindowPos(NULL,

,+iExtraSize,

0,0,SWP_NOSIZE);

else//文件列表框只改变尺寸,而不移动位置

wndCtrl->SetWindowPos(NULL,0,0,

-,

-+iExtraSize,

SWP_NOMOVE);

//设置对话框窗口的标题

wndDlg->SetWindowText(“打开——(大家好):-)”);

//Remember to call the baseclass,

returnCFileDialog::OnInitDialog();

}

程序中必须注意的问题是:

(1)如果想改变对话框中控件的尺寸、外观等属性,不能直接使用GetDlgItem()函数,因为这些控

件属于被继承的父对话框,必须通过CWnd *wndDlg=GetParent()获得父对话框的指针来实现。

(2)在头文件〈dlgs.h〉中定义的各控件的ID为:

stc3,stc2 两个label控件(“文件名”和“文件类型”);

edt1,cmb1 edit控件和drop-down box控件;

IDOK,IDCANCEL “确定”和“取消”按钮;

chx1 “以只读方式打开”check按钮;

lst1 文件列表框。

其他控件的ID也都定义在〈dlgs.h〉中。

通过wndDlg->GetDlgItem(ID)的方法获得对文件对话框中控件的控制,为文件对话框的定制提供

了相当大的自由空间。