Fix: clear residual image outside remote frame in non-adaptive scroll mode
This commit is contained in:
@@ -5818,6 +5818,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
ack.status = CONN_AUTH_CLOCK_SKEW;
|
||||
Mprintf("[ConnAuth] %s: 时钟偏差 %lld 秒,拒绝\n",
|
||||
ContextObject->GetPeerName().c_str(), skew);
|
||||
PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg("Connection AUTH failed. Please check the client's time."), NULL);
|
||||
} else {
|
||||
BYTE sigInput[8 + 8 + 16];
|
||||
memcpy(sigInput, &pkt->clientID, 8);
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user