向导对话框[转]

2023-05-16

很久以前在网上看到的一片文章,忘了是谁写的了,觉得很好,所以在这里转载。

首先要了解的是CPropertySheet实际上是由一个TabCtrl加多个Page和多个按钮组成
这里强调一点,DoModal的时候并没有把所有的PAGE都创建出来,只有在SetActivePage的时候才创建
所以如果你初始化的代码在OnInitDialog,那么刚开始最好先用SetActivePage切换一下

在讲述之前,大家可以先看看《深入浅出CPropertySheet》(翻译的不错)
http://www.vckbase.com/document/viewdoc/?id=427
其实原文后面还有一个例子,不过原理上帖中也表现出来了,就是窗口的移动MoveWindow和HeaderCtrl的创建等
参见 http://www.codeguru.com/Cpp/controls/propertysheet/article.php/c3973/
所以在此一些简单按钮的隐藏和移动及其Enable使能就不多说了

一、布局修改
a.修改字体
重载OnInitDialog,CreateFont创建字体pFont
SendMessageToDescendants(WM_SETFONT, (WPARAM)pFont->GetSafeHandle(), TRUE);
如果字体的改变(如高度、宽度)可能需要改变控件的位置,这样看起来才和谐一点,参见
Prpfont.exe sample demonstrates how to set the desired font for your CPropertyPages in Visual C++
http://support.microsoft.com/default.aspx?scid=kb;en-us;142170

b.设置初始的焦点
GetPage(0)->SetModified ();//使应用按钮有效
SendMessage(DM_SETDEFID,ID_APPLY_NOW); //也可设置到自己添加的按钮中

c.改变大小Resizable(这类文章和发问比较多,所以主要帖URL,见谅)
使用ResizableLib(适用于几乎所有窗口,Dialog,PropSheet,SDI,MDI等)
http://www.codeproject.com/dialog/ResizableLib.asp
也可参看Resizable CPropertySheet
http://www.codeproject.com/property/resizableproperties.asp
http://www.codeguru.com/Cpp/controls/propertysheet/sizing/article.php/c599/
运行期间动态进行调整大小,避免切换后又恢复原来大小,参见
http://support.microsoft.com/default.aspx?scid=kb;en-us;143291

注:如果自己在OnInitDialog做MoveWindow的时候要记住代码放到CPropertySheet::OnInitDialog();后

d.向导方式
最简单的就是设置模式 SetWizardMode //注意最前和最后页的SetWizardButtons
后来添加了Wizard97 风格,主要有两块地方填充的,左边的叫WATERMARK和上部的叫HEADER
注:左边和上部一般不能同时显示,所以要想显示WATERMARK,需要在PAGE中设置PSP_HIDEHEADER风格(VC7默认才设了)

添加WIZARD97风格,同时设置对应的位图
psh.dwFlags =  PSH_WIZARD97|PSH_WATERMARK|PSH_HEADER;
psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
psh.pszbmHeader =    MAKEINTRESOURCE(IDB_BANNER);

如果要HEADER中显示文本TITLE也可设置PSP_USEHEADERTITLE和PSP_USEHEADERSUBTITLE,如
psp.dwFlags =           PSP_DEFAULT|PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE;
psp.pszHeaderTitle =    MAKEINTRESOURCE(IDS_TITLE1);
psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_SUBTITLE1);

更多的详情有兴趣的可自行搜索,如6.0版本中PROPSHEETPAGE新添的hActCtx等,在此点到为止

e.内嵌入对话框中和Modeless
ps.Create(this);//如果要内嵌添加,WS_CHILD|WS_VISIBLE
ps.ShowWindow(SW_SHOW);
但这时候出来的是没有标准按钮,想要添加可重载OnInitDialog
BOOL CMySheet::OnInitDialog()
{
   m_bModeless = FALSE;
   m_nFlags |= WF_CONTINUEMODAL;

   BOOL bResult = CPropertySheet::OnInitDialog();

   m_bModeless = TRUE;
   m_nFlags &= ~WF_CONTINUEMODAL;
   return bResult;
}
P.S.焦点切换后子属性框(modeless)僵死,请在OnInitDialog中添加
ModifyStyleEx(0,WS_EX_CONTROLPARENT);

二、标签TabCtrl的操作
a.修改Text
有三种方法
m_pPage1=newCPage1(IDS_MYCAPTION);//idofstringresource

m_pPage1->m_psp.dwFlags|=PSP_USETITLE;
m_pPage1->m_psp.pszTitle=_T("MyCaption");

运行时也可修改标签
TC_ITEM ti;
ti.mask=TCIF_TEXT;
ti.pszText=pszText;
VERIFY(GetTabControl()->SetItem(nPage,&ti));

b.Tab使用Scrollbar而不是用多行
EnableStackedTabs(FALSE);即可,原理就是GetTabControl()->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE)


c.如何调整标签位置(下面或者左右)一般自画,参考:
http://www.codeguru.com/Cpp/controls/controls/tabcontrols/article.php/c6385/

d.Disable Tab中如果要重画TabItem使其看起来灰化,也可以看Paul的CTabCtrlWithDisable
http://www.microsoft.com/msj/0398/c0398.aspx

e.CPropertySheet页中的标题栏中显示指定数量的属性页,如:标题栏要求每行显示5个属性页
可使用 MutliRowTabView 参见 http://www.codeguru.com/Cpp/controls/propertysheet/article.php/c623/

三、消息的响应
a.获得CPropertySheet的WM_CLOSE消息
http://dev.csdn.net/develop/article/35/35982.shtm比较简便地实现了此功能,
但需要覆盖每个属性页的OnApply函数,且不利于宏观同步未完成的任务.
现提供一个通过覆盖CMyPropertySheet类的OnCommand函数实现此功能的方法.
OnCommand的实现代码如下:
BOOL CMyPropertySheet::OnCommand(WPARA MwParam,LPARAM lParam)

b.NOTIFY的响应 如:Disable 某个TAB
BOOL CMySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
   {
       NMHDR* pnmh = (NMHDR*)lParam;
       // tab is about to change
       if (TCN_SELCHANGING == pnmh->code)
           // save the current page index
           m_nLastActive = GetActiveIndex ();
       // tab has been changed
       else if (TCN_SELCHANGE == pnmh->code)
       {
           // get the current page index
           int nCurrentPage = GetActiveIndex ();
           // if current page is in our map of disabled pages
           if (m_DisabledPages.Lookup (nCurrentPage, nCurrentPage))
           // activate the previous page
           PostMessage (PSM_SETCURSEL, m_nLastActive);
       }
       return CPropertySheet::OnNotify(wParam, lParam, pResult);
   }

c.如何响应上下文帮助  
Title Bar添加问号(?)按钮的响应:添加WN_HELP响应
ON_WM_HELPINFO()//添加函数BOOL OnHelpInfo(HELPINFO*)
如果响应底部的帮助按钮(原理:一般按钮的点击映射)
ON_COMMAND(IDHELP, OnHelp)//添加函数BOOL OnHelp()


将标签对话框作为一个控件在对话框中实现也是现在比较常见的用户界面,见图5实现的示例。通过它可以将几个不同的模块在一个界面中同用户交互来实现功能,简洁明快和设置手段集中是它的特点。实现的方法简述如下:

①完成标签对话框中标签页的设计,这里我们举例有三个标签页,分别为CPage1、 CPage2和CPage3三个CPropertyPage的派生类;

②在项目中新建一个将包含标签对话框控件的对话框模版,相应的对话框派生类为CDlg,在该模版中加入除标签对话框外的其他控件,布局要考虑清楚。

③在对话框中希望出现标签对话框的位置上放置一个Picture控件,资源ID命名为IDC_STATICPIC,其type为Frame,其余的取缺省值;该Picture控件的尺寸是与前面设计好的标签页的大小有关,经验的方法可以做:找到最大的标签页,在其上放置一个覆盖全部控件域的Picture控件,考察它的Width和Height,前面提到的IDC_STATICPIC的高度与Height近似,宽度比Width略小;当然这里只是一个指导性的方法,具体的Width和Height应该视情况在程序中进行调整,方能做到结果满意。

④在CDlg类中加入下列公有成员数据:

public:

CPropertySheet m_sheet;

CPage1 m_page1;

CPage2 m_page2;

CPage3 m_page3;

⑤在CDlg类中重载WM_INITDIALOG消息的处理函数OnInitDialog,加入下面的代码:

// TODO: Add extra initialization here

m_sheet.AddPage(&m_page1);

m_sheet.AddPage(&m_page2);

m_sheet.AddPage(&m_page3);

//创建标签对话框控件

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

//使Tab键消息有效,可以通过Tab键转移输入焦点

m_sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);

m_sheet.ModifyStyle( 0, WS_TABSTOP );

//确定标签对话框控件在对话框中出现的位置

CRect rcSheet;

GetDlgItem( IDC_STATICPIC )->GetWindowRect( &rcSheet );

ScreenToClient( &rcSheet );

m_sheet.SetWindowPos( NULL,rcSheet.left, rcSheet.top, 0, 0,

SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE );

至此工作已经完成,值得注意的是,关于标签对话框出现的位置和大小是一个相对棘手的问题,需要在编程时慢慢模索,还有要想保留在标签对话框中的设置,则需要在对话框的DoModal()返回值为IDOK时进行相应的编程。

 

转载于:https://www.cnblogs.com/Dennis-mi/articles/3392389.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向导对话框[转] 的相关文章

  • 阿里云导出raw文件如何还原查看及centos7系统密码破解

    1 Raw格式转换 1 1 格式介绍 目前阿里云ecs镜像文件的导出格式默认为 raw tar gz xff0c 解压后为 raw格式 raw为最原始的虚拟机镜像文件 xff0c vmdk是vmware Virtual Box的虚拟机镜像文
  • 5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

    综合案例2 0 ESP32拍照上传阿里云OSS 案例说明连线功能实现1 阿里云平台连接2 OSS对象存储服务3 ESP32 CAM开发环境4 代码ESP32 CAM开发板代码HaaS506开发板代码 测试数据转图片方法 案例说明 使用ESP
  • 'grep' 不是内部或外部命令,也不是可运行的程序或批处理文件

    使用 grep 来过滤 xff1a adb shell pm list packages grep qq 然后就报了 39 grep 39 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 xff0c 后来发现根本不是grep
  • 一个程序员的一生

    一个程序员的一生 作者 佚名 我在程序员的时候 xff0c 我一开始追逐这个API怎么用 xff0c 数据库SQL怎么写更优化 xff0c Dcom技术的细节 xff0c 然后我发现我写出来的产品为了符合客户 需求必须要大量修改 xff0c
  • 搭建Ubuntu Samba服务器(超简单)

    1 xff09 安装samba服务 sudo apt get install samba 2 xff09 配置samba sudo vim etc samba smb conf share comment 61 myshare path 6
  • Nginx-配置HTTPS证书(单向认证)

    目录 一 生成 CA 私钥 1 生成一个 CA 私钥 ca key 二 生成CA 的数字证书 1 生成一个 CA 的数字证书 ca crt 三 生成 server 端数字证书请求 1 生成 nginx 端的私钥 nginx key 2 生成
  • 数据结构—B+树

    1 约束 B 43 树的约束与 B 树类似 xff0c 一棵 m m m 阶 B 43 树具有如下特点 xff1a xff08 1 xff09 根节点要么是一个叶节点 xff0c 要么至少具有两个孩子节点 xff1b xff08 2 xff
  • 服务端三种方式实现单设备登录

    单设备登录 xff0c 顾名思义 xff0c 一个账号在一个app中只能在一个设备上进行登录 使用的场景例如 xff1a 账号多端登录时云存档的一致性问题 单设备登录常用的方法 xff1a 1 web端 xff0c session 43 c
  • go 管道简单入门及注意事项:管道创建,发送、接受数据,管道关闭

    1 使用make命令创建channel span class token comment 未设置缓冲区 xff0c 只能放一个 xff0c 不读取再次赋值则会阻塞 span c1 span class token operator 61 s
  • java 生成grpc调用service

    1 安装protoc 这里以mac为例 xff1a brew install automake brew install libtool brew install protobuf 检查 protoc version 2 下载protoc
  • go微服务框架Kratos简单使用总结

    Kratos是B站开源的一款go的微服务框架 xff0c 最近PS5上的 战神 诸神黄昏比较火 xff0c 主角就是奎托斯 这个框架的名字就取自他 在进行框架选型时 xff0c 对比了目前主流的很多go微服务框架 xff0c 如Zero x
  • Gradle重新安装后下载插件失败 Read timed out 问题解决

    究极大坑记录 在使用gradle进行构建kotlin项目时 xff0c 项目所用依赖版本需要同步升级gradle版本 升级gradle版本后 xff0c gradle相关插件无法下载 xff0c 反复timeout超时 症状如下 xff1a
  • Jenkins启动失败:Failed to start LSB: Jenkins Automation Server.

    启动systemctl start jenkins service提示 Job span class token keyword for span jenkins service failed because the control pro
  • 最新版 Let’s Encrypt免费证书申请步骤,保姆级教程

    最近将域名迁到了google domain xff0c 就研究了一下Let s Encrypt的域名证书配置 发现网上找到的教程在官方说明中已经废弃 xff0c 所以自己写一个流程记录一下 步骤方法官方文档见 xff1a https eff
  • git 加速代理设置,单仓库设置代理,指定仓库设置单独代理

    1 git全局设置代理 git config global https proxy http 127 0 0 1 7890 git config global https proxy https 127 0 0 1 7890 取消的命令 x
  • 软件系统设计细节,你不知道的13个实践经验!

    记录道具来源等的 source 字段时 xff0c 可以使用 xff08 类名 43 方法名 xff09 xff08 包名 43 方法名 xff09 的组合 xff0c 可以清晰地区分来源 并且可以灵活地增加新的渠道 动作 涉及金额 钱的字
  • 从typro到Obsidian

    使用了typro 3年有餘 xff0c 最近看到yukang的年終博客 xff0c 又一次提到了Obsidian這個軟件 很久沒有還編輯工具的我 xff0c 想要折騰一下 於是 馬上開始 xff01 第一步 xff0c 啥也不知道 xff0
  • C++线程

    1 创建线程 span class token macro property span class token directive hash span span class token directive keyword include s
  • OpenGPT的11种高效用法

    1 问答提示 2 解释复杂的概念 3 创作 创作需要尽可能的缩小范围 xff0c 提出具体的要求 xff0c AI会给出更好的答案 4 准备面试 5 教师教案 6 编码和集成 7 健身 8 送礼推荐 9 翻译 这个甚至不用去演示 xff0c
  • 浅析鹅鸭杀中服务端的技术实现和要点

    在朋友的介绍下 xff0c 我下载了这款游戏 由于之前玩过 Among Us xff0c 我本以为这款游戏不会达到正宗的太空狼人杀的水平 xff08 毕竟是免费的 xff09 但实际游玩后 xff0c 我被它更加丰富的设定和玩法所吸引 接下

随机推荐

  • nginx代理静态网站css解析异常

    今天在使用ecs进行部署网页时 xff0c 出现了一个问题 使用nginx代理到页面index html路径下 xff0c 同路径的资源都可以加载到 xff0c 但是却无法正确加载到页面样式 打开f12 xff0c 网络和控制台都没有资源异
  • 为什么mysql的delete操作不释放磁盘空间

    在 InnoDB 中 xff0c delete 操作并不会真的删除数据 xff0c mysql 实际上只是给要删除的数据打了标记 xff0c 标记为删除 磁盘所占空间不会变小 xff0c 即表空间并没有真正被释放 一 MySQL 删除数据几
  • docker start :FAIL Hypervisor framework fails

    mac 上启动 Docker 提示 FAIL Hypervisor framework fails 提示环境变量出错 我这台 mac 是自己攒的生产力 xff0c 由于软件是直接从旧的 mac 上迁移过来的 xff0c 我怀疑可能是系统版本
  • 在google设置静态页面 CDN加速

    一 创建bucket xff0c 设置bucket 链接 xff1a https console cloud google com storage browser 创建bucket 设置bucket公开访问 在bucket列表中 xff0c
  • Google Cloud Storage CORS跨域允许,忽略访问控制来源标头

    google storage origin https xxx com has been blocked by CORS policy No Access Control Allow Origin header is present on
  • 聊天记录存储实践

    公司的某款游戏在1月初接入微软小冰AI聊天功能 为了保存聊天记录并为后续的统计功能做好准备 xff0c 决定将聊天记录存放在服务端 最初并不清楚聊天数据量的大小以及玩家对聊天功能的使用情况 xff0c 所以采用了价格和性能相对宽容的MySQ
  • 将本地服务通过ssh代理给外部访问(如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性)

    如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性 1 外部服务器 nginx 配置 server span class token punctuation span listen localhost 80 span c
  • Go 单元测试高效实践

    敏捷开发中有一个广为人知的开发方法就是 XP xff08 极限编程 xff09 xff0c XP 提倡测试先行 xff0c 为了将以后出现 bug 的几率降到最低 xff0c 这一点与近些年流行的 TDD xff08 测试驱动开发 xff0
  • 操作系统—分段与分页

    1 地址重定位 所谓的地址重定位 xff08 也叫地址翻译 xff09 就是修改程序中的内存地址 xff0c 使得程序被载入内存后 xff0c 那些地址能够指向正确的内存空间 例如 xff0c 程序中包含 call 40 语句 xff0c
  • putty连接被拒的原因分析

    1 xff1a 检查防火墙 2 xff1a PING虚拟机 3 xff1a SSHD etc init d sshd start开启服务 4 xff1a IP字段问题 ifconfig eth0 新IP xff08 更改为字段和主机一样的I
  • Charles+Postern抓包遇到的问题(已解决)

    问题描述 Charles的代理配置和Postern的代理配置的都是正确的 xff0c 但是当在手机上打开Postern中的开启VPN时 xff0c Charles上没有任何反应 解决方法 xff1a 我在多次配置实验无果的情况下 xff08
  • 4. ROS编程入门--PID控制器

    介绍 xff1a 这篇教程是交给大家怎么在ROS里写一个PID控制器 xff0c PID控制器有三部分 比例部分 xff08 P xff09 积分部分 xff08 I xff09 微分部分 xff08 D xff09 PID的输出是这三部分
  • 6. ROS编程入门--路径跟随(Trajectory following)

    Task 本次实验才采用 Follow the carrot 算法去跟随定义好的路径 控制的目标点在机器人行走的路径上 xff0c 距离机器人是个常数距离 机器人计算自己的方向角和目标点角度之间的相差度数 控制这个差角为0 为了在探测时候能
  • 位姿矩阵求逆

    位姿矩阵求逆 位姿矩阵分析位姿矩阵求逆矩阵 为了更好的说明问题 xff0c 我们先来看一下位姿矩阵的定义 位姿矩阵分析 如下图所示 xff1a 如果在B坐标系下有一点PB xff0c 我们需要知道该点在坐标系A下的坐标PA xff0c 怎么
  • UNIX环境高级编程

    环境配置 1 下载apue 3e文件夹 xff0c 可以通过http www apuebook com code3e html现在源码 2 解压后执行进入apue 3e中执行make指令 如果出现 96 96 96 collect2 err
  • C#连接SQL Server 数据库

    C 是如何跟SQL Server进行连接的 xff1f 在C NET程序设计中 xff0c 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 xff0c ADO NET还可以访问Oracle数
  • 冒烟测试和回归测试的区别

    每次新的版本出来的时候 xff0c 老大就让我们 冒烟 虽然不知道冒烟测试的含义 xff0c 但由于没有给用例 xff0c 我就随便跑跑 跑完冒烟后 xff0c 老大就让做 回归测试 xff0c 把bug回归掉 但是其实对2个概念还是不太理
  • Webpack——02——打包html资源

    1 在src中创建webpack的入口文件index js xff0c index html 2 src的同级目录下创建webpack config js 3 下载插件html webpack plugin 老规矩 初始化 xff0c 下w
  • AT&T 汇编

    1 基础 x86 的寄存器为32位 xff0c x64 的寄存器为64位 寄存器间对应关系 xff1a 64位寄存器 低32位 低16位 低8位 rax eax ax al rbx ebx bx bl rcx ecx cx cl rdx e
  • 向导对话框[转]

    很久以前在网上看到的一片文章 xff0c 忘了是谁写的了 xff0c 觉得很好 xff0c 所以在这里转载 首先要了解的是CPropertySheet实际上是由一个TabCtrl加多个Page和多个按钮组成 这里强调一点 xff0c DoM