Fix: clear residual image outside remote frame in non-adaptive scroll mode

This commit is contained in:
yuanyuanxiang
2026-06-07 21:04:16 +02:00
parent 1f538719a8
commit 96688166ba
2 changed files with 16 additions and 1 deletions

View File

@@ -1714,7 +1714,20 @@ void CScreenSpyDlg::OnPaint()
StretchBlt(m_hFullDC, 0, 0, dstW, dstH, m_hFullMemDC, 0, 0, srcW, srcH, SRCCOPY);
}
} else {
BitBlt(m_hFullDC, 0, 0, srcW, srcH, m_hFullMemDC, m_ulHScrollPos, m_ulVScrollPos, SRCCOPY);
// 实际可见的位图像素数 = 位图剩余宽高(去掉滚动偏移后)与窗口的较小值
int visW = max(0, min(srcW - (int)m_ulHScrollPos, dstW));
int visH = max(0, min(srcH - (int)m_ulVScrollPos, dstH));
if (visW > 0 && visH > 0)
BitBlt(m_hFullDC, 0, 0, visW, visH, m_hFullMemDC, m_ulHScrollPos, m_ulVScrollPos, SRCCOPY);
// 位图未覆盖的区域(远程分辨率小于窗口 / 滚动到边缘)填黑,防止残影
if (visW < dstW) {
RECT rc = { visW, 0, dstW, dstH };
FillRect(m_hFullDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
if (visH < dstH) {
RECT rc = { 0, visH, dstW, dstH };
FillRect(m_hFullDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
}
// 绘制框选矩形(左键放大用红色,右键截图用绿色,二者颜色错开避免误操作)
@@ -2177,6 +2190,7 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam)
}
ShowScrollBar(SB_BOTH, !m_bAdaptiveSize);
SysMenu->CheckMenuItem(IDM_ADAPTIVE_SIZE, m_bAdaptiveSize ? MF_CHECKED : MF_UNCHECKED);
Invalidate(FALSE); // 立即重绘,清除旧模式的残留画面
break;
}
case IDM_AUDIO_TOGGLE: {