2408wtl,01用wtl的内置调整对话框类
原文
使用CDialogResize
底层
与许多其他WTL函数一样,首先在对话框类的继承列表中添加CDialogResize.
class CMainDlg : public CAxDialogImpl<CMainDlg>,public CDialogResize<CMainDlg>
在atlframe.h中声明CDialogResize.
下一步是在对话框的OnInitDialog处理器中,初化CDialogResize代码:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//初化`CDialogResize`代码DlgResize_Init();
...
}
DlgResize_Init()有一些可选参数.
接着,在对话框的消息映射中,给CDialogResize添加一个传递大小的消息的项:
BEGIN_MSG_MAP(CMainDlg)MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)...CHAIN_MSG_MAP(CDialogResize<CMainDlg>)//..
END_MSG_MAP()
最后,给对话框类添加一个列举对话框中调整哪些控件的新映射:
class CMainDlg : public CAxDialogImpl<CMainDlg>, public CDialogResize<CMainDlg>
{
...
public:BEGIN_DLGRESIZE_MAP(CMainDlg)END_DLGRESIZE_MAP()
...
};
初化CDialogResize
调用DlgResize_Init()来初化CDialogResize.原型是:
void CDialogResize::DlgResize_Init (bool bAddGripper = true,bool bUseMinTrackSize = true,DWORD dwForceStyle = WS_THICKFRAME | WS_CLIPCHILDREN );
参数:
1,bAddGripper:这控制CDialogResize是否在对话框的右下角添加大小框.真则添加大小框,假,则不添加它.
2,bUseMinTrackSize:此参数控制CDialogResize是否限制对话框的最小大小.如果为真,则禁止对话框的大小小于在资源文件中存储的其初始大小.如果你不想限制对话框的最小大小,请传递假.
3,dwForceStyle:指定要应用给对话框的窗口风格.默认值一般就足够了.
设置调整映射
对话框调整映射指示CDialogResize要移动或调整哪些控件的大小.项如下:
DLGRESIZE_CONTROL(ControlID, Flags)
ControlID是对话框控件的ID.可能标志及其含义是:
1,DLSZ_SIZE_X:在水平调整对话框时调整控件的宽度.
2,DLSZ_SIZE_Y:在垂直调整对话框时调整控件的高度.
3,DLSZ_MOVE_X:当水平调整对话框时,水平移动控件.
4,DLSZ_MOVE_Y:当垂直调整对话框时,垂直移动控件.
5,DLSZ_REPAINT:在每次移动/调整后使控件失效,这样每次都重画.
注意,不能在相同维度中,移动控件并调整其大小.如果同时指定,如DLSZ_MOVE_X和DLSZ_SIZE_X,则会忽略大小标志.
还可组合控件在一起,这样按比例移动和调整.
示例项目
根据以下规则来调整移动控件:
1,水平调整Location(位置)编辑框.
2,水平移动Go,Exit和About按钮.
3,在一组中水平调整Back(后退),Forward(前进),Stop(停止)和Refresh(刷新)按钮.
4,水平和垂直调整浏览器控件.
浏览器的OnInitDialog()函数如下初化CDialogResize:
LRESULT OnInitDialog(UINT /*`uMsg`*/, WPARAM /*`wParam`*/, LPARAM /*l参数*/, BOOL& /*b已处理*/)
{//初化`CDialogResize`代码DlgResize_Init();...
}
这使用导致添加大小框的DlgResize_Init()的默认参数.此外,对话框的大小不能小于其初始大小.
下面是列举了控件移动和调整行为的调整映射.注意新的BEGIN_DLGRESIZE_GROUP()和END_DLGRESIZE_GROUP()宏,现在一个大小调整组中放入四个浏览器控件按钮.
BEGIN_DLGRESIZE_MAP(CMainDlg)//位置编辑框DLGRESIZE_CONTROL(IDC_URL, DLSZ_SIZE_X)//"开始","退出",""按钮DLGRESIZE_CONTROL(IDC_GO, DLSZ_MOVE_X)DLGRESIZE_CONTROL(IDC_EXIT, DLSZ_MOVE_X)DLGRESIZE_CONTROL(ID_APP_ABOUT, DLSZ_MOVE_X)//`IE`控件按钮BEGIN_DLGRESIZE_GROUP()DLGRESIZE_CONTROL(IDC_BACK, DLSZ_SIZE_X)DLGRESIZE_CONTROL(IDC_FORWARD, DLSZ_SIZE_X)DLGRESIZE_CONTROL(IDC_STOP, DLSZ_SIZE_X)DLGRESIZE_CONTROL(IDC_REFRESH, DLSZ_SIZE_X)END_DLGRESIZE_GROUP()//`WebBrowser`控件DLGRESIZE_CONTROL(IDC_BROWSER, DLSZ_SIZE_X|DLSZ_SIZE_Y)
END_DLGRESIZE_MAP()
注意,编辑框更宽,浏览器控件更宽,更高.
如果要移动而不是调整按钮,它们的位置分布总是均匀.注意,组中的所有控件都应有相同DLSZ_*标志.
CDialogResize的问题
这样初化CMainDlg对象:
int nRet;{CMainDlg dlgMain;nRet = dlgMain.DoModal();}
