Şimdi Ara

C# GDI+ da cizim yaparken olusan titresim (flickering) sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
644
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Öncelikle selamlar

    C# da gdi+ ile cizim yapmak icin ugrasiyorum. Cizim yaparken olusan titresim sorunu icin MS'in sitesinde su kodu buldum ama niyeyse bende ise yaramadi.

    public class CustomPanel : System.Windows.Forms.Panel
    {
    public CustomPanel()
    {
    this.SetStyle(
    System.Windows.Forms.ControlStyles.UserPaint |
    System.Windows.Forms.ControlStyles.AllPaintingInWmPaint |
    System.Windows.Forms.ControlStyles.DoubleBuffer |
    System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer,
    true);
    }

    }



    En basit öenegi ile

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
    Graphics d = panel1.CreateGraphics();
    Graphics k = panel1.CreateGraphics();
    Pen kalem1 = new Pen(Color.FromArgb(150, 0, 0));
    SolidBrush dolgu1 = new SolidBrush(Color.FromArgb(200, 200, 170));
    d.FillEllipse(dolgu1, 200, 200, 80, 80);
    k.DrawEllipse(kalem1, 200, 200, 80, 80);
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {

    panel1.Refresh();

    }

    Cizimi paint kisminda refresh i de mousemove da yapma sebebim ise cizimleri dinamik olarak dizilere atamak ve yapilan cizimleri de refresh ile yenileyip sonrasinda panel paintte dizilerden okuyup cizdirmek.

    Gel gelelim titresimi önlemedigi gibi fare durunca ekrandaki sabit cizim de gidiyor.
    Neyi hatali yada eksik yapiyorum?

    Simdiden tesekkür ederim.



    < Bu mesaj bu kişi tarafından değiştirildi makist -- 26 Nisan 2018; 16:37:8 >







  • diziye atmaktan kasıt ne anlamadım sonuç olarak ne yapılmak isteniyor paint gibi bir çizim tahtası mı
    koda bakarsan sürekli refresh yapması gerekli değil elbette flicker olur bunda başka türlü yapılması lazım birde kodda türetilen panel kullanılmamış standart formdaki panel1 kullanılmış
  • Gökşen PASLI G kullanıcısına yanıt
    Paint degil de dogrusal cizim, diyagram cizimleri gibi birsey yapacagim.
    Bu sadece bir örnek oldugu icin yazmadim ama

    private void InitializeComponent()
    {
    this.panel1 = new cizimdeneme2d.Form1.CustomPanel();
    this.panel1.SuspendLayout();

    //
    // panel1
    //
    this.panel1.AutoScroll = true;
    this.panel1.BackColor = System.Drawing.Color.White;
    this.panel1.Controls.Add(this.listBox1);
    this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
    this.panel1.Location = new System.Drawing.Point(0, 0);
    this.panel1.Name = "panel1";
    this.panel1.Size = new System.Drawing.Size(1268, 586);
    this.panel1.TabIndex = 0;
    this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
    this.panel1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseClick);
    this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);


    private CustomPanel panel1;

    }


    Move dan refresh özellikle cizilenlerin secimi icin gerekli.Elbette refresh sartlara bagli yapilacak.https://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle(v=vs.110).aspx
    Özetle refreshden ziyade bu kod bende neden calismiyor nerede hata yapiyorum?





    Normalde
    /*this.SetStyle(
    System.Windows.Forms.ControlStyles.UserPaint |
    System.Windows.Forms.ControlStyles.AllPaintingInWmPaint |
    System.Windows.Forms.ControlStyles.DoubleBuffer |
    System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer,
    true);*/
    }

    yaptigimda titreme devam ediyor ama cizim yok olmuyor. Burayi aktif yapinca hem titriyor hem paint kisminin sonunda cizim siliniyor.
    Kisacasi panel icin doublebuffer problemi.

    Tesekkür ederim



    < Bu mesaj bu kişi tarafından değiştirildi makist -- 27 Nisan 2018; 19:21:16 >




  • onlara da baktım titreme var biraz onlarda da bana öyle geldi benim şahsi görüşüm wpf ile yapsanız daha iyi olurdu aşağıda basit bir tane yaptım bi bakarsınız titreme oluyor mu belki işinize yarar
    https://www.dosyaupload.com/mcl0
  • Neye kalkıştığının farkında mısın? GDI+ native C/C++ library dir, C# ise managed code içindir. Yani Java içinden JNI kullanarak C fonksiyonları çağırmak gibi birşey yapmaya kalkıştığın şey. Ya C++ ile native kod yaz, veya C# kullanacaksan ilgili .Net class larını kullan (System.Drawing.* ile başlayanlar olması lazım, veya neyse, araştır)

    < Bu ileti mini sürüm kullanılarak atıldı >
  • seyfi84 S kullanıcısına yanıt
    Yanitlariniz icin tesekkür ederim cözdüm.



    < Bu mesaj bu kişi tarafından değiştirildi makist -- 28 Nisan 2018; 0:35:27 >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.