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

Xtreme Toolkit Pro是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。如果对产品感兴趣的话欢迎下载Xtreme Toolkit Pro最新试用版! 点击获取更多免费Xtreme Toolkit Pro教程、视频、示例!

【同类产品推荐】

  • BCGControlBar for .NET | 下载试用 :包含有大量高度自定义、完全可设计的.NET界面控件,用户可以使用这些来创建精致美观的图形用户界面。

解决方案

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

  • CXTPEdit
  • CXTPTreeCtrl
  • CXTPListBox
  • CXTPListCtrl

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

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

  • CXTPScrollableEdit
  • CXTPScrollableTreeCtrl
  • CXTPScrollableListBox
  • CXTPScrollableListCtrl

CXTPPropertyGrid这是一种特殊情况,它没有其他CXTPScrollable派生版本,仅在内部使用新方法,保持完全向后兼容,并且除非确认新添加会引起阻塞问题,否则不需要任何特殊考虑。如果从版本19.3开始是这种情况,则可以禁用PropertyGrid滚动条主题。

如果从版本19.3开始是这种情况,则可以选择禁用滚动条主题,以回退到19.2之前的行为。对于这个无论是取消对XTPPropertyGrid.h 文件中 (C:Program Files (x86)Codejock SoftwareMFCXtreme ToolkitPro v19.3.0SourcePropertyGridXTPPropertyGrid.h) 的XTP_PROPERTY_GRID_DISABLE_SCROLLBAR_THEMES 宏或将宏定义为ToolkitPro或PropertyGrid库项目的C ++编译器属性,然后重新构建ToolkitPro或PropertyGrid项目,以使更改生效。

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

void SetScrollBarTheme(XTPScrollBarTheme nTheme);

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

  1. 如果控件是使用MFC基类公开的CreateEx方法手动创建的,应该只调用CWnd::Creat或者CWND::CreateEx由于微软C++编译器的旧版本中缺少C++支持而重写,从MFC CtReCtRL、CEDIT、CclitBox和CListCtrl调用重载CREATE或CREATETX方法将导致使用这些编译器时的编译错误。
 CXTPTreeCtrl m_tree;    // As CXTPTreeCtrl is derived from CTreeCtrl it uses CTreeCtrl::Create overloaded    // method which has signature different from CWnd::Create and thus should not be used for CXTPScrollableTreeCtrl    m_tree.Create(WS_CHILD | TVS_LINESATROOT, rc, this, IDC_TREE);
 Example of the fixed code:    CXTPScrollableTreeCtrl m_tree;    // Call CWnd::Create overridden method to ensure it can be compiled using all Microsoft C++ compilers    m_tree.Create(_T("SysTreeView32"), NULL, WS_CHILD | TVS_LINESATROOT, rc, this, IDC_TREE);
  1. 从CXTPScrollable派生的所有控件将在初始创建时销毁并重新创建。对于常规用例,这个过程是绝对透明的,但是如果句柄在早期被客户端代码缓存,它可能很快就会失效,这些地方包括但不限于:
    • 窗口创建挂钩
    • 在默认CDialog::OnInitDialog调用之前完成的任何句柄操作
  2. 在设计派生自定义控件的方法时,如果CXTPScrollable尝试使控件的初始化逻辑尽可能简单和轻巧,则后续控件的重新创建可能会导致控件重新创建期间的CPU和内存负担加倍,从而导致应用程序启动速度变慢。
  3. 派生cxtScrollable的所有类都必须是默认可构造的,即公开一个不带参数的公共构造函数或提供了默认值的所有参数。
  4. 为了修改派生自CXTPScrollable该控件的控件,必须设置标志位进行调用 RedrawWindow,RDW_ALLCHILDREN因为调用UpdateWindow 不会产生任何效果。
  5. 如果从中派生的控件CXTPScrollable需要在创建后访问其父窗口,则它必须调用GetParent两次,因为它将被放置在中间宿主控件上。
  6. 使用从CXTPScrollableResizer 控件派生的控件需要使用CXTPResize::SetResize除控件的ID值外还带有 控件的窗口句柄的方法,例如
 CXTPEdit m_edtSingleLine;    CXTPScrollableEdit m_edtMultiline;    // IDC_EDIT_SINGLELINE is NOT derived from CXTPScrollable and thus can be referenced by Resize control by ID only.    SetResize(IDC_EDIT_SINGLELINE, XTP_ANCHOR_TOPLEFT, CXTPResizePoint(1.f / 3.f, 0));    // IDC_EDIT_MULTILINE is derived from CXTPScrollable and thus must be referenced by Resize control by both ID and handle value.    SetResize(IDC_EDIT_MULTILINE, m_edtMultiline, XTP_ANCHOR_TOPLEFT, CXTPResizePoint(1.f / 3.f, 0));

从CXTPScrollable派生自定义控件

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

有两种可能的用例:

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

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

  • CXTPScrollableEditT<Base>
  • CXTPScrollableListBoxT<Base>
  • CXTPScrollableTreeCtrlT<Base>
  • CXTPScrollableListCtrlT<Base>

例:

  // Your existing classes    class CCustomEdit : public CEdit { /*...*/ };    class CCustomTreeCtrl : public CXTPTreeCtrl { /*...*/ };    // Your new derived classes    class CScrollableCustomEdit : public CXTPScrollableEditT<CCustomEdit> { /*...*/ };    class CScrollableTreeCtrl : public CXTPScrollableEditT<CCustomTreeCtrl> { /*...*/ };

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

 // Your existing class    class CCustomControl : public CWnd    {    public:        void InitializeCustomState();        // ...    };    // Your new derived class.    // Some or all method may have default implementation, the example demonstrates overloading of all methods.    class CScrollableCustomControl : public CXTPScrollable    {    public:        // IXTPScrollable overrides        virtual BOOL HasVScroll(DWORD dwStyle, DWORD dwExStyle) const        {            // Determine if control has vertical scroll.            return 0 != (GetStyle() & WS_VSCROLL);        }        virtual BOOL HasHScroll(DWORD dwStyle, DWORD dwExStyle) const        {            // Determine if control has horizontal scroll.            return 0 != (GetStyle() & WS_HSCROLL);        }        virtual BOOL HasLeftScrollbar(DWORD dwStyle, DWORD dwExStyle) const        {            // Determine if control has scroll bar on the lets.            return 0 != (GetExStyle() & WS_EX_LEFTSCROLLBAR);        }        virtual void DisableScrollbars()        {            // Force default scroll bars to hide.            DisableScrollbars(*this);        }        virtual void DisableScrollbars(CWnd& wnd)        {            // Force default scroll bars to hide for a specific window.            wnd.ModifyStyle(WS_VSCROLL | WS_HSCROLL, 0);        }        virtual CScrollBar* CreateBar() const        {            // Create scroll bar instance.            return new CXTPScrollBarCtrl();        }        virtual CWnd* CreateControl() const        {            // Re-create custom control instance and perform default initialization if necessary.            CCustomControl* pNewCtrl = new CCustomControl();            VERIFY(NULL != pNewCtrl);            pNewCtrl->InitializeCustomState();            return pNewCtrl;        }        virtual DWORD FilterStyle(DWORD dwStyle) const        {            return dwStyle;        }        virtual DWORD FilterExStyle(DWORD dwExStyle) const        {            return dwExStyle;        }        virtual BOOL RequiresMouseWheelOverriding() const        {            return true;        }        // ...    };

今天的内容就是这些了,下载最新版Xtreme ToolKit Pro并在下方评论区分享您对该产品的想法。您的反馈意见可帮助我们在以后的更新中找到正确的方向,作为Codejock的正版代理商现Xtreme ToolKit Pro正版授权最高立减2000元! Xtreme Command Bars在线订购最低仅需1105元!

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年8月19日
下一篇 2020年8月19日

相关推荐

发表回复

登录后才能评论