积累的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 3和WTL 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.怎样去掉属性页的Apply与Help按钮?
//去掉Help
m_psh.dwFlags |= PSH_HASHELP ;
m_psh.dwFlags = ~PSH_HASHELP ;
在我介绍我的交互设计思考流程之前,我希望先说两个交互设计中设计师新手们常犯的错误,设计走进死胡同往往正是因为: 1.把设计当模仿。 我不是说参考优秀竞品不对。
p span "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/245497">
积累的VC编程小技巧之对话框 1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) { //一句话解决问题 SendMessage(WM_SYSCOMMAND,0xF012,0); CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理。
相关文章
- asp.net的aspx文件里的page指令属性_c#的page指令_.net的page指令_aspx的page指令
- 为SQL Server表中的列添加/修改/删除注释属性sp_addextendedproperty、sp_updateextendedproperty、sp_dropextendedproperty
- 精通Android自定义View(五)自定义属性值使用详情
- python字典类型转为对象类型,用点访问属性
- 第107章 属性关键字 - ReadOnly
- Vue - $route matched 属性实现面包屑导航
- Cookie 的 SameSite 属性(转载)
- Hello_IOS ios开发transform属性
- 线程属性--十分重要的概念
- Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别
- jqGrid配置属性说明
- mysql建表以及列属性
- CSS属性:定位属性(图文详解)
- JS魔法堂:属性、特性,傻傻分不清楚
- 实例详解 EJB 中的六大事务传播属性--转
- 学习笔记(17):Python网络编程&并发编程-Process对象的其他属性或方法