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

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

 2008-01-19 20:26:45 来源:WEB开发网   
核心提示:OnWizardFinish()期望返回TRUE结束向导,FALSE阻止关闭向导,MFC程序员WTL指南(9)属性页与向导(3),这个方法很简陋,但是IE5的通用控件对PSN_WIZFINISH处理的返回值添加了新解释,我们将其命名为CBackgroundOptsPage,这个类是从CPropertyPageImpl类

OnWizardFinish()期望返回TRUE结束向导,FALSE阻止关闭向导。这个方法很简陋,但是IE5的通用控件对PSN_WIZFINISH处理的返回值添加了新解释,他返回需要获得焦点的窗口的句柄。WTL 3的程序将不能使用这个特性,因为它对所有非0的返回值都做相同的处理。

在WTL 7中,OnNotify() 没有改变 PSN_* 消息的返回值,处理函数返回任何文档中规定的合法数值和正确的行为。当然,为了向前兼容,WTL 3 仍然使用当前默认的工作方式,要使用WTL 7的消息处理方式,你必须在中including atldlgs.h一行之前添加一行定义:

#define _WTL_NEW_PAGE_NOTIFY_HANDLERS

编写新的代码没有理由不使用WTL 7的消息处理函数,所以这里就不介绍WTL 3的消息处理方式。

CPropertyPageImpl 为所有消息提供了默认的通知消息处理函数,你可以重载与你的程序有关的消息处理函数完成特殊的操作。默认的消息处理函数和相应的行为如下:

int OnSetActive() - 允许页面成为激活状态

BOOL OnKillActive() - 允许页面成为非激活状态

int OnApply() - 返回 PSNRET_NOERROR 表示应用操作成功完成

void OnReset() - 无相应的动作

BOOL OnQueryCancel() - 允许取消操作

int OnWizardBack() - 返回到前一个页面

int OnWizardNext() - 进行到下一个页面

INT_PTR OnWizardFinish() - 允许向导结束

void OnHelp() - 无相应的动作

BOOL OnGetObject(LPNMOBJECTNOTIFY lpObjectNotify) - 无相应的动作

int OnTranslateAccelerator(LPMSG lpMsg) - 返回 PSNRET_NOERROR 表示消息没有被处理

HWND OnQueryInitialFocus(HWND hWndFocus) - 返回 NULL 表示将按Tab Order顺序的第一个控件设为焦点状态

创建一个属性表

关于这些类的解释就全部讲完了,现在需要一个例子程序演示如何使用它们。本章的例子工程是一个简单的SDI程序,它在客户区显示一幅图片并使用一总颜色填充背景,使用的图片和颜色可以通过一个选项对话框(一个属性表)来设置,还有一个向导(稍后会介绍)。

最简单的属性表

首先用WTL的向导创建一个SDI工程,然后为关于对话框添加一个属性表。首先改变向导创建的关于对话框样式,使它用起来像个属性页。

第一步就是去除OK按钮,因为属性表不希望属性页自己关闭。在Style Tab中,将对话框样式改为Child,Thin Border,选择Title Bar,在More Styles tab,选择Disabled。

第二步(也是最后一步)是在OnAppAbout()的处理函数中创建一个属性表,我们使用非定制的CPropertySheet 和 CPropertyPage类:

LRESULT CMainFrame::OnAppAbout(...)
{
CPropertySheet sheet ( _T("About PSheets") );
CPropertyPage<IDD_ABOUTBOX> pgAbout;
   sheet.AddPage ( pgAbout );
   sheet.DoModal();
   return 0;
}

结果看起来向下面这样:

创建一个有用的属性页

并不是每一个属性表中的每一个属性页都像关于对话框这么简单,大多数属性页需要使用CPropertyPageImpl的派生类,所以我们现在就看一个这样的类。我们创建了一个新的属性页用来设置客户区背景显示的图片,它是这个样子的:

这个对话框的样式和关于页面相同,我们需要一个新类来和这个属性页协同工作,我们将其命名为CBackgroundOptsPage。这个类是从CPropertyPageImpl类派生的,它有一个CWinDataExchange来支持DDX。

class CBackgroundOptsPage :
   public CPropertyPageImpl<CBackgroundOptsPage>,
   public CWinDataExchange<CBackgroundOptsPage>
{
public:
   enum { IDD = IDD_BACKGROUND_OPTS };
   // Construction
   CBackgroundOptsPage();
   ~CBackgroundOptsPage();
   // Maps
   BEGIN_MSG_MAP(CBackgroundOptsPage)
     MSG_WM_INITDIALOG(OnInitDialog)
     CHAIN_MSG_MAP(CPropertyPageImpl<CBackgroundOptsPage>)
   END_MSG_MAP()
   BEGIN_DDX_MAP(CBackgroundOptsPage)
     DDX_RADIO(IDC_BLUE, m_nColor)
     DDX_RADIO(IDC_ALYSON, m_nPicture)
   END_DDX_MAP()
   // Message handlers
   BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam );
   // Property page notification handlers
   int OnApply();
   // DDX variables
   int m_nColor, m_nPicture;
};

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

Tags:MFC 程序员 WTL

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