- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 GDI+ 的用户控件中是否有一种首选的快速滚动方法?
我创建了一个控件,它以图形方式呈现可水平滚动的数据图。
目前,我的控件通过将水平滚动条的位置转换为数据中的偏移量来运行。然后控件呈现存在于此起点和根据控件宽度计算的终点之间的数据。
此方法有效,但速度很慢。我不希望在每次滚动事件时都手动重绘整个控制面。相反,我想通过将图形数据的全部(或部分)绘制到屏幕外表面来初始化控件,然后通过使其从偏移量开始读取预渲染的图形数据来虚拟滚动控制表面由水平滚动条的位置计算。
BitBlt 是唯一的方法吗?我真的必须手动将图形数据从一个表面复制到另一个表面吗?我不能接管 Paint 事件并使其在渲染时从屏幕外表面读取数据吗?这样一来,复制和渲染操作就合二为一了。
或者,我是否应该做一些矫揉造作的事情,比如直接在面板控件上绘制,然后直接从左向右滚动面板本身?
澄清:本质上,我想知道滚动预渲染数据的正确方法。如何在控件中滚动图形数据?重绘预渲染图形不是正确的选择。
最佳答案
是的,我会尝试双缓冲。如果渲染到屏幕外的位图,则只需滚动位图即可。
您可以尝试将整个图形渲染成一张大位图,然后让滚动条四处移动。但是,如果您的图表非常大,那么您需要将位图的大小限制在可见区域,只绘制它可见的部分,并像现在一样处理虚拟滚动。
在 32 位 Windows XP 上进行测试,我发现限制在 2.379 亿像素左右。这对于大多数控件来说肯定足够了,但对于您的应用程序来说可能还不够。
出于好奇,这里是我们能够创建和使用的最大 Windows 位图大小:
Width Height Area (pixels)====== ====== ===========32,767 7,261 237,921,18725,000 9,517 237,925,00023,792 10,000 237,920,00020,000 11,896 237,920,00015,861 15,000 237,915,00015,000 15,861 237,915,00011,896 20,000 237,920,00010,000 23,792 237,920,000 9,517 25,000 237,925,000 7,261 32,767 237,921,187
关于c# - 如何使用 GDI+ 合法地滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276985/
(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题: Macro that accept new object ...请记住这一点!) 这是一个人为的类: class foo
所以我尝试用java编写一个井字棋游戏。大部分已经完成,但是,如果有人选择了已被占用的空间,我无法返回无效的移动。 这是我试图弄清楚的代码。我认为由于空间是由数字 0 表示的(我的教授告诉我们这一点)
我想使用 Java 代码获取某些 Google 搜索引擎查询(在整个网络上)的估计结果数。 我每天只需要做很少的查询,所以一开始 Google Web Search API ,虽然已被弃用,但似乎已经
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
在 C++ 中,动态内存(取消)分配(malloc-free/new-delete)显然可以重复获得相同的内存范围,该内存范围被释放并按顺序再次分配。在多线程 C++ 中,这可能发生在多个线程中。 显
AesCryptoServiceProvider.LegalKeySizes 字段显示允许的位大小。 但是我不明白的是,如果这些都是真的,我如何才能成功利用 2048 位 key 长度(256 字节)
我有一个结构: typedef struct _n { int type; union { char *s; int i; }; } n; 当我
这个问题在这里已经有了答案: 关闭10年前. Possible Duplicate: int var = 1; void main() { int i = i; } 以下代码在g++和Visual C
根据 C++03 标准 (5.3.4/7): When the value of the expression in a direct-new-declarator is zero, the allo
我正在尝试创建一个生成器,使用 scalacheck 1.6.6 和规范 1.7 (scala 2.8.1) 生成(非零长度)合法的 unicode 字符串。 我希望我可以创建像这样的生成器: obj
这确实是一个关于 C++ 的问题,而不是 OpenGL。我正在关注 this OpenGL 教程(我刚开始),作者使用 C++(不是 C)。我的问题是 glVertexAttribPointer ta
由于 C++ 别名规则,您不能随意将 (一个 int*) 指向 char 数组,这似乎达成了一些共识。 从另一个问题——Generic char[] based storage and avoidin
我正在寻找一个通过 HTTP 接口(interface)发送文本消息的 SMS 网关。 但是,有些短信网关不允许设置发件人ID,允许的要么要求用户证明发件人ID是自己的手机号码,要么手动检查每个发件人
我们注意到您的应用要求用户注册个人信息才能访问非基于帐户的功能。在允许访问与用户无关的应用内容和功能之前,应用不能要求用户注册。 我们在注册时采用电子邮件 ID,因为所有数据都代表电子邮件 ID 在后
我一直在阅读 Bloch 和 Gafter 的 Java Puzzlers,并读到了第 10 个谜题 (Tweedledee)。这个谜题的本质是 provide declarations for th
这个问题确实符合标题:我很想知道造成这种差异的技术原因是什么,以及基本原理? std::shared_ptr sharedToVoid; // legal; std::unique_ptr uniqu
我试图做的是将数据框数据附加到现有的合法 excel 文件中。我使用了 openpyxl 中的 load_workbook() 函数,但它系统地返回了一个错误。这是一些在我的机器上崩溃的代码: fro
App 多次被 Apple 拒绝 “经过进一步审查,我们仍然发现您的应用使用了后台定位服务,但并未按照 iOS 人机界面指南的要求在位置模式警报中阐明其使用目的。” 在“NSLocationAlway
据我所知,像这样在 C++ 中实例化一个整数是合法的: int x = int(5); 作为一名 Java 程序员,我会假设这行代码调用传递“5”作为参数的整数的构造函数。我读到 int 不是一个类,
我是一名优秀的程序员,十分优秀!