Xtreme Toolkit Pro应用案例:如何使用ToolkitPro通用控件自定义滚动条

翻译|使用教程|编辑:鲍佳佳|2020-07-03 10:54:59.597|阅读 35 次

概述:在版本19.2之前,由于底层公共Windows控件显示和处理自己的滚动条的方式,不可能将控件的主题应用于ToolkitPro控件(例如CXTPEdit,CXTPTree,CXTPListBox,CXTPListCtrl和CXTPPropertyGrid)中的滚动条。覆盖Windows通用控件的行为并保持完全的向后兼容性在技术上是颇具挑战性的,因此导致需要对使用进行某些考虑的解决方案。本文介绍了关键点,并试图回答可能出现的最常见问题。

# 您正在找协同办公软件吗?点击这里站长给您推荐 #

解决方案

实际上,以下类保持不变,并且仍使用未应用主题的标准Windows滚动条:

CXTPEdit

CXTPTreeCtrl

CXTPListBox

CXTPListCtrl

为了能够应用滚动条主题或自定义滚动条类,必须使用或派生自称为的新特殊适配器模板类的新控件类CXTPScrollable

对于最常见的用例,将应用程序中使用的控件类名替换为对应的类名就足够了,这些类名源自CXTPScrollable:

CXTPScrollableEdit

CXTPScrollableTreeCtrl

CXTPScrollableListBox

CXTPScrollableListCtrl

CXTPPropertyGrid这是一种特殊情况,它没有其他CXTPScrollable派生版本,仅在内部使用新方法,保持完全向后兼容,不需要任何特殊考虑。

使用这些类将确保控件将自动设置正确的滚动条主题,并可以使用新方法设置自定义滚动条主题:

 void SetScrollBarTheme(XTPScrollBarTheme nTheme);

使用从CXTPScrollable派生的类也施加某些限制:

1.如果控件创建使用手动Create或CreateEx通过他们的MFC基类暴露的方法,应该只调用CWnd::Create或CWnd::CreateEx重写为由于缺乏C ++在旧版本的Microsoft C ++编译器支持调用重载Create或CreateEx从MFC方法CTreeCtrl,CEdit,CListBox并且CListCtrl会导致编译错误时使用那些编译器。

之前的代码示例:

   CXTPTreeCtrl m_tree;

   //因为CXTPTreeCtrl是从CTreeCtrl派生的,所以它使用CTreeCtrl :: Create重载

   //该方法的签名与CWnd :: Create不同,因此不应用于CXTPScrollableTreeCtrl

   m_tree.Create(WS_CHILD | TVS_LINESATROOT,rc,this,IDC_TREE);

固定代码示例:

CXTPScrollableTreeCtrl m_tree; //调用CWnd :: Create重写的方法以确保可以使用所有Microsoft C ++编译器

   m_tree.Create(_T(“ SysTreeView32”),NULL,WS_CHILD | TVS_LINESATROOT,rc,this,IDC_TREE)进行编译;

2.不要在初始化阶段为任何派生的控件缓存HWND句柄,CXTPScrollable因为它们很可能会失效。

派生自CXTPScrollable其的所有控件将被销毁,并在初次创建时重新创建。对于常规使用情况,此过程绝对透明,但是如果句柄由客户端代码尽早缓存,则它可能很快就会失效,这些位置包括但不限于:

窗口创建

在默认CDialog::OnInitDialog调用之前完成的任何句柄操作

3.在设计源自于CXTPScrollable试图使控件的初始化逻辑尽可能简单和轻巧的派生自定义控件时,如果控件重新创建期间的CPU和内存负担加倍,则后续控件重新创     建可能会导致应用程序启动速度变慢。

4.派生的所有类都CXTPScrollable必须是默认可构造的,即公开一个不带参数的公共构造函数,或提供所有带其默认值的参数。

5.为了重画派生自CXTPScrollable该控件的控件,必须设置标志位进行调用RedrawWindow,RDW_ALLCHILDREN因为调用UpdateWindow不会产生任何效果。

6.如果从中派生的控件CXTPScrollable需要在创建后访问其父窗口,则它必须调用GetParent两次,因为它将被放置在中间主机控件上。

7.使用从CXTPScrollableResizer 控件派生的控件需要使用CXTPResize::SetResize除控件的ID值外还带有控件的窗口句柄的方法,例如:

CXTPEdit m_edtSingleLine;
CXTPScrollableEdit m_edtMultiline; // IDC_EDIT_SINGLELINE不是从CXTPScrollable派生的,因此只能由ID的Resize控件引用。
SetResize(IDC_EDIT_SINGLELINE,XTP_ANCHOR_TOPLEFT,CXTPResizePoint(1.f / 3.f,0)); // IDC_EDIT_MULTILINE是从CXTPScrollable派生的,因此必须由Resize控件同时通过ID和句柄值进行引用。
SetResize(IDC_EDIT_MULTILINE,m_edtMultiline,XTP_ANCHOR_TOPLEFT,CXTPResizePoint(1.f / 3.f,0));

从CXTPScrollable派生自定义控件

如果CXTPScrollable控件来自于受支持的类并使用标准Windows滚动条,则可以使用自定义控件来将其应用于滚动条。

有两种可能的用例:

  1. 使用衍生自对照CEdit,CListBox,CTreeCtrl或CListCtrl
  2. 使用控件衍生自其他控件 CWnd

对于第一种情况,ToolkitPro为相应的基类提供了适配器模板:

  • CXTPScrollableEditT <基本>
  • CXTPScrollableListBoxT
  • CXTPScrollableTreeCtrlT <基本>
  • CXTPScrollableListCtrlT <基本>

例:

   //您现有的类

    CCustomEdit 类:public Cedit { /*...*/ };

   CCustomTreeCtrl 类:public CXTPTreeCtrl { /*...*/ }; //您的新派生类类 CScrollableCustomEdit:public CXTPScrollableEditT  { /*...*/ };

   类 CScrollableTreeCtrl:public CXTPScrollableEditT  { /*...*/ };

在其他情况下,当您需要派生另一种自定义控件时,则需要实现IXTPScrollable接口:

   //你现有的类

   类 CCustomControl:公众的CWnd

   { 市民:

        无效 InitializeCustomState();

   // ...

   }; //您的新派生类。//某些或全部方法可能具有默认实现,该示例演示了所有方法的重载。CScrollableCustomControl 类:公共 CXTPScrollable

   

   

   { public:

        // IXTPScrollable覆盖虚拟 BOOL HasVScroll(DWORD dwStyle,DWORD dwExStyle)const

       { //确定控件是否具有垂直滚动。返回 0!=(GetStyle()&WS_VSCROLL);

       } virtual BOOL HasHScroll(DWORD dwStyle,DWORD dwExStyle)const

       { //确定控件是否具有水平滚动。返回 0!=(GetStyle()&WS_HSCROLL);

       } virtual BOOL HasLeftScrollbar(DWORD dwStyle,DWORD dwExStyle)const

       { //确定控件是否在let上具有滚动条。返回

   



           0!=(GetExStyle()&WS_EX_LEFTSCROLLBAR);

       } virtual void DisableScrollbars()

       { //强制隐藏默认滚动条。

           ModifyStyle(WS_VSCROLL | WS_HSCROLL,0);

       } virtual CScrollBar * CreateBar()const

       { //创建滚动条实例。返回新的 CXTPScrollBarCtrl();

       } virtual CWnd * CreateControl()const

       { //重新创建自定义控件实例,并在必要时执行默认初始化。

           CCustomControl * pNewCtrl = 新的 CCustomControl();



       

           

           VERIFY(NULL!= pNewCtrl);



           pNewCtrl-> InitializeCustomState(); 返回 pNewCtrl;

       } 虚拟 DWORD FilterStyle(DWORD dwStyle)const

       { return dwStyle;

       } 虚拟 DWORD FilterExStyle(DWORD dwExStyle)const

       { return dwExStyle;

       } // ...

   };


点击下载Xtreme Toolkit Pro最新试用版

对此产品有任何疑问,欢迎咨询慧都在线客服>>



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
Xtreme Toolkit Pro

专为Windows平台开发人员提供最全面的Visual C++界面开发组件

在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat