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

WTL 向导风格的 CPropertySheet 可调整大小的视图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (3投票s)

2002年4月11日

2分钟阅读

viewsIcon

71091

downloadIcon

2449

如何将 WTL 的 CPropertySheet 实现用作向导风格的可调整大小的视图,而不是模态或无模态对话框。

CPropertySheet Wizard Sample Image

CPropertySheet WizardSample Image


引言

本文档描述了如何使用 WTL 的 CPropertySheetImpl 模板作为向导式可调整大小的属性表视图。有关可调整大小的属性表如何运作的背景信息,请参阅配套文章 "WTL CPropertySheet 作为可调整大小的视图"。

属性表

向导式属性表类 CWizView 提供了一个 Wizard 97 样式的属性表。Wizard 97 样式提供了两个静态控件作为分隔符,并支持在标题部分中显示位图图像。CWizView 还支持较旧的向导样式,该样式在属性页和向导按钮之间提供一个静态控件作为分隔符。静态控件 ID 如下所示。

// lower static control, visible in WIZARD and WIZARD97 styles

#define ATL_IDC_STATIC1 0x3026
// upper static control, visible in WIZARD97 style only

#define ATL_IDC_STATIC2 0x3027

我们使用较低静态控件的位置来设置属性页的高度。所有向导按钮、两个静态控件和属性表选项卡控件都添加到属性表对话框的调整大小映射中,如下所示。请注意 MOVE 和 SIZE 的各种组合,这些对于调整大小机制的正常运行非常重要。此外,选项卡控件必须放在最后,因为它控制着属性页的大小和位置。

BEGIN_DLGRESIZE_MAP(CWizView)
  DLGRESIZE_CONTROL(ID_WIZBACK, DLSZ_MOVE_X | DLSZ_MOVE_Y)
  DLGRESIZE_CONTROL(ID_WIZNEXT, DLSZ_MOVE_X | DLSZ_MOVE_Y)
  DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y)
  DLGRESIZE_CONTROL(ID_WIZFINISH, DLSZ_MOVE_X | DLSZ_MOVE_Y)
  DLGRESIZE_CONTROL(ATL_IDC_STATIC1, DLSZ_SIZE_X | DLSZ_MOVE_Y)
  DLGRESIZE_CONTROL(ATL_IDC_STATIC2, DLSZ_SIZE_X)
  DLGRESIZE_CONTROL(ATL_IDC_TAB_CONTROL, DLSZ_SIZE_X | DLSZ_MOVE_Y)
END_DLGRESIZE_MAP()

Tab Control

选项卡控件从属性表接收调整大小的消息。选项卡控件的 WM_WINDOWPOSCHANGED 消息处理程序通过调用用户定义的消息 WM_RESIZEPAGE 来调整属性页的大小。请注意此处 SendMessage() 的使用。

LRESULT OnWindowPosChanged(UINT, WPARAM, LPARAM lParam, BOOL&)
{ // get window position structure from lParam

  LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;

  // SEND resize message to ourselves with the new tab width

  ::SendMessage(m_hWnd, WM_RESIZEPAGE, 0, lpWP->cx);

  return 0; }

当属性表处于向导样式时,选项卡控件会被隐藏。要更改选项卡,"下一步"和"上一步"按钮向选项卡控件发送 TCM_SETCURSEL 消息。不幸的是,内置代码也会在每次更改选项卡时将页面重置为其原始尺寸。因此,我们处理当前选择消息以将其重置为所需的大小。请注意此处 PostMessage() 的使用。调整大小必须在选项卡更改完成后进行。

LRESULT OnSetCurSel(UINT, WPARAM, LPARAM, BOOL& bHandled)
{ // get the tab control client rect

  RECT rc;
  GetClientRect(&rc);

  // POST resize message to ourselves with the tab width

  ::PostMessage(m_hWnd, WM_RESIZEPAGE, 0, rc.right);

  // further default processing is required to handle the tab

  // change, so set bHandled to false

  bHandled = false;

  return 0; }

这个用户定义的的消息处理程序包含属性页调整大小的代码。

LRESULT OnResizePage(UINT, WPARAM, LPARAM lParam, BOOL&)
{ // initialize a property sheet variable with the parent's handle

  CWizView sheet;
  sheet.m_hWnd = GetParent();

  // lower bound for page, just above the lower static control

  RECT rc;
  CStatic st = sheet.GetDlgItem(ATL_IDC_STATIC1);
  st.GetWindowRect(&rc);
  sheet.ScreenToClient(&rc);
  int nBottom = rc.top - 15;

  // adjust lower bound if WIZARD97 style

  DWORD dwFlags = sheet.GetPshStyle();
  dwFlags |= PSH_WIZARD97;
  if (dwFlags == sheet.GetPshStyle())
    nBottom -= 60;

  // resize active property page using lParam for width and nBottom for height

  ::SetWindowPos(sheet.GetActivePage(), NULL, 0, 0, lParam, nBottom, SWP_NOMOVE);

  // release the property sheet handle since we don't own it

  sheet.m_hWnd = NULL;

  return 0; }

使用条款

与本文档一起提供的示例项目和属性表/页类是免费的。您可以随意使用它们。

本软件按“现状”分发,不提供任何形式的担保。

© . All rights reserved.