没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-11-14 09:54:00.000|阅读 1532 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
下载本文例子源代码
在本文的前面第一部分和第二部分中,我们描述了CFolderTabCtrl标签控制的设计思想、创建过程以及工作原理,通过一个实用程序分析了将CFolderTabCtrl与MFC框架结构融于一体的思路以及关键技巧。CFolderTabCtrl的主要目的是仿真Excel和Visual
C++应用程序中标签控制页的UI功能。在这一部分我们将进一步增强和完善CFolderTabCtrl标签控制的仿真效果以及可重用性。内容包括创建多个标签页、并增加让标签页左右滚动的箭头按钮,这两个按钮上分别是示意左右的小三角形。
我们将以《VC知识库在线杂志》第十五期里一篇关于图像显示的文章中所附带的源代码作为例子,将CFolderTabCtrl实现的标签控制功能应用到图像显示程序中。原来的程序是一个MFC程序,它通过一个C++类(CPicture)封装Windows系统提供的IPicture
低级COM接口,使我们能轻松地显示各种格式图像文件,包括*.gif、*.jpg、*.bmp和DIBs文件。有关图像显示的具体细节不是本文要讨论的内容,具体细节请参考文章——“在MFC程序中显示JPG/GIF图像”。
首先,我们来看看如何实现箭头按钮?我的基本思路是将按钮作为CFolderTabCtrl的自绘窗口来创建,将标签放置在按钮的右边。
为实现这个按钮,我创建了一个新类,CFolderButton。它个类是一个自绘按钮类,它有一个DrawItem函数负责绘制按钮,而不是用位图按钮。我选择用GDI类绘制表示左右的三角形,这样的话就不用担心由于缩放而导致的边缘显示问题。CFolderButton::DrawItem自己能绘制三角形来适应按钮的大小。按钮在置灰状态时用3D阴影颜色表示,但按钮被按下时,用象素替换的方法表示按钮状态。CFolderButton还处理鼠标消息以实现两个专用的特性,通常,按钮时不响应双击操作的,但这个按钮可以处理双击鼠标事件,它使得标签滚动两页。也就是说双击相当于两次单击一样。下面是实现代码:
void CFolderButton::OnLButtonDblClk (UINT nFlags, CPoint pt)
{
SendMessage(WM_LBUTTONDOWN,
nFlags,
MAKELONG(pt.x,pt.y));
}
另一个特性是用户按着按钮不放,则标签会一直滚动,直到标签的端口。实现这个特性的方法是用一个定时器,当定时器被激活时,CFolderButton向它的父窗口发送一个WM_COMMAND消息,就好像按钮已经被压下一样。
void CFolderButton::OnTimer(UINT nIDEvent)
{
GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID());
}
详细的实现细节请参考本文的源代码。实际上,CFolderButton::OnTimer的实现是有一个启动延时的,所以持续滚动特性犹如键盘操作一样:在重复按下之前有轻微的延时。
CFolderButton并不知道有标签页以及如何滚动它们。它只知道如何画出按钮并响应鼠标行为。当用户按下按钮,Windows将WM_COMMAND/BN_CLICKED消息发送到父窗口:也就是CFolderTabCtrl。CFolderTabCtrl才能使标签页滚动。CFolderTabCtrl是按钮和标签的操纵者,就有点象组合框(ComboBox)操纵其编辑框、下拉按钮和列表框一样。
在CFolderTabCtrl中添加滚动按钮需要对几个地方进行修改。首先,你必须创建按钮。在哪里创建呢?记住!无论你什么时候创建有子窗口的复合控制,都应该在OnCreate中进行。
// 在 CFolderTabCtrl::OnCreate 中
if (m_dwFtabStyle & FTS_BUTTONS) {
CRect rc;
for (int id=FTBPREV; id<=FTBNEXT; id++) {
VERIFY(m_wndButton[id-1].Create(
WS_VISIBLE|WS_CHILD, this, rc, id));
}
m_cxButtons = 2*CXBUTTON;
}
FTS_BUTTONS是CFolderTabCtrl显示按钮的新式样。FTBPREV和FTBNEXT是枚举类型,其值分别为1和2,用于标示按钮的IDs。
在Windows系统里,你只要有子窗口,就必须管理它们的大小。这个工作由CFolderTabCtrl::OnSize专门负责。现在标签控制中加入了按钮,你就必须修改CFolderTabCtrl::OnPaint函数,将标签画在按钮的右边。为此不用修改原来的绘制代码,只要改一下视图窗口就可以了:
// x origin = (按钮的宽度) - (第一个标签页的x 坐标);
int xOrigin = m_cxButtons -
GetTab(m_iFirstTab)->GetRect().left;
dc.SetViewportOrg(xOrigin,0);
设置完这个视图窗口后,你不用修改原来的代码便能正确切换标签。其中的转换发生在GDI内部的底层。
最后一个难题是处理按钮的单击。这个任务落在了CFolderTabCtrl对WM_COMMAND/BN_CLICKED消息的处理上。下面是关键代码:
BEGIN_MESSAGE_MAP(CFolderTabCtrl, CWnd)
……
ON_BN_CLICKED(FTBNEXT,OnNextTab)
END_MESSAGE_MAP()
void CFolderTabCtrl::OnNextTab()
{
if (m_iFirstTab < m_lsTabs.GetCount()-1) {
m_iFirstTab++;
Invalidate();
UpdateButtons();
}
}
CFolderTabCtrl递增m_iFirstTab并重画。同时调用UpdateButtons函数更新按钮的状态(Enabled)。如果第一个标签可见,也就是左边不会再有标签,UpdateButtons便置灰左边按钮;如果最后一个标签完全可见,也就是右边不会再有标签,UpdateButtons便置灰右边按钮。其实,标签除了占据屏幕空间外不做任何事情。实现细节请参考源代码。(完)
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号