Не понятно, почему две панели работают по-разному - PullRequest
0 голосов
/ 21 июня 2019

У меня есть проблема, которая действительно смущает меня. Позвольте мне заложить немного фона. Я пытаюсь разработать свой собственный редактор контроля. Я хочу иметь мигающую карету, я знаю, что могу сделать это с помощью CreateCaret, ShowCaret и т. Д., Но это не то, как я хочу это делать, я хочу реализовать это сам. Моя каретка не мигает, и я не могу понять, почему.

Я пытаюсь реализовать это путем кэширования области под кареткой, а затем отображения каретки. Затем, через полсекунды, я перерисовываю кэшированные данные обратно в элемент управления редактора, создавая таким образом мигающую карету. Я пытался использовать только графический объект и растровое изображение для кэша, но ничего не получалось, но я думаю, что знаю почему. Поэтому я решил поэкспериментировать. Я создал одну панель на самой форме через конструктор, и одна из них была закодирована в самом классе Caret. Панель в форме работает, но панель, инкапсулированная в классе, не работает, и я не знаю почему. Мой вопрос почему?

Ниже приведен код. Метод BlinkTimer_Tick просто вызывает Blink. Краска просто красит каретку, ничего из этого не должно быть трудно понять.

BackupBackground копирует область под кареткой в ​​кэш, а RestoreBackground копирует кэш в элемент управления. Теперь проблема в том, что если вы закомментируете строки, закомментированные с «Работает, если эта строка закомментирована» в обоих методах, все это работает, но когда они не закомментированы, это не работает, курсор не мигает. Обе эти панели настроены одинаково.

    private void BlinkTimer_Tick(object sender, EventArgs e)
    {
        Paint();
        _BlinkTimer.Start();
    }

    private void BackupBackground(Graphics SrcGraph)
    {
        Form TF = _Parent.FindForm() as Form;
        Panel P = TF.Controls["_TestPanel"] as Panel;
        P = _Buffer; // Works if this line is Commentted out

        Graphics DestGraph = P.CreateGraphics();

        IntPtr SrcHDC = SrcGraph.GetHdc();
        IntPtr DestHDC = DestGraph.GetHdc();

        BitBlt(DestHDC, 0, 0, _Size.Width, _Size.Height,
               SrcHDC, _Location.X, _Location.Y, TernaryRasterOperations.SRCCOPY);

        DestGraph.ReleaseHdc(DestHDC);
        SrcGraph.ReleaseHdc(SrcHDC);
    }

    private void RestoreBackground(Graphics DestGraph)
    {
        Form TF = _Parent.FindForm() as Form;
        Panel P = TF.Controls["_TestPanel"] as Panel;
        P = _Buffer; // Works if this line is Commentted out

        Graphics SrcGraph = P.CreateGraphics();

        IntPtr SrcHDC = SrcGraph.GetHdc();
        IntPtr DestHDC = DestGraph.GetHdc();

        BitBlt(DestHDC, _Location.X, _Location.Y, _Size.Width, _Size.Height,
               SrcHDC, 0, 0, TernaryRasterOperations.SRCCOPY);

        DestGraph.ReleaseHdc(DestHDC);
        SrcGraph.ReleaseHdc(SrcHDC);
    }

    internal void Paint()
    {
        Graphics Graph = _Parent.CreateGraphics();
        if (!_BlinkOn)
        {
            // Restore Graphics from Backup
            RestoreBackground(Graph);

            _BlinkOn = true;
        }
        else
        {
            // Backup Graphics
            Graph.Flush();
            BackupBackground(Graph);

            // Draw Caret
            using (SolidBrush P = new SolidBrush(Color.Black))
            {
                Graph.FillRectangle(P, new Rectangle(_Location, _Size));
            }

            _BlinkOn = false;
        }
    }

Символ каретки должен мигать в обоих случаях, поскольку я ничего не меняю, но он мигает только при использовании панели в форме.

Примечание: я не собираюсь использовать Panel для кеша, на котором я только что экспериментировал, и нашел это поведение странным, поэтому мне нужно знать.

Спасибо, Дэнни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...