У меня на панели несколько слоев рисунков

Я создал панель и поместил на нее текст с помощью DrawString и DrawRectangle. Чтобы нарисовать панель, я использую событие Paint и метод Invalidate, но когда вызывается Invalidate, я получаю следующий результат (с прозрачным задним цветом): Моя панель со шнурком

Как видите, текст нарисован, но то, что находится за ним, не исчезает, как если бы Invalidate наполовину выполнял свою работу.

Я установил для DoubleBuffered значение true и попробовал Graphics.Clear, но безуспешно.

Пожалуйста, кто-нибудь может мне помочь?

Вот код:

            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();

Где bufferGraphics - мой объект Graphics.


person Yohan Quiles    schedule 21.10.2019    source источник
comment
Как насчет FillRectangle в начале заливки всего кадра цветом фона?   -  person Thomas N    schedule 21.10.2019
comment
Нам нужно увидеть код !!! Вы используете e.Graphics по мере необходимости?   -  person TaW    schedule 21.10.2019
comment
Я отредактировал свой пост, вы можете увидеть код.   -  person Yohan Quiles    schedule 21.10.2019
comment
В событии рисования я делаю: e.Graphics.DrawImageUnscaled (backBuffer, 0, 0); где backbuffer - мой объект Bitmap   -  person Yohan Quiles    schedule 21.10.2019
comment
Так что такое bufferGraphics = e.Graphics? Также: все, что вы добавляете к растровому изображению, останется там, пока вы его не перезапишете; нет другого способа сделать растровое изображение недействительным, кроме его очистки. - Зачем вообще использовать Bitmap, если вы кодируете событие Paint ??? (И наоборот)   -  person TaW    schedule 21.10.2019
comment
Я постараюсь стереть растровое изображение, прежде чем перезаписывать его. И я использую код другого пользователя моей компании, и он работает нормально, мне нужно обновить код, и я начал с нуля, потому что некоторые компоненты отличаются   -  person Yohan Quiles    schedule 21.10.2019
comment
Обычно это либо Paint with e.Graphics, либо рисование в Bimap. Последнее не в событии Paint, а при изменении данных. Для бывшего Invalidate, когда данные изменились. Единственная причина, по которой их можно было бы объединить, - это когда существует огромное (›1k) количество действий отрисовки; затем можно кэшировать более старые в растровое изображение, а остальные нарисовать поверх него.   -  person TaW    schedule 21.10.2019
comment
@TaW Твое отражение интересно. Теперь вы это говорите, я думаю, что моя панель должна сохранять последнюю отрисовку (у меня данные генерируются каждые миллисекунды). Но я хочу удалить ненужную розыгрыш.   -  person Yohan Quiles    schedule 21.10.2019
comment
Что ж, я бы не стал рисовать чаще, чем может видеть человеческий глаз, не говоря уже о том, чтобы читать. Я имел в виду такие ситуации, как программа для рисования. Может быть, нам стоит узнать немного больше об общей настройке ..   -  person TaW    schedule 21.10.2019
comment
Вначале я использовал DataGridView, но когда данные поступают, DTG требует много времени для отображения данных. Итак, я реализовал Paint, и теперь данные прибывают очень быстро.   -  person Yohan Quiles    schedule 21.10.2019


Ответы (1)


Хорошо, я нашел решение: я использовал метод, а потом рисую. Я установил основную часть своего метода в Paint, и он отлично работает. Заменяю bufferGraphics на e.Graphics.

Спасибо людям, которые пытаются мне помочь (мой английский очень плохой, так что поздравляю, что меня понял).

person Yohan Quiles    schedule 21.10.2019