विंडोज़ फॉर्म में डबलबफर्ड संपत्ति टेक्स्ट बॉक्स जैसे बाल नियंत्रण को प्रभावित नहीं करती है। इसके बजाए यह केवल उस फॉर्म या पैनल को प्रभावित करता है जो इसके लिए सेट है।
यदि आप किसी फॉर्म पर बाल तत्वों के लिए डबल बफरिंग चाहते हैं, तो आपको मैन्युअल डबल बफरिंग को लागू करने की आवश्यकता होगी।
बॉब पॉवेल ने यह करने के तरीके पर good article (और अन्य) लिखा है।
इसके अलावा, forum answer एक से बॉब भी कहते हैं:
एक खिड़की के स्वामित्व का मतलब है कि वे अनियंत्रित झिलमिलाहट होगा, क्योंकि आप नहीं डबल बफर लक्ष्य खिड़कियों क्षेत्र के बाहर कर सकते हैं। बाल नियंत्रण वाले पैनल को डबल बफर के लिए और उदाहरण के लिए बच्चे नहीं बना सकते हैं।
इस सही ढंग से करने के लिए एक ही रास्ता है कि सभी ड्राइंग बनाए रखा मोड ग्राफिक्स प्रणाली के एक फार्म का उपयोग करके करता है एक भी नियंत्रण बनाने के लिए है।
इसलिए, झिलमिलाहट मुक्त पाठ बॉक्स मैनुअल डबल बफरिंग का उपयोग कर आप किसी भी तरह अपनी पीठ बफर करने के लिए पाठ बॉक्स प्रस्तुत करना और फिर बफ़र अपडेट के भाग के रूप में प्रदर्शित करने की आवश्यकता होगी का आकार बदलने के लिए। यदि संभव हो, तो मुझे उम्मीद नहीं है कि यह आसान होगा।
[अपडेट]
कुछ अन्य उत्तर कहा है इस विण्डोज़ फॉर्म्स विशेष रूप से के साथ एक समस्या है। यह सही नहीं है, यह वास्तव में गहरा है और यह विंडोज जीडीआई के कारण होता है। उदाहरण के तौर पर, नोटपैड/वर्डपैड आदि खोलें और टेक्स्ट का एक बड़ा हिस्सा पेस्ट करें, विंडो का आकार बदलें और उसी झटकेदार मुद्दे को नोटिस करें।
यहां एक बुनियादी समाधान है जिसे मैंने कुछ साल पहले ऐसा करने के लिए उपयोग किया था। यह एक साधारण रूप है जिसमें एक मल्टीलाइन टेक्स्टबॉक्स और पैनल से विरासत में एक कस्टम क्लास है। दोनों नियंत्रणों में एक ही स्थान और आकार होता है। आकार बदलने पर पैनल को दिखाने के लिए यह फॉर्म ResizeBegin और ResizeEnd का उपयोग करता है, और अन्यथा टेक्स्टबॉक्स। यह सही नहीं है लेकिन यह झटके को खत्म कर देता है।
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);
}
}
दिलचस्प पोस्ट, मेरे पास लेबल नियंत्रण के साथ समान समस्याएं हैं, लेकिन आधार पर मैंने डबलबफर को केवल AllPaintInWmPaint के साथ सेट किया जाना चाहिए जिसे केवल उपयोगकर्ता पेंट के साथ सेट किया जाना चाहिए, मैंने इसे दोहराया नहीं है ... – Ian
@romkyns, मैंने अपना उत्तर अपडेट किया है एक समाधान के साथ मैं अतीत में इस्तेमाल किया है। – Ash