使用 CDialogResize 的可调整大小的属性表/向导






4.27/5 (9投票s)
2005年2月22日
2分钟阅读

90043

1961
在进行少量修改的情况下,使属性表/向导可调整大小。
引言
由于我曾经用纯 C 创建了一个可调整大小的属性表实现,所以我决定也用 WTL 来做。 在实现过程中,我的目标是尽可能**保持**与 WTL 原始源代码的**接近**。 这导致了一种可以逐一替换为传统源代码的实现。
特点
- 可调整大小的属性表窗口类
- 可调整大小的属性表页面类(有关用法,请参阅
CDialogResize
) - 可以使用
WS_EX_COMPOSITED
实现双缓冲重绘(仅限属性表窗口) CDialogResize
扩展名为CDialogResizeDynamic
,用于支持运行时调整大小映射操作
背景
由于属性表类实现了向导(97)样式的对话框和默认属性表,并且我想从 CDialogResize
派生我的新类,因此我被迫创建 WTL 修改。
我决定使用动态实现代替使用静态 GetDlgResizeMap()
,以支持运行时调整大小操作。 我从 CDialogResize
派生了一个新类,并添加了用于添加和删除调整大小映射条目的方法。
BEGIN_DLGRESIZE_MAP_EX(CResizablePropertySheetImpl)
DLGRESIZE_CONTROL_EX(ID_PSHEET_OK, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL_EX(ID_PSHEET_APPLY, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL_EX(ID_PSHEET_CANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL_EX(ID_PSHEET_HELP, DLSZ_MOVE_X | DLSZ_MOVE_Y)
DLGRESIZE_CONTROL_EX(ID_PSHEET_TAB, DLSZ_SIZE_X | DLSZ_SIZE_Y)
END_DLGRESIZE_MAP_EX()
上面的声明将被评估为
void StaticResizeMap() {
InitialMap.Add(ID_PSHEET_OK, DLSZ_MOVE_X | DLSZ_MOVE_Y);
...
InitialMap.Add(ID_PSHEET_TAB, DLSZ_SIZE_X | DLSZ_SIZE_Y);
InitialMap.Add(-1, 0);
}
请注意,使用旧的 BEGIN_DLGRESIZE_MAP
没有效果,将被忽略。 StaticResizeMap
方法将在 CDialogResizeDynamic
构造函数中调用。
使用代码
您无需对现有源代码进行太多修改。 您需要将 CPropertySheetImpl
替换为 CResizablePropertySheetImpl
class CMyPropertySheet :
public CResizablePropertySheetImpl<CMyPropertySheet> {
public:
CMyPropertySheet(ATL::_U_STRINGorID title = (LPCTSTR) NULL,
UINT uStartPage = 0, HWND hWndParent = NULL,
bool EnableDoubleBuffering = false, bool IsWizard = false)
: CResizablePropertySheetImpl<CMyPropertySheet>(title,
uStartPage, hWndParent, EnableDoubleBuffering, IsWizard) {
}
...
如您所见,构造函数扩展了两个额外的参数。 EnableDoubleBuffering
将启用双缓冲(无闪烁),顾名思义。 IsWizard
将创建一个向导样式的属性表。 但是,您应该谨慎使用双缓冲,因为它可能会降低渲染速度,并在某些情况下导致不可预测的行为。
class CMyResizablePropertyPage :
public CResizablePropertyPageImpl<CMyResizablePropertyPage> {
public:
enum { IDD = IDD_0 };
CMyResizablePropertyPage(ATL::_U_STRINGorID title = (LPCTSTR) NULL,
bool IsExterior = false) :
CResizablePropertyPageImpl<CMyResizablePropertyPage>(title,
IsExterior) {
}
...
如您所见,我扩展了属性页构造函数。 如果 IsExterior
为 true,则将创建一个外部页面,即通常用于欢迎和完成页面的页面。
要添加、删除或更改运行时调整大小映射项,可以使用新的 CDialogResizeDynamic
方法之一
void AddToResizeMap(int ControlId, DWORD ResizeFlags);
void RemoveFromResizeMap(int ControlId);
void ChangeResizeMapEntry(int ControlId, DWORD ResizeFlags);
在调用 DlgResize_Init
之后添加新的调整大小映射组目前是不可能的。
历史
- 2007/03/07:添加了一些扩展,调整大小映射现在是动态的。
- 2004/02/24:初始发布