Saya memiliki beberapa lapisan gambar di panel saya

Saya membuat panel dan meletakkan teks di atasnya dengan DrawString dan DrawRectangle. Untuk Melukis panel saya menggunakan acara Paint dan metode Invalidate tetapi ketika Invalidate dipanggil, saya mendapatkan hasil berikut (dengan warna belakang transparan):Panel saya dengan tali serut

Seperti yang Anda lihat, teksnya digambar tetapi apa yang ada di baliknya tidak hilang seolah-olah Invalidate sedang melakukan setengah tugasnya.

Saya telah menyetel DoubleBuffered ke true dan saya mencoba Graphics.Clear tetapi tidak berhasil.

Tolong seseorang dapat membantu saya?

Ada kodenya:

            int x = 0;
        int y = arrowUpHeight;
        int traceIndex = 0;
        lock (_lockDraw)
        {
            while (y < Height)
            {
                rect = new Rectangle(x, y, Width, 20);
                r = new Rectangle(x, y, rect.Width + 1, rect.Height + 1);
                bufferGraphics.SetClip(r);

                if (traceIndex < traceList.Count)
                {
                    if (traceIndex < numberOfTraces)
                    {
                        Line data = traceList[traceIndex];
                        if (traceIndex % 2 == 0)
                        {
                            bufferGraphics.FillRectangle(brushEven, rect);
                        }
                        else
                        {
                            bufferGraphics.FillRectangle(brushOdd, rect);
                        }
                        if (y < mousePositionY && mousePositionY < y + 20)
                        {
                            traceSelected = true;
                            traceList[traceIndex].Selected = true;
                            listLinesVisible[traceIndex].Selected = true;
                            listLines[listLines.IndexOf(traceList[traceIndex])].Selected = true;
                            indexRightClick = traceIndex;
                        }
                        else
                        {
                            if (listLines.IndexOf(traceList[traceIndex]) < listLines.Count && listLines.IndexOf(traceList[traceIndex]) >= 0)
                            {
                                traceList[traceIndex].Selected = false;
                                listLinesVisible[traceIndex].Selected = false;
                                listLines[listLines.IndexOf(traceList[traceIndex])].Selected = false;
                            }
                        }
                        if (traceList[traceIndex].Message.ToUpper().Contains(textBoxRUISearch.MyTextBox.Text.ToUpper()) && textBoxRUISearch.MyTextBox.Text != String.Empty)
                        {
                            bufferGraphics.FillRectangle(searchBrush, rect);
                        }
                        if (traceList[traceIndex].Selected)
                        {
                            //doesn't work correctly for the moment when scrolling
                            bufferGraphics.FillRectangle(selectedBrush, rect);
                            bufferGraphics.DrawString(data.Date, traceFont, selectedStringBrush, xTime, y);
                            bufferGraphics.DrawString(data.LevelString, traceFont, selectedStringBrush, xLevel, y);
                            bufferGraphics.DrawString(data.Source, traceFont, selectedStringBrush, xSource, y);
                            if (data.Attachment != null)
                            {
                                bufferGraphics.DrawString("Attachment : ", traceFont, selectedStringBrush, xMessage, y);
                                bufferGraphics.DrawString(data.Message, traceFont, selectedStringBrush, xMessage + (xMessage / 5), y);
                            }
                            else
                                bufferGraphics.DrawString(data.Message, traceFont, selectedStringBrush, xMessage, y);
                        }
                        else
                        {
                            bufferGraphics.DrawString(data.Date, traceFont, stringBrush, xTime, y);

                            // Info = 1, Warning = 2, Error = 3, Debug = 5, Special = 6
                            switch (data.LevelString)
                            {
                                case "Info":
                                    bufferGraphics.DrawString(data.LevelString, traceFont, brushInfo, xLevel, y);
                                    break;
                                case "Warning":
                                    bufferGraphics.DrawString(data.LevelString, traceFont, brushWarning, xLevel, y);
                                    break;
                                case "Error":
                                    bufferGraphics.DrawString(data.LevelString, traceFont, brushError, xLevel, y);
                                    break;
                                case "Debug":
                                    bufferGraphics.DrawString(data.LevelString, traceFont, brushDebug, xLevel, y);
                                    break;
                                default:
                                    break;
                            }
                            bufferGraphics.DrawString(data.Source, traceFont, stringBrush, xSource, y);

                            if (data.Attachment != null)
                            {
                                bufferGraphics.DrawString("Attachment : ", traceFont, brushAttachment, xMessage, y);
                                bufferGraphics.DrawString(data.Message, traceFont, stringBrush, xMessage + (xMessage / 5), y);
                            }
                            else
                                bufferGraphics.DrawString(data.Message, traceFont, stringBrush, xMessage, y);
                        }
                        bufferGraphics.DrawRectangle(Pens.LightGray, rect);
                        //
                        //                      if (data.selected)
                        //                      {
                        //                          Color color = Color.FromArgb(100, 0, 0, 255);
                        //                          Brush brush = new SolidBrush(color);
                        //                          _bufferGraphics.FillRectangle(brush, rect);
                        //                      }
                    }
                    else
                    {
                        if (listLines.ElementAtOrDefault(listLines.Count - 1) != null)
                            listLines.RemoveAt(listLines.Count - 1);

                        if (listLinesVisible.ElementAtOrDefault(listLinesVisible.Count - 1) != null)
                            listLinesVisible.RemoveAt(listLinesVisible.Count - 1);

                        y -= 20;
                    }
                }
                else
                    bufferGraphics.FillRectangle(brushUnderTraces, rect);

                y += 20;
                traceIndex++;
            }
        }
        this.panelTraces.Invalidate();

Dimana bufferGraphics adalah objek Grafik saya.


person Yohan Quiles    schedule 21.10.2019    source sumber
comment
Bagaimana dengan FillRectangle di awal mengisi seluruh bingkai dengan warna latar belakang?   -  person Thomas N    schedule 21.10.2019
comment
Kita perlu melihat kodenya!!! Apakah Anda menggunakan e.Graphics sesuai kebutuhan?   -  person TaW    schedule 21.10.2019
comment
Saya mengedit posting saya, Anda dapat melihat kodenya.   -  person Yohan Quiles    schedule 21.10.2019
comment
Di Acara Paint saya melakukan : e.Graphics.DrawImageUnscaled(backBuffer, 0, 0); di mana backbuffer adalah objek Bitmap saya   -  person Yohan Quiles    schedule 21.10.2019
comment
Jadi apakah bufferGraphics = e.Graphics? Juga: Apa pun yang Anda tambahkan ke Bitmap akan tetap ada sampai Anda menimpanya; tidak ada yang membuat bitmap tidak valid selain membersihkannya. - Mengapa menggunakan Bitmap karena Anda sedang mengkode acara Paint??? (Dan sebaliknya)   -  person TaW    schedule 21.10.2019
comment
Saya akan mencoba menghapus Bitmap sebelum menulis ulang. Dan saya menggunakan kode dari pengguna lain di perusahaan saya dan berfungsi dengan baik, saya harus memperbarui kode tersebut dan saya memulai dari awal karena beberapa komponen berbeda   -  person Yohan Quiles    schedule 21.10.2019
comment
Biasanya itu adalah Paint dengan e.Graphics atau menggambar menjadi Bimap. Yang terakhir bukan di event Paint tetapi ketika data telah berubah. Untuk yang pertama Invalidate bila data sudah berubah. Satu-satunya alasan mengapa seseorang menggabungkan keduanya adalah ketika terdapat sejumlah besar (›1k) aksi seri; lalu seseorang dapat menyimpan cache yang lebih lama dalam bitmap dan menggambar sisanya di atasnya.   -  person TaW    schedule 21.10.2019
comment
@TaW Refleksi Anda menarik. Sekarang Anda mengatakannya, saya pikir panel saya harus menyimpan undian terakhir (saya memiliki data yang dihasilkan setiap milidetik). Tapi saya ingin menghapus undian yang tidak saya perlukan.   -  person Yohan Quiles    schedule 21.10.2019
comment
Ya, saya tidak akan menggambar lebih sering daripada yang bisa dilihat mata manusia, apalagi membaca. Saya mengacu pada situasi seperti program menggambar. Mungkin kita harus tahu lebih banyak tentang pengaturan umum..   -  person TaW    schedule 21.10.2019
comment
Awalnya saya menggunakan DataGridView tetapi ketika data masuk DTG membutuhkan banyak waktu untuk menampilkan data. Jadi saya menerapkan Paint dan Data tiba dengan sangat cepat sekarang.   -  person Yohan Quiles    schedule 21.10.2019


Jawaban (1)


Oke, saya menemukan solusinya: Saya menggunakan suatu metode dan saya melukis setelahnya. Saya mengatur isi metode saya di Paint dan berfungsi dengan baik. Saya mengganti bufferGraphics dengan e.Graphics.

Terima kasih kepada orang-orang yang mencoba membantu saya (bahasa Inggris saya sangat buruk jadi selamat untuk memahami saya).

person Yohan Quiles    schedule 21.10.2019