社区首页 >问答首页 >如何防止Windows Forms TextBox在调整大小时闪烁?

如何防止Windows Forms TextBox在调整大小时闪烁?
EN

Stack Overflow用户
提问于 2009-08-26 01:14:55
回答 4查看 15.6K关注 0票数 19

有很多关于Windows窗体中的闪烁的文章。大多数人建议设置DoubleBuffered = true或设置一堆ControlStyle标志。然而,这些都不能帮助减少TextBox闪烁。

这里有几个相关的问题:

要重现这个问题,请创建一个新的WinForms项目,添加一个TextBox,启用多行,禁用自动换行,添加一堆文本,将Anchor设置为Left+Right+Top+Bottom。现在运行并调整大小。文本闪烁。对于两个嵌套的TableLayoutPanel中的文本框,调整大小时的闪烁甚至更糟。

应用上述问题中提出的解决方案充其量并不能修复闪烁;如果我进行了实验,并在TextBox上设置了受保护的ControlStyle,我可以完全打破它(通过启用UserPaint),但不能消除闪烁。

那么,有没有办法解决TextBox中文本闪烁的问题呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-15 14:45:17

我通常使用RichTextBox而不是多行TextBox。通过将DetectUrls和ShortcutsEnabled属性设置为false,RTB的行为非常类似于TextBox和...它没有闪烁。

票数 16
EN

Stack Overflow用户

发布于 2009-08-26 01:59:15

在Windows窗体中,DoubleBuffered属性不影响文本框等子控件。相反,它只影响为其设置的窗体或面板。

如果要对窗体上的子元素进行双缓冲,则需要实现手动双缓冲。

Bob Powell写了一篇关于如何做到这一点的good article (和其他人)。

此外,来自forum answer的鲍勃还说:

窗口的所有权意味着它们将无法控制地闪烁,因为您不能在目标窗口区域之外进行双缓冲。具有子控件的面板不能将其自身及其子控件设置为双缓冲区。

正确执行此操作的唯一方法是创建单个控件,该控件使用保留模式图形系统的形式完成所有绘图。

因此,要使用手动双缓冲获得无闪烁的文本框大小,您需要以某种方式将文本框渲染到后台缓冲区,然后将其显示为缓冲更新的一部分。即使可能:我也不认为这会是一件容易的事情。

更新

其他一些回答说这是Windows窗体的一个具体问题。这是不正确的,它实际上是更深层次的,是由Windows GDI引起的。例如,打开记事本/写字板等,粘贴一大块文本,调整窗口大小,注意到同样的闪烁问题。

这是几年前我用来做类似事情的一个基本解决方案。它是一个简单的表单,包含一个多行文本框和一个继承自Panel的自定义类。这两个控件具有相同的位置和大小。它在调整大小时使用窗体ResizeBegin和ResizeEnd来显示面板,否则使用textbox。它不是完美的,但它确实消除了闪烁。

代码语言:javascript
代码运行次数:0
复制
   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Bitmap bm = null;

        private void textBox1_Resize(object sender, EventArgs e)
        {

            Graphics g = textBox1.CreateGraphics();

            if (g.VisibleClipBounds.IsEmpty == false)
            {
                bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height);

                textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height));

            }

            g.Dispose();


        }

        private void panelDB1_Paint(object sender, PaintEventArgs e)
        {
            if (bm != null)
            {
                e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height );
            }
        }

        private void Form1_ResizeBegin(object sender, EventArgs e)
        {
            panelDB1.BringToFront();  
        }

        private void Form1_ResizeEnd(object sender, EventArgs e)
        {
            panelDB1.SendToBack();   
        }
}

class PanelDB : Panel
{
    public PanelDB()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true);       
        //this.DoubleBuffered = true; 
    
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }
}
票数 4
EN

Stack Overflow用户

发布于 2009-08-26 01:52:19

我们在过去遇到过类似的问题,结果是使用了过多的停靠和表格布局面板。我会建议,如果可能的话,尝试用最少的停靠来重建UI (因为表格布局面板也在内部使用停靠)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1333393

复制
相关文章
如何防止Mimikatz「获取」Windows密码
黑客总是在用最简单的攻击方式来实现他们的目的,比如用已经存在了好多年的工具——Mimikatz(猕猴桃),它可以从系统内存中轻松获取到明文密码。 受影响的系统 Windows 7和Windows Server 2008(老系统也受影响)。 最新的Windows 8 / 10 、Windows Server 2012 / 2016原本是不受影响的,但是高权限的黑客可以通过修改注册表来实现这样的攻击。 风险 黑客拥有系统管理员权限,就能从内存中获取登录认证信息(明文/各种哈希格式)。 描述 在Windows X
FB客服
2018/02/08
1.7K0
如何防止Mimikatz「获取」Windows密码
Windows Forms:在C#中将图像转换成灰度图
本文翻译自Windows Forms: Convert an image into grayscale in C# 这篇文章向你展示在C# Windows窗体应用程序中如何将图像转换成灰度图。 创建一个新的Windows窗体应用程序项目,然后创建一个允许你可以打开图像,然后将图像转换成黑白图像的简单的UI,如下图所示:
ccf19881030
2021/03/02
1.6K0
Windows Forms:在C#中将图像转换成灰度图
nginx实例 - 如何防止大图片占满带宽?
场景 前几天网站出现了访问缓慢的情况,查看系统资源状况后,发现出网带宽一直是占满的状态 查看服务器日志,发现了很多10M左右的超大图片的请求,这些图片占满了带宽,严重影响了其他的访问请求 正常情况下是应该访问缩放过的小图,一般在100K以内,查找问题和修改程序来不及,需要紧急处理 想到的方法就是对大图的加载进行限速 配置 修改nginx配置文件中图片访问的配置部分 思路: 对于正常小图的访问不限制,把正常图的大小限定为 100K 以内,超出时就进行限速,速度限定为最大 100k/s loca
dys
2018/04/03
2.2K0
nginx实例 - 如何防止大图片占满带宽?
Spread for Windows Forms快速入门(9)---使用公式
Spread的公式计算引擎支持300多种内置函数,并支持通过内置函数和运算符来自定义公式。支持的函数包括日期、时间函数、工程计算函数、财务计算函数、逻辑函数、数学和三角函数、统计函数、文本函数等。 公式计算引擎支持单元格的引用、表单的交叉引用、循环引用、函数嵌套等。 放置公式在单元格中 你可以添加一个公式到一个单元格或单元格区域内。 你还可以向一行或者一列中所有的单元格添加公式。该公式是一个具有说明公式字符串的公式,通常是包含一个函数,运算符和常数的集合体。 当把一个公式分配到行或列的时候,这个公式为每一个
葡萄城控件
2018/01/10
1.7K0
如何调整Windows服务器的盘符顺序
本文章提供技术演示视频地址:https://www.bilibili.com/video/BV1L64y1Q7Db
研究僧
2021/03/27
3.5K0
Spread for Windows Forms快速入门(13)---数据排序
开发人员可以对Spread表单中的行和列进行自动排序操作,如根据指定的列,以升序方式自动排序表单中的数据。同时,也可以显示排序指示器。这些操作不会影响数据模型 仅仅涉及数据如何显示。 允许用户自动地对
葡萄城控件
2018/01/10
1.4K0
Spread for Windows Forms快速入门(13)---数据排序
WPF / Windows Forms 检测窗口在哪个屏幕
使用 Windows Forms 自带的 System.Windows.Forms.Screen 类可以从一个窗口句柄获取到对应的屏幕。随后可以使用此 Screen 类获取各种屏幕信息。
walterlv
2023/10/22
4540
WPF / Windows Forms 检测窗口在哪个屏幕
Spread for Windows Forms高级主题(1)---底层模型
底层模型概述 Spread控件提供了很多模型,这些模型提供了自定义控件的基础架构。同时,这些模型作为底层模板,派生出了更多通用的快捷对象。 在不使用Spread的底层模型的情况下,你可以完成许多任务。通过使用Spread设计器或者快捷对象(如单元格、列和行)的属性,你可以在表单上实现许多改变。但是因为表单模型是所有快捷对象的基础,因此在通常情况下,使用表单模型要比使用快捷对象的速度要快。例如,在代码中使用快捷对象设置一个属性值: fpSpread1.Sheets[0].Cells[0, 0].Value =
葡萄城控件
2018/01/10
1.9K0
Spread for Windows Forms高级主题(1)---底层模型
Spread for Windows Forms快速入门(14)---文件操作
你可以将数据从Spread中存到几种不同类型的文件中或者可以在Spread中打开几种不同类型的数据文件。通过使用相应的代码,你可以将整个控件,某个特定的表单,或者某个特定单元格区域中的数据保存为几种不同的文件类型或者流。类似的,你可以允许用户对某几种文件类型进行文件操作。 保存到Excel文件 你可以使用ExcelSaveFlags枚举类型的UseOOXMLFormat选项,将数据保存到Excel格式文件(BIFF8 格式)或者Excel 2007 XML 格式(xlsx)。默认的,当你保存为Excel文件
葡萄城控件
2018/01/10
2.7K0
Spread for Windows Forms快速入门(3)---行列操作
开发人员可以定义用户与行和列的交互,如是否可以更改行或列的大小、是否可以移动行或列、冻结指定的行或列、在行或列中查找数据等。 更改行或列的大小 你可以允许用户重新调整表单中行或列的大小。 设置行的Resizable属性以允许用户重置行的大小,设置列的Resizable属性以允许用户重置列的大小。用户也可以双击列首与列首之间的分隔线以重新设置列的宽窄,以适应列首文字的宽度。 用户要重置行或列的大小,仅需鼠标左键单击行首或列首的边界线,拖拽至所需位置释放鼠标。 如下图所示,当左键被按下时,鼠标位置就会显示一个工
葡萄城控件
2018/01/10
2.5K0
Spread for Windows Forms快速入门(3)---行列操作
.NET 基金会项目介绍-Windows Forms
Windows Forms 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。
newbe36524
2020/03/16
7910
Spread for Windows Forms快速入门(11)---数据筛选
Spread支持开发人员自定义筛选数据的用户体验。基于行数据筛选,你可以允许用户分列进行筛选,从而仅显示符合了下拉列表中条件的行的数据,或者根据筛选结果更改行的外观。你可以使用默认的筛选方式,或者你可以从实际出发,自定义筛选器的每一个方面。 允许用户进行行筛选 默认情况下,表单禁止用户对表单的行进行筛选。你可以开启这一特性, 允许用户在所有列或者指定的列中进行行筛选。根据你要隐藏被筛除的列,还是更改列的外观,分别使用HideRowFilter类或StyleRowFilter类。 使用列AllowAutoFi
葡萄城控件
2018/01/10
2.8K0
Spread for Windows Forms快速入门(11)---数据筛选
c#基于Tablet pc实现的手写输入
需要安装Tablet pc,win7的话 直接在控制面板》程序和应用》添加组建里面勾选上添加
冰封一夏
2019/09/11
1.2K0
C#-TextBox-登录窗口密码不可见—ShinePans[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161502.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
1.4K0
C#-TextBox-登录窗口密码不可见—ShinePans[通俗易懂]
Spread for Windows Forms高级主题(6)---数据绑定管理
自定义列和区域的数据绑定 当表单被绑定到一个数据集时,表单中的列就会相继的被分配到数据集的区域上。例如,第一个数据域分配给列A,第二个数据区域分配给列B,等等。你也可以改变分配顺序,将任意域分配给任意列。 默认情况下,绑定的表单继承数据库中列的宽度。如果你想要设置你自己的列宽,你可以在绑定Spread控件之后设置列宽,或者将DataAutoSizeColumns属性设置为false并设置列宽。 如果你将多个Spread控件绑定到了一个单一的数据集,你可以将每一个Spread控件中表单的AutoGenerat
葡萄城控件
2018/01/10
2.2K0
Spread for Windows Forms高级主题(6)---数据绑定管理
Using sqlite with .NET
The other day I found that there is a .NET wrapper for sqlite. sqlite is a very cool embeddable SQL-92 database engine. It's a single library that gives you a very fast, very scalable (2TB), single file, multi-user database. I thought the .NET wrapper is e
张善友
2018/01/31
6500
3-9 读写缓存流 ——Buffered
类BufferedStream就是给另一流上的读写操作添加一个缓冲区。缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。因此,缓冲区可提高读取和写入性能。使用缓冲区可进行读取或写入,但不能同时进行这两种操作。BufferedStream 的Read和Write方法自动维护缓冲区的读写过程。
py3study
2020/01/08
6800
3-9 读写缓存流 ——Buffered
焦点事件中的Validating处理方法
本文转载:http://tech.it168.com/oldarticle/2006-04-03/200604031055437.shtml
跟着阿笨一起玩NET
2018/09/18
2K0
点击加载更多

相似问题

调整大小时防止TPaintBox闪烁

118

调整画布/帧大小时如何防止窗口闪烁?

13

在swing中调整组件大小时如何防止闪烁?

73

如何防止无边界窗口窗体在调整大小时(C#)闪烁?

43

Windows Forms TextBox错误?

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文