• Qt基础 界面镜像


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

    1.图片镜像

    先找到镜像窗口的句柄,保存成图片然后镜像

    1. #include
    2. QString ClassName("Qt5QWindowIcon");
    3. QString AppName = QStringLiteral("你的类型");
    4. LPCWSTR app = reinterpret_cast(ClassName.data());
    5. LPCWSTR appCaption = reinterpret_cast(AppName.data());
    6. HWND hwnd = FindWindow(app, appCaption);
    7. if (hwnd == NULL)
    8. {
    9. return;
    10. }
    11. CaptureWindow(hwnd, TEXT("D:\\screenshot.png"));
    1. void CNWMirrorDlg::CaptureWindow(HWND hWnd, LPCTSTR lpszFilePath)
    2. {
    3. // 获取窗口DC
    4. HDC hDC = ::GetDC(hWnd);
    5. // 获取窗口大小
    6. RECT rect;
    7. ::GetWindowRect(hWnd, &rect);
    8. int nWidth = rect.right - rect.left;
    9. int nHeight = rect.bottom - rect.top;
    10. // 创建兼容的DC
    11. HDC hMemDC = ::CreateCompatibleDC(hDC);
    12. // 创建位图
    13. CImage image;
    14. image.Create(nWidth, nHeight, 32);
    15. // 将位图选入兼容的DC
    16. HBITMAP hBitmap = (HBITMAP)::SelectObject(hMemDC, image);
    17. // 将窗口DC复制到兼容的DC
    18. ::BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY);
    19. // 将位图保存为图片
    20. image.Save(lpszFilePath);
    21. // 释放资源
    22. ::SelectObject(hMemDC, hBitmap);
    23. ::DeleteDC(hMemDC);
    24. ::ReleaseDC(hWnd, hDC);
    25. }

    2.屏幕截图

    与1类似不过是知道镜像窗口的大小,并截图转换成图片对象,缺点是由于是全图截屏,会出现鼠标情况,如果有同志解决留言告诉我方法

    1. QImage xxxxx::GetScreen(HWND winId)
    2. {
    3. RECT r;
    4. QImage image;
    5. QString ClassName("Qt5QWindowIcon");
    6. QString AppName = QStringLiteral("类名");
    7. LPCWSTR app = reinterpret_cast(ClassName.data());
    8. LPCWSTR appCaption = reinterpret_cast(AppName.data());
    9. HWND hwnd = FindWindow(app, appCaption);
    10. if (hwnd == NULL)
    11. {
    12. return image;
    13. }
    14. GetWindowRect(hwnd, &r);
    15. //hwnd = winId;
    16. //GetClientRect(hwnd, &r);
    17. int nWidght = r.right - r.left;
    18. int nHeight = r.bottom - r.top;
    19. HDC display_dc = GetDC(hwnd);
    20. HDC bitmap_dc = CreateCompatibleDC(display_dc);
    21. HBITMAP bitmap = CreateCompatibleBitmap(display_dc, nWidght, nHeight);
    22. HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap);
    23. bool bOk = BitBlt(bitmap_dc, 0, 0, nWidght, nHeight, display_dc, 0, 0, SRCCOPY | CAPTUREBLT);
    24. CURSORINFO ci;
    25. ci.cbSize = sizeof(CURSORINFO);
    26. GetCursorInfo(&ci);
    27. if ((ci.ptScreenPos.x > 0) && (ci.ptScreenPos.y > 0) && (ci.ptScreenPos.x < (0 + nWidght)) && (ci.ptScreenPos.y < (0 + nHeight)))
    28. DrawIcon(bitmap_dc, ci.ptScreenPos.x - 0, ci.ptScreenPos.y - 0, ci.hCursor);
    29. // clean up all but bitmap
    30. ReleaseDC(hwnd, display_dc);
    31. SelectObject(bitmap_dc, null_bitmap);
    32. DeleteDC(bitmap_dc);
    33. QPixmap pixmap = QtWin::fromHBITMAP(bitmap);
    34. DeleteObject(bitmap);
    35. image = pixmap.toImage();
    36. return image;
    37. }

    3.使用QTransform

    QTransform有好几种形式具体可以参考博客

    看了下构造由一下类型组成,

     当然我们操作视图还得用QGraphicsScene和View,详情介绍可以看下参考

     下面就直接给出部分代码,因为并不太难

    1. QWidget *m_pCopyShowPromptDlg;//需要镜像窗口 我贴了防止报错
    2. QWidget *m_pCopyWidget = new QWidget();
    3. QGraphicsScene* pScene = new QGraphicsScene();
    4. pScene->addWidget(m_pCopyShowPromptDlg, Qt::Widget);
    5. QGraphicsView* m_pCopyView = new QGraphicsView(pScene, m_pCopyWidget);
    6. //m_pCopyView->setInteractive(false);//QGraphicsView 不响应鼠标
    7. QTransform Transform(-1, 0, 0, 0, 1, 0, 0, 0, 1); //翻转
    8. m_pCopyView->setTransform(Transform);
    9. m_pCopyWidget->setFixedSize(m_pCopyShowPromptDlg->size()); //设置大小
    10. m_pCopyWidget->show();

    以上代码还有个问题是每当窗口放大或者缩小时候,镜像窗口该显示位置不正确,每次改变大小可以使用void QGraphicsView::fitInView方法

    参考

    [Qt5] QGraphics图形视图框架概述(Item、Scene和View)_丶布布的博客-CSDN博客

    【精选】Qt图形视图框架:QGraphicsView 详解_友善啊,朋友的博客-CSDN博客

    QTransform 进行平移、旋转、镜像等操作_北极熊的奋斗史的博客-CSDN博客

  • 相关阅读:
    jmeter-beanshell学习1-vars使用获取变量和设置变量
    vue 更新规则
    使用flex布局实现,7种经典布局案例
    如何用WebSocket打造Web端IM即时通讯聊天
    this指针
    Centos7 编写开机监测gdm服务退出的脚本
    【踩坑专栏】 Could not write JSON: No serializer found for class
    Jetsonnano B01 笔记7:Mediapipe与人脸手势识别
    机器学习(四十八):粒子群优化(PSO)-提升机器学习模型准确率的秘密武器
    java基于quasar实现协程池【后篇】
  • 原文地址:https://blog.csdn.net/qq_31565379/article/details/134420308