VC编程小技巧之属性页

1.属性页的添加:

创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:

m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);

   //使选项卡的按钮在下面

   if(m_tabsheet.m_hWnd)

   m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡

//加入标签,标签名由各个子对话框的标题栏决定

   m_tabsheet.AddPage(&m_skatch);

   //Create来创建一个属性

   m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);

  

RECT rect;

   m_tabsheet.GetWindowRect(&rect);

   int width = rect.right - rect.left;

   int height = rect.bottom - rect.top;

  

   //调整属性页的大小和位置

   m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);

属性页的添加完成。如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1)

    m_tabsheet.AddPage(&m_skatch2)

. . . . . .

 

2.更改属性页标题

void CProSheet::SetPageTitle(int nPage, int nImage, CString strTitle)

{

  TC_ITEM item;

  //item.mask = TCIF_TEXT|TCIF_IMAGE;    //设置图标+文字

  item.mask = TCIF_IMAGE;        //只设置图标

  item.iImage = nImage;

// item.pszText = strTitle.GetBuffer(0);    //设置文字

  GetTabControl ()->SetItem (nPage, &item);

//要设置文字时就将上面2行有注释符的代码前的注释符去掉

}

 

3.属性页处理通知消息

CPropertyPageImpl有一个消息映射处理WM_NOTIFY。如果通知代码是PSN_*的值,OnNotify()就会调用相应的通知处理函数。这使用了编译阶段虚函数机制,从而使得派生类能非常容易的重载这些处理函数

由于WTL 3WTL 7设计的改动,从而存在两套不同的通知处理机制。在WTL 3中通知处理函数返回的值和PSN_*消息的返回值不同,例如,WTL 3是这样处理PSN_WIZFINISH的:

case PSN_WIZFINISH:
lResult = !pT->OnWizardFinish();
break;

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顺序的第一个控件设为焦点状态

 

4.属性页标题改名

我用CPropertySheet创建属性,用的CPropertyPage对象只有一个,也就是每个属性页的内容相同.目前的问题是:这样每个属性页的标题都是相同的,是对话框的标题!怎样动态的改动这个标题,使每个属性页的标签的名称都不同??


CTabCtrl * pCtrl = pSheet->GetTabControl();
TCITEM tc;
tc.mask = TCIF_TEXT;
tc.pszText = "新标题";
pCtrl->SetItem(0,&tc);//0即是你要改的TAb的索引

 

5.怎样去掉属性页的ApplyHelp按钮?

//去掉Help
    m_psh.dwFlags |= PSH_HASHELP ;
    m_psh.dwFlags &= ~PSH_HASHELP ;

//除掉应用按钮  m_psh.dwFlags|=PSH_NOAPPLYNOW;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值