提问人:cppRookie 提问时间:11/3/2023 最后编辑:cppRookie 更新时间:11/4/2023 访问量:70
TCalendarView 上的自定义绘制单元格会随着鼠标移动而消失
Custom drawn cells on TCalendarView vanish with mouse movements
问:
我正在尝试在事件中自定义 C++ Builder 11,以便将来将一些附加信息提取到单元格中。TCalendarView
OnDrawDayItem
当程序启动时,此图形本身工作正常。但是,一旦鼠标移动到单个单元格上,它们就会在鼠标光标下消失,而只是显示为空白。我不确定我在这里错过了什么。当我单击任何单元格时,所有内容都会再次正确重绘,直到我移动鼠标。
我不认为绘图代码真的很重要,但是下面是一个快速版本,只是为了测试它。但绘图本身不是重点,而是将鼠标移到细胞上时细胞消失的事实。
这是它的样子:
一旦鼠标移出日历,由于某种原因,所有单元格有时会被正确重绘,但并非总是如此。似乎在这里找不到机制,tbh。
我做错了什么?
void __fastcall TForm1::cvDrawDayItem(TObject *Sender, TDrawViewInfoParams *DrawParams,
TCellItemViewInfo *CalendarViewViewInfo)
{
DrawParams->Handled = true; // set true to draw cell myself
TCanvas *c = DrawParams->Canvas;
Word day, month, year;
DecodeDate (CalendarViewViewInfo->Date, year, month, day);
// check for weekend days
int dayOfWeek = CalendarViewViewInfo->Date.DayOfWeek();
// fill weekends with a different color
if (dayOfWeek==1 || dayOfWeek==7)
c->Brush->Color = TColor (0xeeeeee);
else // weekdays
c->Brush->Color = TColor (0xfcfcfc);
// get surrounding rect
TRect rect = CalendarViewViewInfo->GlobalRect;
// make drawing rect smaller to give a thin border
int buffer = 1;
rect.Inflate (-buffer, -buffer, -buffer, -buffer);
// fill the cell background
c->FillRect (rect);
// set up font for the days
c->Font->Name = "Segoe UI";
c->Font->Height = -20;
// print day in the center of the cell
c->TextRect (rect, DrawParams->Text, TTextFormat () << tfSingleLine << tfCenter << tfVerticalCenter);
// print abbreviated month on the first of the month
c->Font->Height = -15;
if (day==1)
{
c->TextRect (rect, DrawParams->GroupText, TTextFormat () << tfSingleLine << tfCenter << tfTop);
}
}
我正在考虑调用某个地方的方法,但我不知道在哪里以及如何调用,以及这是否是正确的方法。也许绘图方法本身在某个地方是错误的,但我有点卡在这里。在其他控件上,该属性有时会修复我可能遇到的绘图或特别闪烁的问题,但这在此控件上不可用。Invalidate()
TCalendarView
DoubleBuffered
编辑:好的,我现在尝试构建一个自己的类,该类继承并实现了调用 .这似乎是一个丑陋且非常错误的解决方法,但它有点成功。但是,当您移动鼠标时,它仍然会闪烁一点,因为单元格仍然在一瞬间空白。此外,当您从日视图到月视图或从月视图到年视图时,反之亦然,它会干扰动画。TCalendarView
OnMouseMove
OnMouseLeave
Invalidate()
有没有其他(可能更好)的方法来解决这个问题?
答: 暂无答案
评论