У меня есть проблема, которая действительно смущает меня. Позвольте мне заложить немного фона. Я пытаюсь разработать свой собственный редактор контроля. Я хочу иметь мигающую карету, я знаю, что могу сделать это с помощью 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 для кеша, на котором я только что экспериментировал, и нашел это поведение странным, поэтому мне нужно знать.
Спасибо, Дэнни.