WTL的CScrollContainer

最近碰到要根据已定义的模板动态创建控件的难题,需求如下:

1. 提供几种可输入的数据类型,每个类型对应一种控件用来输入该类型

2. 可自定义输入模板,某个模板包括1种或几种数据类型

blog.csdn.net/flyback

由上面的需求可以得出结论,要实现的功能是可以动态创建各种输入控件并把它们排列在一起。

动态创建控件没啥问题,只是控件多了以后怎么办?应该需要一个可以上下滚动的窗口显示动态创建的控件

万能的网络没有告诉我答案,它只说要有光,于是就有了光,我说要有上下滚动的窗口,于是...什么都没有发生。

blog.csdn.net/flyback

过程:

1. 窗口本身是可以通过SetStyle(WS_xxx...)设置滚动条的,但是需要自己根据滚动条发出的事件对控件的位置进行调整,这个网上是有的,但是实现得比较琐碎,不愿看,可能也比较容易出错

2. 用别人的控件,网上没找到,有显示图片的,不合适

3. 用wtl自带的, 网上只说有这个东西,至于怎么用,没有人发例子,可能好简单

4. 于是只能自己上,自己好简单一下,留个念想

解题:

atlscrl.h 里

WTL有个实现模板叫做CScrollWindowImpl

template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
class ATL_NO_VTABLE CScrollWindowImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>, public CScrollImpl< T >

CScrollImpl模板类WTL已经给我们实现了所有需要操作滚动条的功能,用的话就用一个特化的类 CScrollContainer

class CScrollContainer : public CScrollContainerImpl<CScrollContainer>
{
public:
	DECLARE_WND_CLASS_EX(_T("WTL_ScrollContainer"), 0, -1)
};
// blog.csdn.net/flyback

它是一个容器,那么就需要给它加上容器的内容,这个容器可以设置内容的大小,这样看来就相当于容器的大小是一个窗口,而内容的大小就是滚动条的滚动范围

所以:

在自己的窗口上加上两个对象

CScrollContainer	m_wndParameters;
CInternalWnd		m_wndInternal;	

m_wndParameters是容器,而m_wndInternal就是容器要显示的内容

class CInternalWnd:public CWindowImpl<CInternalWnd> 你懂的

初始化:

m_wndParameters.Create(m_hWnd, &rt, 0, WS_VISIBLE|WS_CHILD|WS_BORDER|..., ..., ...);
m_wndParameters.ShowWindow(SW_SHOW);
m_wndParameters.UpdateWindow();
// blog.csdn.net/flyback

rt是容器的大小,即要显示的窗口大小

那么,因为我们要动态创建窗口控件,所以需要选择合适的时机创建内容窗口

RECT rt = {0};
::GetWindowRect(GetDesktopWindow(), &rt);
m_wndInternal.Create(m_wndParameters.m_hWnd, &rt, "", WS_VISIBLE|WS_CHILD/*|WS_CLIPCHILDREN|WS_CLIPSIBLINGS*/);
m_wndInternal.SetParent(m_wndParameters.m_hWnd);
m_wndInternal.ShowWindow(SW_SHOW);
m_wndInternal.UpdateWindow();
SIZE sz = {0};
sz.cy = rt.bottom; // 设置内容的高度和屏幕显示的高度一样,其实不一定够
m_wndParameters.GetClientRect(&rt);
sz.cx = rt.right;
m_wndParameters.SetClient(m_wndInternal.m_hWnd);
m_wndParameters.SetScrollSize(sz);
// blog.csdn.net/flyback

完鸟!

时间: 2024-10-18 06:27:46

WTL的CScrollContainer的相关文章

STL,ATL,WTL之间的联系和区别

一.STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于

深入浅出CChart 每日一课——快乐高四第十六课 老马识途,ChartCtrl控件在WTL中的使用

这几天有个朋友想在WTL下使用ChartCtrl控件,因此笨笨在这里也写一个简单的教程. 要使用WTL当然要先安装它. 笨笨在这里介绍两个例子,一个是WTL对话框界面,一个是WTL单文档SDI界面. A16.1 WTL对话框界面 第一步,首先用AppWizard建立一个基于对话框的WTL程序LessonA16. 第二步,在主对话框资源IDD_MAINDLG上添加一个Custom Control控件,其ID设置为IDC_CHART,class设置为ChartCtrl. 第三步,拷贝库文件. 第四步

[ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]

场景: 1. 在做图片处理时,比方放大后或加特效后须要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不须要增加第3方库时. 说明: 这段代码部分来自网上.第一次学atl/wtl.gdi不是非常熟悉.以后转换为wtl版本号吧. 当然wtl项目直接用也没问题. 如今想想wxWidgets的wxImage类对这类操作方便多了.仅仅须要调用一个SaveFile方法. 保存HBITMAP到文件: static bool SaveBitmapToFile(CBitmap& b

WTL - Virtual List Controls(WTL下使用虚拟列表)

普通的 CListCtrl 在其数据达到10000以上时,拖动滚动条已卡,很不好.. Virtual List Controls,虚拟列表,我认为是一种列表的显示方式.. 普通列表:所有的列表数据加载完成再显示. 虚拟列表:只加载当前指定的要显示的数据(当收到 LVN_GETDISPINFO 消息时,会刷新列表,只刷新要显示的部分 ). 很明显,当数据量大的时候,谁优谁劣.. 比起 MFC,我更喜欢轻量级 WTL,就用 WTL 做个例子吧.. 1.新建 WTL 工程: 2.拖出列表控件 List

MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?

WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决.而且封装得也不完全,还是随处可见 HWND HDC之类的东西.用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比如我写过一个小框架用来做安装卸载程序,非常小,其中创建管理窗口部分是用WTL的. MFC是更高级点的Wi

WTL:下载、安装、初见

简介 WTL: Windows Template Library 基于ATL对Win32 API的封装 C++库,用于开发Windows应用程序和UI组件 WTL功能不如MFC完善,但比MFC更小巧更有效率,不依赖MFC的DLL MFC支持doc/view架构,而WTL并不支持 WTL不是微软的正式产品,没有微软的官方支持 WTL也实现了CString.CRect.CSize.CPoint等常用的类    WTL的CStaticT.CButtonT.CListBoxT.CComboBoxT等用起

[ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]

场景 有时候我们需要单独对某个窗口消息进行拦截,比如CEdit响应回车, 这时候就需要拦截窗口处理过程了. 当然MFC的界面可以重载: BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){ 但是WTL的CEdit并不支持这种方式,WTL如果想在 PreTranslateMessage 里拦截消息,必须继承 CMessageFilter 后还要把这个控件注册到消息循环里才行,也就是必须写子类 或者从父窗口拦截这个CEdit的消息. CMessageLoop*

ToolBar使用-WTL篇

新建一个WTL exe应用工程,工程名为WTL_ToolBar 2.类型选对话框即可 3.点击Finish.工程建好后,直接编译执行: 4.资源编辑器里,将OK Cancel按钮位置移动下,防止与工具条位置冲突. 5.下面正式开始toolbar的使用: 6.资源视图下WTL_ToolBar.rc右键插入资源,弹出的对话框里选择ToolBar,然后点击新建. 然后IDR_TOOLBAR1里画3个位图,属性里分别修改ID为IDR_TBUTTON1 IDR_TBUTTON2 IDR_TBUTTON3

[ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]

场景: 1.  WTL的控件默认不支持进入和移出的 WM_MOUSEHOVER ,WM_MOUSELEAVE 事件, 即使写了映射也没用, 必须要使用函数 _TrackMouseEvent  添加监听. https://msdn.microsoft.com/en-us/library/windows/desktop/ms645615(v=vs.85).aspx 2. 默认的Window窗口如果有子窗口时, 当进入子窗口时, 会对父窗口调用WM_MOUSELEAVE, 因为子窗口默认会拦截消息,