前几天遇到一个需求 镜像界面想到几个办法,先给效果图

1.图片镜像
先找到镜像窗口的句柄,保存成图片然后镜像
- #include
- QString ClassName("Qt5QWindowIcon");
- QString AppName = QStringLiteral("你的类型");
- LPCWSTR app = reinterpret_cast
(ClassName.data()); - LPCWSTR appCaption = reinterpret_cast
(AppName.data()); - HWND hwnd = FindWindow(app, appCaption);
-
- if (hwnd == NULL)
- {
- return;
- }
- CaptureWindow(hwnd, TEXT("D:\\screenshot.png"));
- void CNWMirrorDlg::CaptureWindow(HWND hWnd, LPCTSTR lpszFilePath)
- {
- // 获取窗口DC
- HDC hDC = ::GetDC(hWnd);
- // 获取窗口大小
- RECT rect;
- ::GetWindowRect(hWnd, &rect);
- int nWidth = rect.right - rect.left;
- int nHeight = rect.bottom - rect.top;
- // 创建兼容的DC
- HDC hMemDC = ::CreateCompatibleDC(hDC);
- // 创建位图
- CImage image;
- image.Create(nWidth, nHeight, 32);
- // 将位图选入兼容的DC
- HBITMAP hBitmap = (HBITMAP)::SelectObject(hMemDC, image);
- // 将窗口DC复制到兼容的DC
- ::BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY);
- // 将位图保存为图片
- image.Save(lpszFilePath);
- // 释放资源
- ::SelectObject(hMemDC, hBitmap);
- ::DeleteDC(hMemDC);
- ::ReleaseDC(hWnd, hDC);
- }
2.屏幕截图发
与1类似不过是知道镜像窗口的大小,并截图转换成图片对象,缺点是由于是全图截屏,会出现鼠标情况,如果有同志解决留言告诉我方法

- QImage xxxxx::GetScreen(HWND winId)
- {
-
- RECT r;
- QImage image;
- QString ClassName("Qt5QWindowIcon");
- QString AppName = QStringLiteral("类名");
- LPCWSTR app = reinterpret_cast
(ClassName.data()); - LPCWSTR appCaption = reinterpret_cast
(AppName.data()); - HWND hwnd = FindWindow(app, appCaption);
-
- if (hwnd == NULL)
- {
- return image;
- }
-
- GetWindowRect(hwnd, &r);
- //hwnd = winId;
- //GetClientRect(hwnd, &r);
- int nWidght = r.right - r.left;
- int nHeight = r.bottom - r.top;
- HDC display_dc = GetDC(hwnd);
- HDC bitmap_dc = CreateCompatibleDC(display_dc);
- HBITMAP bitmap = CreateCompatibleBitmap(display_dc, nWidght, nHeight);
- HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap);
- bool bOk = BitBlt(bitmap_dc, 0, 0, nWidght, nHeight, display_dc, 0, 0, SRCCOPY | CAPTUREBLT);
-
- CURSORINFO ci;
- ci.cbSize = sizeof(CURSORINFO);
- GetCursorInfo(&ci);
-
- if ((ci.ptScreenPos.x > 0) && (ci.ptScreenPos.y > 0) && (ci.ptScreenPos.x < (0 + nWidght)) && (ci.ptScreenPos.y < (0 + nHeight)))
- DrawIcon(bitmap_dc, ci.ptScreenPos.x - 0, ci.ptScreenPos.y - 0, ci.hCursor);
-
- // clean up all but bitmap
- ReleaseDC(hwnd, display_dc);
- SelectObject(bitmap_dc, null_bitmap);
- DeleteDC(bitmap_dc);
-
- QPixmap pixmap = QtWin::fromHBITMAP(bitmap);
-
- DeleteObject(bitmap);
- image = pixmap.toImage();
- return image;
-
- }
3.使用QTransform
QTransform有好几种形式具体可以参考博客
看了下构造由一下类型组成,


当然我们操作视图还得用QGraphicsScene和View,详情介绍可以看下参考
下面就直接给出部分代码,因为并不太难
- QWidget *m_pCopyShowPromptDlg;//需要镜像窗口 我贴了防止报错
- QWidget *m_pCopyWidget = new QWidget();
- QGraphicsScene* pScene = new QGraphicsScene();
- pScene->addWidget(m_pCopyShowPromptDlg, Qt::Widget);
- QGraphicsView* m_pCopyView = new QGraphicsView(pScene, m_pCopyWidget);
- //m_pCopyView->setInteractive(false);//QGraphicsView 不响应鼠标
- QTransform Transform(-1, 0, 0, 0, 1, 0, 0, 0, 1); //翻转
- m_pCopyView->setTransform(Transform);
- m_pCopyWidget->setFixedSize(m_pCopyShowPromptDlg->size()); //设置大小
- m_pCopyWidget->show();
以上代码还有个问题是每当窗口放大或者缩小时候,镜像窗口该显示位置不正确,每次改变大小可以使用void QGraphicsView::fitInView方法
参考
[Qt5] QGraphics图形视图框架概述(Item、Scene和View)_丶布布的博客-CSDN博客