Feat: Z button ROI region, sends COMMAND_SCREEN_ROI to restrict capture area
This commit is contained in:
@@ -1730,7 +1730,7 @@ void CScreenSpyDlg::OnPaint()
|
||||
}
|
||||
}
|
||||
|
||||
// 绘制框选矩形(左键放大用红色,右键截图用绿色,二者颜色错开避免误操作)
|
||||
// 绘制框选矩形(左键放大用红色,右键截图用绿色,ROI用蓝色)
|
||||
if (m_bSelectingZoom || m_bSelectingShot) {
|
||||
CPoint ptStart = m_bSelectingZoom ? m_ptZoomStart : m_ptShotStart;
|
||||
CPoint ptCur = m_bSelectingZoom ? m_ptZoomCurrent : m_ptShotCurrent;
|
||||
@@ -1751,6 +1751,21 @@ void CScreenSpyDlg::OnPaint()
|
||||
DeleteObject(hPen);
|
||||
}
|
||||
|
||||
if (m_bSelectingROI) {
|
||||
CRect rcSelect;
|
||||
rcSelect.left = min(m_ptROIStart.x, m_ptROICurrent.x);
|
||||
rcSelect.top = min(m_ptROIStart.y, m_ptROICurrent.y);
|
||||
rcSelect.right = max(m_ptROIStart.x, m_ptROICurrent.x);
|
||||
rcSelect.bottom = max(m_ptROIStart.y, m_ptROICurrent.y);
|
||||
HPEN hPen = CreatePen(PS_DASH, 1, RGB(0, 120, 215));
|
||||
HPEN hOldPen = (HPEN)SelectObject(m_hFullDC, hPen);
|
||||
HBRUSH hOldBrush = (HBRUSH)SelectObject(m_hFullDC, GetStockObject(NULL_BRUSH));
|
||||
Rectangle(m_hFullDC, rcSelect.left, rcSelect.top, rcSelect.right, rcSelect.bottom);
|
||||
SelectObject(m_hFullDC, hOldBrush);
|
||||
SelectObject(m_hFullDC, hOldPen);
|
||||
DeleteObject(hPen);
|
||||
}
|
||||
|
||||
if ((m_bIsCtrl && m_Settings.RemoteCursor) || m_bIsTraceCursor) {
|
||||
CPoint ptLocal;
|
||||
GetCursorPos(&ptLocal);
|
||||
@@ -2880,6 +2895,30 @@ void CScreenSpyDlg::ResetZoom()
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
void CScreenSpyDlg::SendROICommand(const RECT& rc)
|
||||
{
|
||||
if (!m_bConnected) return;
|
||||
BYTE buf[1 + sizeof(RECT)];
|
||||
buf[0] = COMMAND_SCREEN_ROI;
|
||||
memcpy(buf + 1, &rc, sizeof(RECT));
|
||||
m_ContextObject->Send2Client(buf, sizeof(buf));
|
||||
}
|
||||
|
||||
void CScreenSpyDlg::ResetROI()
|
||||
{
|
||||
bool wasActive = m_bROIActive;
|
||||
m_bROIArmed = false;
|
||||
m_bROIActive = false;
|
||||
m_bSelectingROI = false;
|
||||
if (GetCapture() == this) ReleaseCapture();
|
||||
if (wasActive) { // ROI 未曾激活则不通知远程,避免不必要的 RestartScreen
|
||||
RECT rc = {0};
|
||||
SendROICommand(rc);
|
||||
}
|
||||
if (m_pToolbar) m_pToolbar->UpdateButtonIcons();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
// 屏幕坐标转原图坐标(考虑放大状态)
|
||||
CPoint CScreenSpyDlg::ScreenToImage(CPoint pt)
|
||||
{
|
||||
@@ -2938,6 +2977,15 @@ void CScreenSpyDlg::OnLButtonDown(UINT nFlags, CPoint point)
|
||||
{
|
||||
// 非控制模式下的放大功能
|
||||
if (!m_bIsCtrl && !m_bIsFirst && m_BitmapInfor_Full) {
|
||||
if (m_bROIArmed) {
|
||||
// ROI 待选状态:开始拖选 ROI 区域
|
||||
m_bROIArmed = false;
|
||||
m_bSelectingROI = true;
|
||||
m_ptROIStart = point;
|
||||
m_ptROICurrent = point;
|
||||
SetCapture();
|
||||
return;
|
||||
}
|
||||
if (m_bZoomedIn) {
|
||||
// 放大状态:开始拖拽平移
|
||||
m_bZoomDragging = true;
|
||||
@@ -2962,6 +3010,28 @@ void CScreenSpyDlg::OnLButtonUp(UINT nFlags, CPoint point)
|
||||
{
|
||||
// 处理放大功能的鼠标释放
|
||||
if (!m_bIsCtrl && !m_bIsFirst && m_BitmapInfor_Full) {
|
||||
if (m_bSelectingROI) {
|
||||
ReleaseCapture();
|
||||
m_bSelectingROI = false;
|
||||
CRect rcSelect;
|
||||
rcSelect.left = min(m_ptROIStart.x, point.x);
|
||||
rcSelect.top = min(m_ptROIStart.y, point.y);
|
||||
rcSelect.right = max(m_ptROIStart.x, point.x);
|
||||
rcSelect.bottom = max(m_ptROIStart.y, point.y);
|
||||
if (rcSelect.Width() < 20 || rcSelect.Height() < 20) {
|
||||
m_bROIArmed = true; // 框选太小,重新进入待选状态
|
||||
return;
|
||||
}
|
||||
CRect rcImage;
|
||||
if (ScreenRectToImageRect(rcSelect, rcImage)) {
|
||||
RECT rc = { rcImage.left, rcImage.top, rcImage.right, rcImage.bottom };
|
||||
SendROICommand(rc);
|
||||
m_bROIActive = true;
|
||||
}
|
||||
if (m_pToolbar) m_pToolbar->UpdateButtonIcons();
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_bSelectingZoom) {
|
||||
// 完成框选
|
||||
ReleaseCapture();
|
||||
@@ -3017,7 +3087,7 @@ void CScreenSpyDlg::OnRButtonDown(UINT nFlags, CPoint point)
|
||||
// 非控制模式下:右键框选 → 截图保存。控制模式下右键由 PreTranslateMessage 转发给客户端。
|
||||
if (!m_bIsCtrl && !m_bIsFirst && m_BitmapInfor_Full) {
|
||||
// 与左键互斥:左键正在框选/拖拽时不接管右键,避免冲突
|
||||
if (m_bSelectingZoom || m_bZoomDragging) {
|
||||
if (m_bSelectingZoom || m_bZoomDragging || m_bROIArmed || m_bSelectingROI) {
|
||||
return;
|
||||
}
|
||||
m_bSelectingShot = true;
|
||||
@@ -3174,6 +3244,11 @@ void CScreenSpyDlg::OnMouseMove(UINT nFlags, CPoint point)
|
||||
{
|
||||
// 处理放大功能的鼠标移动
|
||||
if (!m_bIsCtrl && !m_bIsFirst && m_BitmapInfor_Full) {
|
||||
if (m_bSelectingROI) {
|
||||
m_ptROICurrent = point;
|
||||
Invalidate(FALSE);
|
||||
return;
|
||||
}
|
||||
if (m_bSelectingZoom) {
|
||||
// 框选中:更新当前点并重绘选择框
|
||||
m_ptZoomCurrent = point;
|
||||
@@ -3320,7 +3395,7 @@ void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl)
|
||||
{
|
||||
m_bIsCtrl = ctrl;
|
||||
m_bIsTraceCursor = !m_bIsCtrl;
|
||||
// 进入控制模式时重置放大状态 + 中止任何正在进行的右键截图框选
|
||||
// 进入控制模式时重置放大状态 + 中止任何正在进行的右键截图/ROI框选
|
||||
if (m_bIsCtrl) {
|
||||
if (m_bZoomedIn) ResetZoom();
|
||||
if (m_bSelectingShot) {
|
||||
@@ -3328,6 +3403,13 @@ void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl)
|
||||
if (GetCapture() == this) ReleaseCapture();
|
||||
Invalidate(FALSE);
|
||||
}
|
||||
if (m_bROIArmed || m_bSelectingROI) {
|
||||
m_bROIArmed = false;
|
||||
m_bSelectingROI = false;
|
||||
if (GetCapture() == this) ReleaseCapture();
|
||||
if (m_pToolbar) m_pToolbar->UpdateButtonIcons();
|
||||
Invalidate(FALSE);
|
||||
}
|
||||
}
|
||||
SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO));
|
||||
// 控制模式:禁用本地 IME;查看模式:启用本地 IME
|
||||
@@ -3342,10 +3424,14 @@ void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl)
|
||||
void CScreenSpyDlg::OnCaptureChanged(CWnd* pWnd)
|
||||
{
|
||||
// 捕获丢失时重置框选/拖拽状态
|
||||
if (m_bSelectingZoom || m_bZoomDragging || m_bSelectingShot) {
|
||||
if (m_bSelectingZoom || m_bZoomDragging || m_bSelectingShot || m_bSelectingROI) {
|
||||
m_bSelectingZoom = false;
|
||||
m_bZoomDragging = false;
|
||||
m_bSelectingShot = false;
|
||||
if (m_bSelectingROI) {
|
||||
m_bSelectingROI = false;
|
||||
m_bROIArmed = true; // 保留待选状态,让用户可以重试
|
||||
}
|
||||
Invalidate();
|
||||
}
|
||||
__super::OnCaptureChanged(pWnd);
|
||||
|
||||
Reference in New Issue
Block a user