WTL中提供了对话框调整支持,能够指定对话框窗口在发生大小改变时控件相对主窗口的大小和位置变化。VisualFC的WTL类向导对这一机制具有良好的支持,代替手工编码操作。事例如下:
在VC中新建一WTL对话框应用程序。打开资源编辑器,将IDD_DIALOG的Border属性改为Resizing。新建的对话框窗口默认有三个按钮"OK,Cancel,About",我们再在左面添加一个"Edit"窗口,切换回类视图查看,选择CMainDlg类,点击VFC工具栏上的"WTL ClassWizard"按钮启动WTL类向导,选择WTL Resize控制页面,上面列表为控件ID显示,下面列表为加入了DialogResize控制的控件显示。选择控件列表中IDOK,点击Add Resize编辑Resize属性,选择DLSZ_MOVE_X,按确认,将在下面的Resize列表中显示”IDOK DLSZ_MOVE_X"项。接下来添加IDCANCEL的Resize属性为DLSZ_MVOE_X,添加ID_APP_ABOUT的Resize属性为DLSZ_MOVE_X和DLSZ_MOVE_Y,添加IDC_EDIT1的Reisze属性为DLSZ_SIZE_X和DLSZ_SIZE_Y,最后按“OK”确认将自动在CMainDlg类中添加以下语句。
BEGIN_DLGRESIZE_MAP(CMainDlg)
DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X)
DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X)
DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X
|
DLSZ_MOVE_Y)
DLGRESIZE_CONTROL(IDC_EDIT1, DLSZ_SIZE_X
|
DLSZ_SIZE_Y)
END_DLGRESIZE_MAP()
接下来我们在需要在CMainDlg类中手工加入继承支持、消息链接表和在InitDialog中的初始控制。
class
CMainDlg :
public
CDialogImpl
<
CMainDlg
>
,
public
CUpdateUI
<
CMainDlg
>
,
public
CMessageFilter,
public
CIdleHandler,
public
CDialogResize
<
CMainDlg
>
//
我们手工加入的DialogResize继承支持

...
{
。。。。
BEGIN_DLGRESIZE_MAP(CMainDlg)
DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X)
DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X)
DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL(IDC_EDIT1, DLSZ_SIZE_X | DLSZ_SIZE_Y)
END_DLGRESIZE_MAP()
。。。。
BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
CHAIN_MSG_MAP(CDialogResize<CMainDlg>) //我们手工加入的消息链接
END_MSG_MAP()

LRESULT OnInitDialog(UINT /**//*uMsg*/, WPARAM /**//*wParam*/, LPARAM /**//*lParam*/, BOOL& /**//*bHandled*/)

...{
。。。。
DlgResize_Init(true,true); //我们手工初始DialogResize控制
return TRUE;
}



。。。。
}
;
现在我们编译将生成能够在窗口大小发生改变时自动调整控件大小和位置的对话框应用程序。看起来并没有什么,使用VFC的WTL类向导后我们仍需手工添加部分代码,但这个对话框只有四个控件,如果你的对话框拥有更多的控件以后你会发现使用VFC的WTL类向导编辑对话框控件的Resize属性将会节省你在这方面上的许多的时间,试试看吧。