实现类似Excel和Visual C++里文件夹式样的标签控制(三)

2016-01-29 12:04 57 1 收藏

实现类似Excel和Visual C++里文件夹式样的标签控制(三),实现类似Excel和Visual C++里文件夹式样的标签控制(三)

【 tulaoshi.com - C语言心得技巧 】

实现类似Excel和Visual C++里文件夹式样的标签控制(三)
——实例应用之功能扩充

编译/NorthTibet

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载本文例子源代码

    在本文的前面第一部分和第二部分中,我们描述了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的自绘窗口来创建,将标签放置在按钮的右边。如图一所示:


图一 程序中有13个标签页

    为实现这个按钮,我创建了一个新类,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 -
                        

来源:https://www.tulaoshi.com/n/20160129/1484482.html

延伸阅读
文件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分割多个可携带小文件,分步拷贝这些小文件,从而实现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。.Net FrameWork SDK中提供的许多处理文件...
  适用于: Microsoft Visual C++ .NET 2003 Microsoft Visual C++ Toolkit 2003 Microsoft Visual Studio .NET 摘要: 演示了 Visual C++ 2003 编译器提供的众多代码优化功能中的几项功能。(8 ...
由于工作的需要,一些朋友经常会需要创建一些人名的文件夹,一个一个创建文件夹实在非常麻烦,其实,可以有简便的方法,今天图老师小编就告诉你如何巧用Excel,来批量创建人名文件夹。 操作步骤如下: 第一步, 先打开Excel,创建一个新的工作表,在表格中的A列输入md(后面有个空格),在B列输入要创建的文件夹的路径,C列输入文件夹的名...
标签: 电脑入门
有时用某些工具扫描硬盘时,会在NTFS分区根目录下发现$extend文件夹(当然如果你的硬盘分区格式是FAT32就不会看到它了),可能某些工具会报告说$extend文件夹体积很大,但是千万不要不随便清理(直接是看不到也清不了它的,除非你用PowerTool、XueTr等工具,或进入PE系统才可能看到它和对其操作),如果误删了$extend或其中的文件或文件夹,可能导...
  电脑里经常会存储着重要文件,这些文件需要进行加密,有许多方法来实现。但如果想对一个文件夹里的所有文件都进行加密,数量少还可以,要是数量多岂不是得把人累死? 因此,今天我要告诉您一个好方法:给Windows 9x/2000文件夹加密。通过给一个文件夹加密就可使该文件夹里的所有文件得到保护。其工作效果,就是在您双击进入该...

经验教程

331

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部