WEB开发网
开发学院软件开发VC MFC程序员WTL指南(9)属性页与向导 阅读

MFC程序员WTL指南(9)属性页与向导

 2008-01-19 20:26:45 来源:WEB开发网   
核心提示:关于这个类需要注意几点: 有一个名为IDD的公有成员将对话框于资源联系起来, 消息映射链和CDialogImpl相似,MFC程序员WTL指南(9)属性页与向导(4), 消息映射链将消息链入CPropertyPageImpl,从而使我们能够处理与属性表相关的通知消息,#include "B

关于这个类需要注意几点:

  • 有一个名为IDD的公有成员将对话框于资源联系起来。
  • 消息映射链和CDialogImpl相似。
  • 消息映射链将消息链入CPropertyPageImpl,从而使我们能够处理与属性表相关的通知消息。
  • 有一个OnApply()处理函数在单击属性表中的OK按钮时保存用户的选择。

OnApply() 非常简单,它调用 DoDataExchange() 更新 DDX 变量,然后返回一个代码标识是否可以关闭这个属性表:

int CBackgroundOptsPage::OnApply()
{
   return DoDataExchange(true) ? PSNRET_NOERROR : PSNRET_INVALID;
}

我们还要在主窗口添加一个Tools|Options菜单来打开属性表,这个菜单的处理函数创建一个属性表,但是添加了一个新属性页CBackgroundOptsPage。

void CMainFrame::OnOptions ( UINT uCode, int nID, HWND hwndCtrl )
{
CPropertySheet sheet ( _T("PSheets Options"), 0 );
CBackgroundOptsPage pgBackground;
CPropertyPage<IDD_ABOUTBOX> pgAbout;
   pgBackground.m_nColor = m_view.m_nColor;
   pgBackground.m_nPicture = m_view.m_nPicture;
   sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
   sheet.AddPage ( pgBackground );
   sheet.AddPage ( pgAbout );
   if ( IDOK == sheet.DoModal() )
     m_view.SetBackgroundOptions ( pgBackground.m_nColor,
                    pgBackground.m_nPicture );
}

属性表的构造函数的第二个参数是0,表示将索引是0的页面初始是可见的,你可以将其设为1,使得属性表第一次显示时显示关于页面。既然是演示代码,我就偷个懒,使用一个公有变量与CBackgroundOptsPage属性页的radio button建立关联,在主窗口中直接为其赋初始值,当用户单击属性表的OK按钮时在将其读出来。

如果用户点击OK按钮,DoModal()发挥IDOK,我们通知视图窗口使用新的图片和背景颜色。下面是几个屏幕截图显示几个不同的样式的视图:

创建一个更好的属性表类

在OnOptions()中创建属性表是个好主意,但是在这里使用很多初始化代码却非常糟糕,这不是CMainFrame应该做得事情。更好的方法是从CPropertySheetImpl派生一个新类,在这个类中完成这些任务。

#include "BackgroundOptsPage.h"
class CAppPropertySheet : public CPropertySheetImpl<CAppPropertySheet>
{
public:
   // Construction
   CAppPropertySheet ( _U_STRINGorID title = (LPCTSTR) NULL,
             UINT uStartPage = 0, HWND hWndParent = NULL );
   // Maps
   BEGIN_MSG_MAP(CAppPropertySheet)
     CHAIN_MSG_MAP(CPropertySheetImpl<CAppPropertySheet>)
   END_MSG_MAP()
   // Property pages
   CBackgroundOptsPage     m_pgBackground;
   CPropertyPage<IDD_ABOUTBOX> m_pgAbout;
};

我们使用这个类封装属性表中各个属性页的细节,将初始化代码移到属性表内部完成,构造函数完成添加页面,并设置其他必需的标志:

CAppPropertySheet::CAppPropertySheet ( _U_STRINGorID title, UINT uStartPage,
                    HWND hWndParent ) :
   CPropertySheetImpl<CAppPropertySheet> ( title, uStartPage, hWndParent )
{
   m_psh.dwFlags |= PSH_NOAPPLYNOW;
   AddPage ( m_pgBackground );
   AddPage ( m_pgAbout );
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接