Visual C++ MFC CScrollView: курсор перестает мигать
Мой английский не идеален. Я использую Visual C ++ 2019 16.9.3 Community Edition с MFC, выпуск AMD64. Так относятся к однодокументным и многодокументным программам. Пример программы: однодокументная программа.
Базой класса View является CScrollView. Каретка мигает всего несколько секунд, после чего перестает мигать.
void CsdView::OnDraw(CDC *pDC) {
HideCaret();
CPoint const pos = GetDeviceScrollPosition();
CRect rect;
GetClientRect(&rect);
OffsetRect(&rect, pos.x, pos.y);
pDC->FillSolidRect(rect, 0xFFFFFF);
CFont font;
font.CreatePointFont(90, L"Consolas");
const auto oldfont = pDC->SelectObject(&font);
wchar_t a[12];
for (int y = (pos.y / 54) * 54; y < rect.bottom; y += 54)
pDC->TextOutW(8, y, _itow(y, a, 10));
pDC->SelectObject(oldfont);
ShowCaret();
}
void CsdView::OnInitialUpdate() {
CScrollView::OnInitialUpdate();
CScrollView::SetScrollSizes(MM_TEXT, { 2560, 40000 });
}
BOOL CsdView::OnEraseBkgnd(CDC *) {
return TRUE;
}
void CsdView::OnSize(UINT nType, int x, int y) {
CScrollView::OnSize(nType, x, y);
SetScrollSizes(MM_TEXT,
{2560, 40000},
{(x/20)*20, (y/54)*54},
{20, 54});
}
void CsdView::OnSetFocus(CWnd *pOldWnd) {
CScrollView::OnSetFocus(pOldWnd);
CreateSolidCaret(4, 48);
SetCaretPos({0, 0});
ShowCaret();
}
void CsdView::OnKillFocus(CWnd *pNewWnd) {
CScrollView::OnKillFocus(pNewWnd);
HideCaret();
}
Я использую монитор с высоким DPI, при настройке в Windows 3 * 96 dpi = 288 dpi.