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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (9投票s)

2005年2月22日

2分钟阅读

viewsIcon

90043

downloadIcon

1961

在进行少量修改的情况下,使属性表/向导可调整大小。

Screenshot

引言

由于我曾经用纯 C 创建了一个可调整大小的属性表实现,所以我决定也用 WTL 来做。 在实现过程中,我的目标是尽可能**保持**与 WTL 原始源代码的**接近**。 这导致了一种可以逐一替换为传统源代码的实现。

特点

  1. 可调整大小的属性表窗口类
  2. 可调整大小的属性表页面类(有关用法,请参阅 CDialogResize
  3. 可以使用 WS_EX_COMPOSITED 实现双缓冲重绘(仅限属性表窗口)
  4. 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:初始发布
© . All rights reserved.