diff --git a/LedOK/LedOK Express.pro b/LedOK/LedOK Express.pro index 98b3c88..f7f83b8 100644 --- a/LedOK/LedOK Express.pro +++ b/LedOK/LedOK Express.pro @@ -11,6 +11,8 @@ greaterThan(QT_MAJOR_VERSION, 5) { CONFIG += c++20 } else { CONFIG += c++17 + QMAKE_CFLAGS += /utf-8 + QMAKE_CXXFLAGS += /utf-8 } CONFIG += lrelease diff --git a/LedOK/oescreenshot/oeamplifier.cpp b/LedOK/oescreenshot/oeamplifier.cpp deleted file mode 100644 index 785823a..0000000 --- a/LedOK/oescreenshot/oeamplifier.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - - - -#include "oeamplifier.h" - - -#include -#include - -#ifndef QT_NO_DEBUG -#include -#endif - - -#include "oecommonhelper.h" - -OEAmplifier::OEAmplifier(std::shared_ptr originPainting, QWidget *parent) : - QWidget(parent), originPainting_(originPainting) { - /// 设置成无边框对话框 - setWindowFlags(Qt::FramelessWindowHint|Qt::WindowSystemMenuHint); - /// 开启鼠标实时追踪 - setMouseTracking(true); - - /// 设置默认大小 - sideLength_ = 122 * OECommonHelper::getWindowHeightMultiplyingPower(); - imageHeight_ = 90 * OECommonHelper::getWindowHeightMultiplyingPower(); - setFixedSize(sideLength_,sideLength_); - - /// 默认隐藏 - hide(); -} - -void OEAmplifier::onSizeChange(int w, int h) { - screenSize_ = QSize(w, h); -} - -void OEAmplifier::onPostionChange(int x, int y) { - cursorPoint_ = QPoint(x, y); - raise(); - int dest_x = x + 4; - int dest_y = y + 26; - - /// 超出屏幕检测 - const QSize& parent_size = parentWidget()->size(); - if (dest_y + height() > parent_size.height()) { - dest_y = y - 26 - height(); - } - if (dest_x + width() > parent_size.width()) { - dest_x = x - 4 - width(); - } - - move(dest_x, dest_y); -} - - - -/// 绘制鼠标拖拽时选区矩形的右下顶点的放大图; -void OEAmplifier::paintEvent(QPaintEvent *) { - QPainter painter(this); - - /// 绘制背景 - painter.fillRect(rect(), QColor(0, 0, 0, 160)); - - QPixmap endPointImage; - /// 绘制放大图; - const QSize& parent_size = parentWidget()->size(); - /** - * @bug : 在屏幕边缘绘制放大图时会出现图片拉伸 - * 这里暂时做了边缘检测,若是屏幕边缘则不进行放大图的绘制,和QQ截图的采取方式是一致的。 - * - * @marker: 颜色还是照样识别,但是局部放大的效果暂时禁用 - * - * @note : 解决方法,可以发现边缘时,将不能放大的地方,不描绘,或填充黑色,以避免图片被非预期的拉伸问题。 - */ - if ((cursorPoint_.x() + 15 < parent_size.width() && cursorPoint_.x() - 15 > 0) - && (cursorPoint_.y() + 11 < parent_size.height() && cursorPoint_.y() - 11 > 0)) { - endPointImage = originPainting_-> - copy(QRect(cursorPoint_.x() - 15, - cursorPoint_.y() - 11, 30, 22)) - .scaled(sideLength_, imageHeight_); - painter.drawPixmap(0,0, endPointImage); - } - else { - endPointImage = originPainting_-> - copy(QRect(cursorPoint_.x() - 15, - cursorPoint_.y() - 11, 30, 22)); - } - - - /// 绘制十字 - painter.setPen(QPen(QColor(0, 180, 255 , 180), 4)); - // 竖线; - painter.drawLine(QPoint(sideLength_ >> 1, 0), - QPoint(sideLength_ >> 1, - imageHeight_ - 4)); - // 横线; - painter.drawLine(QPoint(0, imageHeight_ >> 1), - QPoint(sideLength_, - imageHeight_ >> 1)); - - /// 绘制大图内边框 - painter.setPen(QPen(Qt::white, 2)); - painter.drawRect(2,2,width()-4, imageHeight_-4); - - /// 绘制外边框 - painter.setPen(QPen(Qt::black, 1)); - painter.drawRect(0,0,width()-1,height()-1); - - /// 当前选中矩形的宽高信息; - QString select_screen_info = QString("%1×%2") - .arg(screenSize_.width()).arg(screenSize_.height()); - - /// 当前鼠标像素值的RGB信息 - QImage image = originPainting_->toImage(); - QColor cursor_pixel = image.pixel(cursorPoint_); - QString select_pt_rgb = QString("RGB:(%1,%2,%3)") - .arg(cursor_pixel.red()) - .arg(cursor_pixel.green()) - .arg(cursor_pixel.blue()); - - /// 绘制坐标轴相关数据 - painter.setPen(Qt::white); - painter.drawText(QPoint(6, imageHeight_+14),select_screen_info); - painter.drawText(QPoint(6, imageHeight_+27),select_pt_rgb); -} diff --git a/LedOK/oescreenshot/oeamplifier.h b/LedOK/oescreenshot/oeamplifier.h deleted file mode 100644 index 3643152..0000000 --- a/LedOK/oescreenshot/oeamplifier.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - - - -#ifndef OEAMPLIFIER_H -#define OEAMPLIFIER_H -#include -#include - - -/** - * @class : OEAmplifier - * @brief : 放大取色器 - * @note : 关于鼠标位置局部放大的操作以及色卡取值的操作 - */ -class OEAmplifier : public QWidget -{ - Q_OBJECT -public: - explicit OEAmplifier(std::shared_ptr originPainting, QWidget *parent = 0); - -signals: - -public slots: - - - /** - * @brief : 大小修改 - * @param : w 宽度 - * @param : h 高度 - * @date : 2017年4月29日 - */ - void onSizeChange(int w, int h); - - /** - * @brief : 大小修改 - * @param : w 宽度 - * @param : h 高度 - * @date : 2017年4月29日 - */ - void onPostionChange(int x, int y); - -protected: - - /** - * @brief : 窗口自绘事件 - * @date : 2017年4月29日 - */ - virtual void paintEvent(QPaintEvent *); - -private: - - /// 外部组件的大小信息 - QSize screenSize_; - /// 鼠标的位置 - QPoint cursorPoint_; - /// 取色放大器的边长 - int sideLength_; - /// 放大区的高度 - int imageHeight_; - /// 屏幕原画 - std::shared_ptr originPainting_; - -}; - -#endif /// OEAMPLIFIER_H diff --git a/LedOK/oescreenshot/oecommonhelper.cpp b/LedOK/oescreenshot/oecommonhelper.cpp deleted file mode 100644 index d361f21..0000000 --- a/LedOK/oescreenshot/oecommonhelper.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - - -#include "oecommonhelper.h" - -#include -#include -#include -#include -#include - -#include - -#ifndef QT_NO_DEBUG -#include -#endif - - -#define WINDOW_BASESIZE_WIDTH (1920) -#define WINDOW_BASESIZE_HEIGHT (1080) - -float OECommonHelper::widthMultiplyingPower_ = 0; -float OECommonHelper::heightMultiplyingPower_ = 0; - -void OECommonHelper::setStyle(const QString &style) { - QFile qss(style); - qss.open(QFile::ReadOnly); - qApp->setStyleSheet(qss.readAll()); - qss.close(); -} - -void OECommonHelper::setLanguagePack(const QString &language) { - // 加载中文包 - QTranslator translator; - translator.load(language); - qApp->installTranslator(&translator); -} - -void OECommonHelper::moveCenter(QWidget *widget, QRect parentRect) { - if (parentRect.isEmpty()) { - parentRect = QApplication::desktop()->rect(); - } - widget->move (((parentRect.width() - widget->width()) >> 1), - ((parentRect.height() - widget->height()) >> 1)); -} - -const float &OECommonHelper::getWindowWidthMultiplyingPower() { - if (widthMultiplyingPower_ == 0) { - upWindowSizeMultiplyingPower(); - } - return widthMultiplyingPower_; -} - -const float & OECommonHelper::getWindowHeightMultiplyingPower() { - if (heightMultiplyingPower_ == 0) { - upWindowSizeMultiplyingPower(); - } - return heightMultiplyingPower_; -} - -void OECommonHelper::upWindowSizeMultiplyingPower() { - QSize temp_size = QApplication::desktop()->size(); - widthMultiplyingPower_ = (float)temp_size.width() - / (float)WINDOW_BASESIZE_WIDTH; - heightMultiplyingPower_ = (float)temp_size.height() - / (float)WINDOW_BASESIZE_HEIGHT; -} - -bool OECommonHelper::getSmallestWindowFromCursor(QRect& out_rect) { - HWND hwnd; - POINT pt; - // 获得当前鼠标位置 - ::GetCursorPos(&pt); - // 获得当前位置桌面上的子窗口 - hwnd = ::ChildWindowFromPointEx(::GetDesktopWindow(), pt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE); - if (hwnd != NULL) { - HWND temp_hwnd; - temp_hwnd = hwnd; - while (true) { - ::GetCursorPos(&pt); - ::ScreenToClient(temp_hwnd, &pt); - temp_hwnd = ::ChildWindowFromPointEx(temp_hwnd, pt, CWP_SKIPINVISIBLE); - if (temp_hwnd == NULL || temp_hwnd == hwnd) - break; - hwnd = temp_hwnd; - } - RECT temp_window; - ::GetWindowRect(hwnd, &temp_window); - out_rect.setRect(temp_window.left,temp_window.top, - temp_window.right - temp_window.left, - temp_window.bottom - temp_window.top); - return true; - } - return false; -} - -bool OECommonHelper::getCurrentWindowFromCursor(QRect &out_rect) -{ - HWND hwnd; - POINT pt; - // 获得当前鼠标位置 - ::GetCursorPos(&pt); - // 获得当前位置桌面上的子窗口 - hwnd = ::ChildWindowFromPointEx(::GetDesktopWindow(), pt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE); - if (hwnd != NULL) { - RECT temp_window; - ::GetWindowRect(hwnd, &temp_window); - out_rect.setRect(temp_window.left, temp_window.top, - temp_window.right - temp_window.left, - temp_window.bottom - temp_window.top); - return true; - } - return false; -} diff --git a/LedOK/oescreenshot/oecommonhelper.h b/LedOK/oescreenshot/oecommonhelper.h deleted file mode 100644 index 30d3c96..0000000 --- a/LedOK/oescreenshot/oecommonhelper.h +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - - - -#ifndef COMMONHELPER_H -#define COMMONHELPER_H -#include -#include - -class QWidget; - -/** - * @class : OECommonHelper - * @brief : 通用助手 - * @note : 完成一些比较常用又通用的功能 - */ -class OECommonHelper -{ -public: - - /** - * @brief : 设置QSS文件 - * @param : style 文件名 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - * @remark: 如果是qrc路径,请带上 qrc:/ - **/ - static void setStyle(const QString &style); - - /** - * @brief : 设置语言包 - * @param : language 语言包的文件名 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static void setLanguagePack(const QString& language); - - /** - * @brief : 将窗口移动到中心 - * @param : widget 要移动的窗口 - * @param : parentRect 矩形几何数据 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static void moveCenter(QWidget* widget, QRect parentRect = {}); - - - /** - * @brief : 获得当前界面与开发时的界面之间的横向倍率 - * @return: float 倍率 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static const float& getWindowWidthMultiplyingPower(void); - - - /** - * @brief : 获得当前界面与开发时的界面之间的纵向倍率 - * @return: float 倍率 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static const float& getWindowHeightMultiplyingPower(void); - - - /** - * @brief : 获得当前鼠标位置最小的子窗口 - * @param : out_rect 矩形 (返回) - * @return: 成功:true - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static bool getSmallestWindowFromCursor(QRect &out_rect); - - /** - * @brief : 获得当前鼠标位置的窗口 - * @param : out_rect 矩形 (返回) - * @return: 成功:true - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static bool getCurrentWindowFromCursor(QRect &out_rect); - -protected: - - /** - * @brief : 更新窗口倍率 - * @author: 陈鲁勇 - * @date : 2017年04月10日 - **/ - static void upWindowSizeMultiplyingPower(void); - - -private: - /// 窗口横向倍率 - static float widthMultiplyingPower_; - /// 窗口纵向倍率 - static float heightMultiplyingPower_; -}; - -#endif /// COMMONHELPER_H diff --git a/LedOK/oescreenshot/oemodelview.cpp b/LedOK/oescreenshot/oemodelview.cpp deleted file mode 100644 index 3f9f81c..0000000 --- a/LedOK/oescreenshot/oemodelview.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "oemodelview.h" - -#include -#include -#include -#include -#include -/// @test : 测试变量 -QPoint startPoint_; -QPoint endPoint_; - - -OEModelView::OEModelView(MODEL model, - QWidget *parent) : QWidget(parent), - color_(Qt::red) { - /// 确定画图样式 - switch (model) { - case MODEL::Arrows: - { - drawFunc_ = &OEModelView::drawArrows; - break; - } - default: - { - drawFunc_ = &OEModelView::drawArrows; - } - } -} - - -void OEModelView::paintEvent(QPaintEvent *) { - QPainter paiter(this); - - /// @test : 测试变量 - startPoint_ = QPoint(width(),height()); - endPoint_ = {}; - - /// 绘制图形 - (this->*drawFunc_)(startPoint_, endPoint_, paiter); -} - - -void OEModelView::drawArrows(const QPoint& startPoint, - const QPoint& endPoint, - QPainter &paiter) { - /// 消锯齿 - paiter.setRenderHint(QPainter::Antialiasing, true); - /// 创建画笔,设置画刷 - QPen pen; - pen.setColor(color_); - pen.setWidth(1); - paiter.setPen(pen); - paiter.setBrush(color_); - - - /// 箭头部分三角形的腰长 - double par = 15.0; - double slopy = atan2((endPoint.y() - startPoint.y()), - (endPoint.x() - startPoint.x())); - double cos_y = cos(slopy); - double sin_y = sin(slopy); - QPoint head_point1 = QPoint(endPoint.x() + int(-par*cos_y - (par / 2.0 * sin_y)), - endPoint.y() + int(-par*sin_y + (par / 2.0 * cos_y))); - QPoint head_point2 = QPoint(endPoint.x() + int(-par*cos_y + (par / 2.0 * sin_y)), - endPoint.y() - int(par / 2.0*cos_y + par * sin_y)); - QPoint head_points[3] = { endPoint, head_point1, head_point2 }; - /// 绘制箭头部分 - paiter.drawPolygon(head_points, 3); - - - /// 计算箭身部分 - int offset_x = int(par*sin_y / 3); - int offset_y = int(par*cos_y / 3); - QPoint body_point1, body_point2; - body_point1 = QPoint(endPoint.x() + int(-par*cos_y - (par / 2.0*sin_y)) + - offset_x, endPoint.y() + int(-par*sin_y + (par / 2.0*cos_y)) - offset_y); - body_point2 = QPoint(endPoint.x() + int(-par*cos_y + (par / 2.0*sin_y) - offset_x), - endPoint.y() - int(par / 2.0*cos_y + par*sin_y) + offset_y); - QPoint body_points[3] = { startPoint, body_point1, body_point2 }; - /// 绘制箭身部分 - paiter.drawPolygon(body_points, 3); - -} -void OEModelView::onColor(const QColor &color) { - color_ = color; -} diff --git a/LedOK/oescreenshot/oemodelview.h b/LedOK/oescreenshot/oemodelview.h deleted file mode 100644 index 56eeff9..0000000 --- a/LedOK/oescreenshot/oemodelview.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef OEMODELVIEW_H -#define OEMODELVIEW_H - -#include -#include -#include -#include - -class OEModelView : public QWidget -{ - Q_OBJECT - -public: - - /** - * @brief : 模型种类 - */ - enum MODEL{ - Arrows = 0, /// 箭头 - Rectangle = 1, /// 矩形 - Roundness /// 圆形 - }; - -private: - typedef void (OEModelView::*PDRAWFUNC) - (const QPoint &,const QPoint &, QPainter&); - - -signals: - -public: - explicit OEModelView(MODEL model = MODEL::Arrows, - QWidget *parent = 0); - -protected: - - /** - * @brief : 自绘事件 - */ - virtual void paintEvent(QPaintEvent *); - -private: - - void drawArrows(const QPoint &startPoint, - const QPoint &endPoint, - QPainter& paiter); - -public slots: - - void onColor(const QColor &color); - -private: - QColor color_; - PDRAWFUNC drawFunc_; - /// @bug : 莫名,开启此处变量的声明,程序就会崩溃。 -// QPoint ssPoint331_; -// QPoint esoint233_; -}; - - -#endif // OEMODELVIEW_H diff --git a/LedOK/oescreenshot/oescreenshot.cpp b/LedOK/oescreenshot/oescreenshot.cpp deleted file mode 100644 index fdece1e..0000000 --- a/LedOK/oescreenshot/oescreenshot.cpp +++ /dev/null @@ -1,768 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - -#include "oescreenshot.h" - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef QT_NO_DEBUG -#include -#endif - -#include - -#include "oeamplifier.h" -#include "oecommonhelper.h" - - -/// 鼠标按钮图片的十六进制数据 -static const unsigned char uc_mouse_image[] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52 - ,0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x2D, 0x08, 0x06, 0x00, 0x00, 0x00, 0x52, 0xE9, 0x60 - ,0xA2, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B - ,0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x01, 0x40, 0x49, 0x44, 0x41, 0x54, 0x58, 0x85 - ,0xED, 0xD5, 0x21, 0x6E, 0xC3, 0x30, 0x14, 0xC6, 0xF1, 0xFF, 0x9B, 0xC6, 0x36, 0x30, 0x38, 0xA9 - ,0x05, 0x01, 0x05, 0x81, 0x05, 0x03, 0x39, 0xCA, 0x60, 0x8F, 0xD2, 0x03, 0xEC, 0x10, 0x3B, 0x46 - ,0xC1, 0xC0, 0xC6, 0x0A, 0x3B, 0x96, 0xB1, 0x80, 0x82, 0xC1, 0x56, 0x2A, 0xFF, 0x06, 0xE2, 0x36 - ,0x75, 0x9A, 0xB4, 0xCA, 0xEC, 0x4E, 0x9A, 0xE4, 0x2F, 0xB2, 0x42, 0x22, 0xFF, 0xF2, 0xFC, 0x9C - ,0x18, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0xFE, 0x55, 0xE4, 0xC6, 0xA0 - ,0xDC, 0xC4, 0x71, 0x87, 0xC1, 0xC1, 0x68, 0x01, 0xCC, 0x06, 0xC2, 0x51, 0xD0, 0x29, 0xB0, 0x18 - ,0x00, 0xDF, 0xC6, 0x40, 0x33, 0x37, 0x84, 0x30, 0x4C, 0x80, 0x85, 0xCE, 0x7B, 0x2E, 0x2A, 0x91 - ,0x84, 0x24, 0xBE, 0x25, 0xDE, 0x25, 0x5E, 0x2F, 0x6E, 0xAE, 0xD0, 0x37, 0x92, 0x10, 0xF0, 0x09 - ,0x54, 0x40, 0xE9, 0xEE, 0x15, 0xC6, 0xA2, 0x77, 0xFE, 0xE0, 0xE5, 0x85, 0x8F, 0x16, 0x58, 0xDF - ,0x35, 0x06, 0x5B, 0xD3, 0xB9, 0xD4, 0x11, 0xD0, 0xA5, 0x8F, 0xDE, 0x57, 0x75, 0x83, 0x73, 0x50 - ,0x06, 0xF6, 0x72, 0x0A, 0x47, 0x40, 0x57, 0x0D, 0x38, 0xDE, 0xC0, 0x04, 0x6F, 0x68, 0x05, 0x36 - ,0xF5, 0xE1, 0x08, 0x3D, 0xCD, 0xEA, 0xEA, 0x5A, 0xD8, 0xBE, 0x5A, 0x46, 0xB0, 0x05, 0x1E, 0xAC - ,0xF1, 0xC2, 0xD1, 0xCC, 0x01, 0x6D, 0x74, 0x02, 0xDB, 0x3B, 0xBF, 0xD3, 0x73, 0x07, 0x87, 0x2F - ,0xEF, 0x53, 0x07, 0x38, 0x82, 0x2F, 0xF6, 0xFB, 0xB8, 0x81, 0x73, 0x41, 0x69, 0x28, 0x3A, 0x7A - ,0x5C, 0xDD, 0x73, 0xCF, 0x3A, 0x86, 0xA3, 0x05, 0x87, 0xEA, 0xCC, 0x60, 0xA1, 0x06, 0x75, 0x89 - ,0xFE, 0x77, 0x92, 0x76, 0x68, 0x23, 0xEF, 0x88, 0xD3, 0x4C, 0xA8, 0x10, 0x7A, 0xD4, 0xEF, 0x8E - ,0xBE, 0x8B, 0x68, 0x79, 0x3A, 0xB1, 0x72, 0xE1, 0xAE, 0xBC, 0x13, 0x0D, 0xDE, 0xBD, 0x3D, 0xF3 - ,0x08, 0x15, 0xD4, 0xDF, 0x4C, 0x06, 0x36, 0xF7, 0x9E, 0x09, 0xED, 0xE9, 0x99, 0x97, 0x3E, 0x42 - ,0xFF, 0x30, 0x42, 0x4B, 0xA1, 0x8D, 0xD8, 0xE9, 0x2A, 0xBD, 0xED, 0x41, 0x25, 0x2A, 0x89, 0x37 - ,0x1F, 0xBD, 0xEA, 0x61, 0x8B, 0x5F, 0xDD, 0xC1, 0xFA, 0x01, 0xD8, 0xA3, 0x8F, 0xFB, 0xCA, 0x70 - ,0x16, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; - - - -OEScreenshot * OEScreenshot::self_ = nullptr; -bool OEScreenshot::isActivity_ = false; -bool OEScreen::isInit_ = false; - -OEScreenshot::OEScreenshot(QWidget *parent) : QWidget(parent), - isLeftPressed_ (false), backgroundScreen_(nullptr), - originPainting_(nullptr), screenTool_(nullptr) { - /// 初始化鼠标 - initCursor(); - /// 截取屏幕信息 - initGlobalScreen(); - /// 初始化鼠标放大器 - initAmplifier(); - /// 初始化大小感知器 - initMeasureWidget(); - /// 全屏窗口 - showFullScreen(); - /// 窗口与显示屏对齐 - setGeometry(getScreenRect()); - /// 霸道置顶 - onEgoistic(); - /// 开启鼠标实时追踪 - setMouseTracking(true); - /// 更新鼠标的位置 - emit cursorPosChange(cursor().pos().x(), cursor().pos().y()); - /// 更新鼠标区域窗口 - updateMouse(); - /// 展示窗口 - show(); -} - -OEScreenshot::~OEScreenshot(void) { -} - -/** - * @brief:窗口实例 - * @return:OEScreenshot - */ -OEScreenshot *OEScreenshot::Instance(void) { - if (!isActivity_ && self_) { - destroy(); - } - static QMutex mutex; - if (!self_) { - QMutexLocker locker(&mutex); - if (!self_) { - isActivity_ = true; - self_ = new OEScreenshot; - } - } - return self_; -} - -void OEScreenshot::destroy(void) { - if (!isActivity_ && self_) { - delete self_; - self_ = nullptr; - } -} - -void OEScreenshot::hideEvent(QHideEvent *) { - isActivity_ = false; -} - - -void OEScreenshot::closeEvent(QCloseEvent *) { - isActivity_ = false; -} - -void OEScreenshot::mouseDoubleClickEvent(QMouseEvent *) { - emit doubleClick(); -} - - -/** - * 初始化放大镜 (色彩采集器) - */ -void OEScreenshot::initAmplifier(std::shared_ptr originPainting) { - std::shared_ptr temp_pm = originPainting; - if (temp_pm == nullptr) { - temp_pm = originPainting_; - } - amplifierTool_.reset(new OEAmplifier(temp_pm, this)); - connect(this,SIGNAL(cursorPosChange(int,int)), - amplifierTool_.get(), SLOT(onPostionChange(int,int))); - amplifierTool_->show(); - amplifierTool_->raise(); -} - -void OEScreenshot::initMeasureWidget(void) -{ - rectTool_.reset(new OERect(this)); - rectTool_->raise(); -} - -/** - * 功能:获得当前屏幕的大小 - */ -const QRect &OEScreenshot::getScreenRect(void) { - if (!desktopRect_.isEmpty()) { - return desktopRect_; - } - /// 获得屏幕个数 - int temp_screen_num = QApplication::screens().size(); - /// 获得屏幕大小 - desktopRect_ = QApplication::desktop()->rect(); - if (temp_screen_num != 1) { - /// 多屏幕策略 - const int& temp = desktopRect_.width() - - (desktopRect_.width() / temp_screen_num); - /// 重新设置矩形 - desktopRect_ = QRect(-temp, 0, - desktopRect_.width(), desktopRect_.height()); - } - return desktopRect_; -} - -std::shared_ptr OEScreenshot::initGlobalScreen(void) { - if (backgroundScreen_.get() != nullptr) { - return backgroundScreen_; - } - /// 获得屏幕原画 - std::shared_ptr temp_screen = getGlobalScreen(); - - /// 制作暗色屏幕背景 - QPixmap temp_dim_pix(temp_screen->width(), temp_screen->height()); - temp_dim_pix.fill((QColor(0, 0, 0, 160))); - backgroundScreen_.reset(new QPixmap(*temp_screen)); - QPainter p(backgroundScreen_.get()); - p.drawPixmap(0, 0, temp_dim_pix); - - return backgroundScreen_; -} - -/* - * 获得屏幕的原画 - * 返回:QPixmap* 指针 - */ -std::shared_ptr OEScreenshot::getGlobalScreen(void) { - if (originPainting_.get() == nullptr) { - /// 截取当前桌面,作为截屏的背景图 - QScreen *screen = QGuiApplication::primaryScreen(); - const QRect& temp_rect = getScreenRect(); - originPainting_.reset(new QPixmap(screen->grabWindow(0, temp_rect.x(), - temp_rect.y(), temp_rect.width(), - temp_rect.height()))); - } - return originPainting_; -} -void OEScreenshot::onEgoistic(void) -{ - /// 窗口置顶 -#ifdef Q_OS_WIN32 - // SetWindowPos(HWND)this->winId(),HWND_TOPMOST,this->pos().x(),this->pos().y(),this->width(),this->height(),SWP_SHOWWINDOW); -#else - Qt::WindowFlags flags = windowFlags(); - flags |= Qt::WindowStaysOnTopHint; - setWindowFlags(flags); -#endif -} - -/* - * 初始化鼠标 - * 参数:_ico 鼠标图片的资源文件 - */ -void OEScreenshot::initCursor(const QString& ico) { - QPixmap pixmap; - if (ico.isEmpty()) { - pixmap.loadFromData(uc_mouse_image, sizeof(uc_mouse_image)); - } - else { - pixmap.load(ico); - } - QCursor cursor; - cursor = QCursor(pixmap, 15, 23); - setCursor(cursor); -} - -std::shared_ptr OEScreenshot::createScreen(const QPoint &pos) { - if (screenTool_.get() == nullptr) { - /// 创建截图器 - screenTool_.reset(new OEScreen(originPainting_, pos, this)); - /// 建立信号连接 - connect (this, SIGNAL(cursorPosChange(int,int)), - screenTool_.get(),SLOT(onMouseChange(int,int))); - /// 建立主界面双击保存信号关联 - connect (this, SIGNAL(doubleClick()), - screenTool_.get(),SLOT(onSaveScreen())); - /// 建立截图器大小关联 - connect(screenTool_.get(), SIGNAL(sizeChange(int,int)), - rectTool_.get(), SLOT(onSizeChange(int,int))); - connect(screenTool_.get(), SIGNAL(sizeChange(int,int)), - amplifierTool_.get(), SLOT(onSizeChange(int,int))); - /// 建立截图器与感知器的位置关联 - connect(screenTool_.get(), SIGNAL(postionChange(int,int)), - rectTool_.get(), SLOT(onPostionChange(int,int))); - - /// 获得截图器当前起始位置 - startPoint_ = pos; - isLeftPressed_ = true; - } - return screenTool_; -} - -void OEScreenshot::destroyScreen() { - if (screenTool_.get() != nullptr) { - /// 断开信号资源 - disconnect (this, SIGNAL(doubleClick()), - screenTool_.get(),SLOT(onSaveScreen())); - disconnect(screenTool_.get(), SIGNAL(sizeChange(int,int)), - rectTool_.get(), SLOT(onSizeChange(int,int))); - disconnect(screenTool_.get(), SIGNAL(postionChange(int,int)), - rectTool_.get(), SLOT(onPostionChange(int,int))); - /// 清理工具 - screenTool_.reset(); - screenTool_ = nullptr; - isLeftPressed_ = false; - update(); - return; - } -} - -void OEScreenshot::mousePressEvent(QMouseEvent *e) { - if (e->button() == Qt::LeftButton) { - createScreen(e->pos()); - return ; - } -} - -void OEScreenshot::mouseReleaseEvent(QMouseEvent *e) { - if (e->button() == Qt::RightButton) { - if (screenTool_.get() != nullptr) { - rectTool_->hide(); - amplifierTool_->onPostionChange(e->x(), e->y()); - amplifierTool_->show(); - return destroyScreen(); - } - close(); - return ; - } - else if (isLeftPressed_ == true - && e->button() == Qt::LeftButton) { - /// 选择窗口选区 - if (startPoint_ == e->pos() - && !windowRect_.isEmpty()) { - screenTool_->setGeometry(windowRect_); - screenTool_->show(); - windowRect_ = {}; - } - /// 断开鼠标移动的信号 - disconnect (this, SIGNAL(cursorPosChange(int,int)), - screenTool_.get(),SLOT(onMouseChange(int,int))); - /// 隐藏放大器 - amplifierTool_->hide(); - /// 断开截图器的大小修改信号 - disconnect (screenTool_.get(), SIGNAL(sizeChange(int,int)), - amplifierTool_.get(),SLOT(onSizeChange(int,int))); - isLeftPressed_ = false; - } - QWidget::mouseReleaseEvent(e); -} - -void OEScreenshot::mouseMoveEvent(QMouseEvent *e) { - emit cursorPosChange(e->x(), e->y()); - if (isLeftPressed_) { - amplifierTool_->raise(); - windowRect_ = {}; - update(); - } - else if (isLeftPressed_ == false - && false == OEScreen::state()){ - /// 霸道置顶 - onEgoistic(); - - /// 更新当前鼠标选中的窗口 - updateMouse(); - } - QWidget::mouseMoveEvent(e); -} - -void OEScreenshot::paintEvent(QPaintEvent *) { - QPainter painter(this); - /// 画全屏图 - painter.drawPixmap(0,0,desktopRect_.width(), - desktopRect_.height(), *backgroundScreen_); - - if (!windowRect_.isEmpty()) { - /// 绘制选区 - QPen pen = painter.pen(); - pen.setColor(QColor(0,175,255)); - pen.setWidth(2); - painter.setPen(pen); - painter.drawRect(windowRect_.x(),windowRect_.y(), - windowRect_.width(),windowRect_.height()); - painter.drawPixmap(QPoint(windowRect_.x(),windowRect_.y()), - *originPainting_, windowRect_); - } -} - -void OEScreenshot::updateMouse(void) { - /// 获取当前鼠标选中的窗口 - ::EnableWindow((HWND)winId(), FALSE); - OECommonHelper::getSmallestWindowFromCursor(windowRect_); - QPoint temp_pt = mapFromGlobal(QPoint(windowRect_.x(), windowRect_.y())); - windowRect_ = QRect(temp_pt.x(), temp_pt.y(), - windowRect_.width(), windowRect_.height()); - ::EnableWindow((HWND)winId(), TRUE); - amplifierTool_->onSizeChange(windowRect_.width(),windowRect_.height()); - emit findChildWind(windowRect_); - update(); -} - -void OEScreenshot::keyPressEvent(QKeyEvent *e) { - /// Esc 键退出截图; - if (e->key() == Qt::Key_Escape) { - close(); - } - else { - e->ignore(); - } - -} - - - -/////////////////////////////////////////////////////////// - - - - -OERect::OERect(QWidget *parent) : QWidget(parent) { - - /// 设置感知器默认大小 - setFixedSize(95 * OECommonHelper::getWindowHeightMultiplyingPower(), - 20 * OECommonHelper::getWindowHeightMultiplyingPower()); - - /// 填充默认背景 - backgroundPixmap_.reset(new QPixmap(width(),height())); - backgroundPixmap_->fill((QColor(8, 8, 8, 160))); - - /// 默认隐藏 - hide(); -} - - -void OERect::paintEvent(QPaintEvent *) { - QPainter painter(this); - painter.drawPixmap(rect(),*backgroundPixmap_); - painter.setPen(QPen(QColor(Qt::white))); - painter.drawText(rect(), Qt::AlignCenter, info_); -} - -void OERect::onPostionChange(int x, int y) { - if (x < 0) x = 0; - if (y < 0) y = 0; - const int& ry = y - height() - 1; - if (ry < 0) { - this->raise(); - } - move(x, ((ry < 0) ? y : ry)); - show(); -} - -void OERect::onSizeChange(int w, int h) { - info_ = QString("%1 × %2").arg(w).arg(h); -} - - - - -/////////////////////////////////////////////////////////// - - - - - -OEScreen::OEScreen(std::shared_ptr originPainting, QPoint pos, QWidget *parent) - : QWidget(parent), direction_(NONE), originPoint_(pos), - isPressed_(false), originPainting_(originPainting) { - menu_ = new QMenu(this); - menu_->addAction("完成截图", this, SLOT(onSaveScreen())); - menu_->addAction("保存", this, SLOT(onSaveScreenOther())); - menu_->addSeparator(); - menu_->addAction("退出截图", this, SLOT(quitScreenshot())); - - /// 双击即完成 - connect(this, SIGNAL(doubleClick()), - this, SLOT(onSaveScreen())); - - /// 开启鼠标实时追踪 - setMouseTracking(true); - /// 默认隐藏 - hide(); -} - -OEScreen::DIRECTION OEScreen::getRegion(const QPoint &cursor) { - if (!isInit_) { - return NONE; - } - OEScreen::DIRECTION ret_dir = NONE; - // left upper - QPoint pt_lu = mapToParent(rect().topLeft()); - // right lower - QPoint pt_rl = mapToParent(rect().bottomRight()); - - int x = cursor.x(); - int y = cursor.y(); - - /// 获得鼠标当前所处窗口的边界方向 - if(pt_lu.x() + PADDING_ >= x - && pt_lu.x() <= x - && pt_lu.y() + PADDING_ >= y - && pt_lu.y() <= y) { - // 左上角 - ret_dir = LEFTUPPER; - this->setCursor(QCursor(Qt::SizeFDiagCursor)); - } else if(x >= pt_rl.x() - PADDING_ - && x <= pt_rl.x() - && y >= pt_rl.y() - PADDING_ - && y <= pt_rl.y()) { - // 右下角 - ret_dir = RIGHTLOWER; - this->setCursor(QCursor(Qt::SizeFDiagCursor)); - } else if(x <= pt_lu.x() + PADDING_ - && x >= pt_lu.x() - && y >= pt_rl.y() - PADDING_ - && y <= pt_rl.y()) { - // 左下角 - ret_dir = LEFTLOWER; - this->setCursor(QCursor(Qt::SizeBDiagCursor)); - } else if(x <= pt_rl.x() - && x >= pt_rl.x() - PADDING_ - && y >= pt_lu.y() - && y <= pt_lu.y() + PADDING_) { - // 右上角 - ret_dir = RIGHTUPPER; - this->setCursor(QCursor(Qt::SizeBDiagCursor)); - } else if(x <= pt_lu.x() + PADDING_ - && x >= pt_lu.x()) { - // 左边 - ret_dir = LEFT; - this->setCursor(QCursor(Qt::SizeHorCursor)); - } else if( x <= pt_rl.x() - && x >= pt_rl.x() - PADDING_) { - // 右边 - ret_dir = RIGHT; - this->setCursor(QCursor(Qt::SizeHorCursor)); - }else if(y >= pt_lu.y() - && y <= pt_lu.y() + PADDING_){ - // 上边 - ret_dir = UPPER; - this->setCursor(QCursor(Qt::SizeVerCursor)); - } else if(y <= pt_rl.y() - && y >= pt_rl.y() - PADDING_) { - // 下边 - ret_dir = LOWER; - this->setCursor(QCursor(Qt::SizeVerCursor)); - }else { - // 默认 - ret_dir = NONE; - this->setCursor(QCursor(Qt::SizeAllCursor)); - } - return ret_dir; -} - - -void OEScreen::contextMenuEvent(QContextMenuEvent *) { - /// 在鼠标位置弹射出菜单栏 - menu_->exec(cursor().pos()); -} - -void OEScreen::mouseDoubleClickEvent(QMouseEvent *e) { - if (e->button() == Qt::LeftButton) { - emit doubleClick(); - e->accept(); - } -} - -void OEScreen::mousePressEvent(QMouseEvent *e) { - if (e->button() == Qt::LeftButton) { - isPressed_ = true; - if(direction_ != NONE) { - this->mouseGrabber(); - } - /// @bug :这里可能存在问题, 不应当使用globalPos - movePos_ = e->globalPos() - pos(); - } -} - -void OEScreen::mouseReleaseEvent(QMouseEvent * e) { - if (e->button() == Qt::LeftButton) { - isPressed_ = false; - if(direction_ != NONE) { - setCursor(QCursor(Qt::SizeAllCursor)); - } - } -} - -void OEScreen::mouseMoveEvent(QMouseEvent * e) { - QPoint gloPoint = mapToParent(e->pos()); - // left upper - QPoint pt_lu = mapToParent(rect().topLeft()); - // left lower - QPoint pt_ll = mapToParent(rect().bottomLeft()); - // right lower - QPoint pt_rl = mapToParent(rect().bottomRight()); - // right upper - QPoint pt_ru = mapToParent(rect().topRight()); - if(!isPressed_) { - /// 检查鼠标鼠标方向 - direction_ = getRegion(gloPoint); - - /// 根据方位判断拖拉对应支点 - switch(direction_) { - case NONE: - case RIGHT: - case RIGHTLOWER: - originPoint_ = pt_lu; - break; - case RIGHTUPPER: - originPoint_ = pt_ll; - break; - case LEFT: - case LEFTLOWER: - originPoint_ = pt_ru; - break; - case LEFTUPPER: - case UPPER: - originPoint_ = pt_rl; - break; - case LOWER: - originPoint_ = pt_lu; - break; - } - } - else { - if(direction_ != NONE) { - const int& global_x = gloPoint.x(); - /// 鼠标进行拖拉拽 - switch(direction_) { - case LEFT: - return onMouseChange(global_x, pt_ll.y() + 1); - case RIGHT: - return onMouseChange(global_x, pt_rl.y() + 1); - case UPPER: - return onMouseChange(pt_lu.x(), gloPoint.y()); - case LOWER: - return onMouseChange(pt_rl.x() + 1, gloPoint.y()); - case LEFTUPPER: - case RIGHTUPPER: - case LEFTLOWER: - case RIGHTLOWER: - return onMouseChange(global_x, gloPoint.y()); - default: - break; - } - } - else { - /// 窗口的移动 - /// @bug :这里可能存在问题, 不应当使用globalPos - move(e->globalPos() - movePos_); - movePos_ = e->globalPos() - pos(); - e->accept(); - } - } - currentRect_ = geometry(); -} - -void OEScreen::moveEvent(QMoveEvent *) { - emit postionChange(x(), y()); -} - -void OEScreen::resizeEvent(QResizeEvent *) { - listMarker_.clear(); - - /// 重新计算八个锚点 - // 角点 - listMarker_.push_back(QPoint(0, 0)); - listMarker_.push_back(QPoint(width(), 0)); - listMarker_.push_back(QPoint(0, height())); - listMarker_.push_back(QPoint(width(), height())); - - // 中点 - listMarker_.push_back(QPoint((width() >> 1), 0)); - listMarker_.push_back(QPoint((width() >> 1), height())); - listMarker_.push_back(QPoint(0, (height() >> 1))); - listMarker_.push_back(QPoint(width(), (height() >> 1))); - - emit sizeChange(width(), height()); -} - -void OEScreen::showEvent(QShowEvent *) { - isInit_ = true; -} - -void OEScreen::hideEvent(QHideEvent *) { - currentRect_ = {}; - movePos_ = {}; - originPoint_ = {}; - isInit_ = false; -} - -void OEScreen::enterEvent(QEvent *e) { - setCursor(Qt::SizeAllCursor); - QWidget::enterEvent(e); -} - -void OEScreen::leaveEvent(QEvent *e) { - setCursor(Qt::ArrowCursor); - QWidget::leaveEvent(e); -} - -void OEScreen::closeEvent(QCloseEvent *) -{ - isInit_ = false; -} - -void OEScreen::paintEvent(QPaintEvent *) { - QPainter painter(this); - /// 绘制截屏编辑窗口 - painter.drawPixmap(QPoint(0,0), - *originPainting_, currentRect_); - - /// 绘制边框线 - QPen pen(QColor(0,174,255),2); - painter.setPen(pen); - painter.drawRect(rect()); - - /// 绘制八个点 - //改变点的宽度 - pen.setWidth(4); - pen.setColor(Qt::red); - painter.setPen(pen); - painter.drawPoints(listMarker_); -} - - -const QString OEScreen::getFileName(void) { - QString file_name = QDateTime::currentDateTime().toString("CSDN博客_瓯裔_yyyy-MM-dd-HH-mm-ss"); - return file_name; -} - - -void OEScreen::onSaveScreenOther(void) { - - QString fileName = QFileDialog::getSaveFileName(this, "保存图片", getFileName(), "JPEG Files (*.jpg)"); - if (fileName.length() > 0) { - originPainting_->copy(currentRect_).save(fileName, "jpg"); - quitScreenshot(); - } -} - -void OEScreen::onSaveScreen(void) { - /// 把图片放入剪切板 - QClipboard *board = QApplication::clipboard(); - board->setPixmap(originPainting_->copy(currentRect_)); - /// 退出当前截图工具 - quitScreenshot(); -} - - -void OEScreen::quitScreenshot(void) { - close(); - parentWidget()->close(); -} - -void OEScreen::onMouseChange(int x, int y) { - show(); - if (x < 0 || y < 0) { - return; - } - const int& rx = (x >= originPoint_.x()) ? originPoint_.x() : x; - const int& ry = (y >= originPoint_.y()) ? originPoint_.y() : y; - const int& rw = abs(x - originPoint_.x()); - const int& rh = abs(y - originPoint_.y()); - - /// 改变大小 - currentRect_ = QRect(rx, ry, rw, rh); - - this->setGeometry(currentRect_); - /// 改变大小后更新父窗口,防止父窗口未及时刷新而导致的问题 - parentWidget()->update(); -} diff --git a/LedOK/oescreenshot/oescreenshot.h b/LedOK/oescreenshot/oescreenshot.h deleted file mode 100644 index 0e85fd8..0000000 --- a/LedOK/oescreenshot/oescreenshot.h +++ /dev/null @@ -1,508 +0,0 @@ -/** - * @author : 陈鲁勇 - * @date : 2017年04月 - * @version: 1.0 - * @note : 根据 Apache 许可证 2.0 版(以下简称“许可证”)授权; - * 除非遵守本许可,否则您不能使用这个文件。 - * @remarks: 您可以获得该许可的副本: - * http://www.apache.org/licenses/LICENSE-2.0 - * 除非适用法律需要或者书面同意,按本许可分发的软件 - * 要按“原样”分发,没有任何形式的,明确或隐含的担保条款。 - * 参见按照本许可控制许可权限及限制的特定语言的许可证。 - * - * 你可以获得该代码的最新版本: - * - * https://git.oschina.net/Mr_ChenLuYong/screenshot - * - * 开源社区的所有人都期待与你的共同维护。 - * - * - * 如果你对这些代码还有不理解的地方可以通过最新的文章进行学习: - * - * 博客地址:http://blog.csdn.net/csnd_ayo - * - * 文章地址:http://blog.csdn.net/csnd_ayo/article/details/70197915 - * - * 期待你提交Bug,欢迎Issues。 - * -*/ - - -#ifndef OESCREENSHOT_H -#define OESCREENSHOT_H - -#include -#include -#include - -class OEScreen; -class OERect; -class OEAmplifier; -class QTimer; -class QMenu; - - -/** - * @class : OEScreenshot - * @brief : 截屏功能的主要入口, - * 管理全局热键,资源的回收与释放. - * @remark: 调用示例( OEScreenshot::Instance(); ) -*/ -class OEScreenshot : public QWidget { - Q_OBJECT - -signals: - - /** - * @brief : 鼠标移动(信号) - * @param : int x轴的坐标 - * @param : int y轴的坐标 - * @date : 2017年04月18日 - */ - void cursorPosChange(int, int); - - /** - * @brief : 双击(信号) - * @date : 2017年04月18日 - */ - void doubleClick(void); - - /** - * @brief : 鼠标当前位置最小的子窗口(信号) - * @param : QRect 当前窗口的矩形数据 - * @date : 2017年04月18日 - */ - void findChildWind(QRect); - -public: - /** - * @brief : 构造函数 - * @note : 当前依附的父窗口(一般不给父窗口) - * @date : 2017年04月16日 - */ - explicit OEScreenshot(QWidget *parent = 0); - ~OEScreenshot(void); - - /** - * @brief : 窗口实例 - * @note : 通过这个函数获得截图器的整个实例 - * @return: 返回 OEScreenshot 实例指针 - * @date : 2017年04月15日 - */ - static OEScreenshot *Instance(void); - - /** - * @brief : 摧毁截图窗口 - * @note : 通过这个函数可以摧毁整个截图窗口 - * @date : 2017年04月30日 - */ - static void destroy(void); - -protected: - - /** - * @brief : 隐藏窗口事件 - */ - virtual void hideEvent(QHideEvent *); - /** - * @brief : 关闭窗口事件 - */ - virtual void closeEvent(QCloseEvent *); - /** - * @brief : 双击事件 - */ - virtual void mouseDoubleClickEvent(QMouseEvent*); - /** - * @brief : 鼠标按下事件 - */ - virtual void mousePressEvent(QMouseEvent *); - /** - * @brief : 鼠标释放事件 - */ - virtual void mouseReleaseEvent(QMouseEvent *e); - /** - * @brief : 鼠标移动事件 - */ - virtual void mouseMoveEvent(QMouseEvent *e); - - /** - * @brief : 按键按下事件 - */ - virtual void keyPressEvent(QKeyEvent *e); - /** - * @brief : 自绘事件 - */ - virtual void paintEvent(QPaintEvent *); - - /** - * @brief : 更新当前鼠标选区的窗口 - */ - void updateMouse(void); - -private: - - - /** - * @brief : 初始化放大镜 (色彩采集器) - * @note : 他需要屏幕的原画作为放大器的放大元素 - * @param : originPainting 放大器必要的元素,若为空,则默认用originPainting_原画 - * @date : 2017年04月15日 - * @remark: 需先行调用getGlobalScreen。 - */ - void initAmplifier(std::shared_ptr originPainting = nullptr); - - /** - * @brief : 测量控件 (大小感知器) - * @date : 2017年04月27日 - */ - void initMeasureWidget(void); - - /** - * @brief : 初始化截屏背景 - * @return: QPixmap 经过暗色处理的屏幕图 - * @date : 2017年04月15日 - */ - std::shared_ptr initGlobalScreen(void); - - - /** - * @brief : 初始化鼠标 - * @note : 为鼠标设置默认状态下的图标样式 - * @param : ico 鼠标图片的资源文件路径 - * @date : 2017年04月15日 - * @remark: 若参数未填写,在使用本程序默认的鼠标Logo - */ - void initCursor(const QString& ico = ""); - - /** - * @brief : 创建截图器 - * @note : 若截图器已存在,则返回截图器示例,不会重复创建。 - * @param : pos 截图器的起始位置 (给当前鼠标位置即可) - * @date : 2017年04月16日 - * @remark: 创建截图器前,需要创建相关的组件,(例:大小感知器,放大取色器) - */ - std::shared_ptr createScreen(const QPoint &pos); - - /** - * @brief : 摧毁截图器 - * @note : 若截图器已存在,则摧毁示例,并清理示例创建的连带资源 - * @date : 2017年04月16日 - */ - void destroyScreen(void); - - - /** - * @brief : 获得当前屏幕的大小 - * @note : 这个函数是支持多屏幕的,示例:双屏幕 QRect(-1920, 0, 3840, 1080) - * @return: 返回 QRect 引用 - * @date : 2017年04月15日 - */ - const QRect& getScreenRect(void); - - /** - * @brief : 获得屏幕的原画 - * @note : 他不会重复获得屏幕原画,如果有,则返回原有的原画 - * @return: QPixmap* 指针 - * @date : 2017年04月15日 - * @remark: 若想重新获得屏幕原画,需要清理原有资源 - */ - std::shared_ptr getGlobalScreen(void); - - -private: - - /// 截屏窗口是否已经展示 - bool isLeftPressed_; - /// 用于检测误操作 - QPoint startPoint_; - /// 当前桌面屏幕的矩形数据 - QRect desktopRect_; - /// 屏幕暗色背景图 - std::shared_ptr backgroundScreen_; - /// 屏幕原画 - std::shared_ptr originPainting_; - /// 截图屏幕 - std::shared_ptr screenTool_; - /// 截图器大小感知器 - std::shared_ptr rectTool_; - /// 放大取色器 - std::shared_ptr amplifierTool_; - /// 当前鼠标选区最小的矩形窗口 - QRect windowRect_; - /// 截屏实例对象 - static OEScreenshot *self_; - /// 置顶定时器 - QTimer* egoisticTimer_; - /// 活动窗口 - static bool isActivity_; -private slots: - - /** - * @brief : Window下霸道置顶(唯我独尊) - * @date : 2017年04月28日 - * @remark: 使用该函数时,会终止右键菜单的行为,慎重使用,避免BUG - */ - void onEgoistic(void); -}; - - - - -/** - * @class : OERect - * @brief : 大小感知器 - * @note : 主要关乎截图器左上方的大小感知控件 -*/ -class OERect : public QWidget { - Q_OBJECT - -signals: - - -public: - - explicit OERect(QWidget *parent = 0); - -protected: - - /** - * @brief : 自绘函数 - */ - void paintEvent(QPaintEvent *); - -public slots: - - /** - * @brief : 外部组件位置修改(槽) - * @note : 感知器修改自身位置 - * @param : x 横向位置 - * @param : y 纵向位置 - * @date : 2017年04月15日 - */ - void onPostionChange(int x, int y); - - /** - * @brief : 外部组件大小修改 (槽) - * @note : 感知器修改显示的大小数据 - * @param : w 宽度 - * @param : h 高度 - * @date : 2017年04月15日 - */ - void onSizeChange(int w, int h); - -private: - /// 背景色 - std::shared_ptr backgroundPixmap_; - /// 显示的文字信息 - QString info_; -}; - - -/** - * @class : OEScreen - * @brief : 截图器 - * @note : 主要关乎图片的编辑与保存 -*/ -class OEScreen : public QWidget { - - Q_OBJECT - -signals: - - - /** - * @brief : 截图器大小修改(信号) - * @param : int 宽度 - * @param : int 高度 - * @date : 2017年04月17日 - */ - void sizeChange(int,int); - - /** - * @brief : 截图器窗口的位置(信号) - * @param : int 窗口的横向位置 - * @param : int 窗口的纵向位置 - * @date : 2017年04月17日 - */ - void postionChange(int,int); - - /** - * @brief : 双击 (信号) - * @date : 2017年04月17日 - */ - void doubleClick(void); - -protected: - - /// 内边距,决定拖拽的触发。 - const int PADDING_ = 6; - - /// 方位枚举 - enum DIRECTION { - UPPER=0, - LOWER=1, - LEFT, - RIGHT, - LEFTUPPER, - LEFTLOWER, - RIGHTLOWER, - RIGHTUPPER, - NONE - }; - -public: - - explicit OEScreen(std::shared_ptr originPainting, QPoint pos, QWidget *parent = 0); - - ~OEScreen() { isInit_ = false; } - - /** - * @brief : 获得当前截图器是否存在 - * @return: true : 存在 - * @date : 2017年04月17日 - */ - static bool state(void) { return isInit_; } - -protected: - - /** - * @brief : 获得当前坐标点的边界方位 - * @param : cursor 当前鼠标的位置 - * @return: DIRECTION 鼠标的方位枚举 - * @date : 2017年04月17日 - */ - DIRECTION getRegion(const QPoint &cursor); - - - /** - * @brief : 呼出菜单事件 - */ - virtual void contextMenuEvent(QContextMenuEvent *); - - /** - * @brief : 双击事件 - */ - virtual void mouseDoubleClickEvent(QMouseEvent *e); - - /** - * @brief : 鼠标按下事件 - */ - virtual void mousePressEvent(QMouseEvent *e); - - /** - * @brief : 鼠标释放事件 - */ - virtual void mouseReleaseEvent(QMouseEvent *e); - /** - * @brief : 鼠标移动事件 - */ - virtual void mouseMoveEvent(QMouseEvent *e); - - /** - * @brief : 窗口移动事件 - */ - virtual void moveEvent(QMoveEvent *); - - /** - * @brief : 窗口大小修改事件 - */ - virtual void resizeEvent(QResizeEvent *); - - - /** - * @brief : 窗口显示事件 - */ - virtual void showEvent(QShowEvent *); - - /** - * @brief : 窗口隐藏事件 - */ - virtual void hideEvent(QHideEvent *); - - /** - * @brief : 鼠标进入窗口事件 - */ - virtual void enterEvent(QEvent *e); - - /** - * @brief : 鼠标离开窗口事件 - */ - virtual void leaveEvent(QEvent *e); - - /** - * @brief : 窗口关闭事件 - */ - virtual void closeEvent(QCloseEvent *); - - /** - * @brief : 界面自绘事件 - */ - virtual void paintEvent(QPaintEvent *); - -private: - - /** - * @brief : 获得一个以时间格式命名的文件名 - * @return: QString 文件名 - * @date : 2017年04月16日 - */ - virtual const QString getFileName(void); - -public slots: - - - /** - * @brief : 根据鼠标位置修改窗口大小 - * @param : x 鼠标的横向位置 - * @param : y 鼠标的纵向位置 - * @date : 2017年04月16日 - */ - void onMouseChange(int x,int y); - - /** - * @brief : 保存屏幕到剪切板中 - * @date : 2017年04月16日 - */ - void onSaveScreen(void); - -protected slots: - - /** - * @brief : 保存编辑屏幕到其他路径下 - * @note : 会呼出路径选择的窗口 - * @date : 2017年04月16日 - */ - void onSaveScreenOther(void); - - /** - * @brief : 退出当前截图窗口 - * @date : 2017年04月16日 - */ - void quitScreenshot(void); - -private: - - /// 是否已经设置初始大小 - static bool isInit_; - /// 窗口大小改变时,记录改变方向 - DIRECTION direction_; - /// 起点 - QPoint originPoint_; - /// 鼠标是否按下 - bool isPressed_; - /// 拖动的距离 - QPoint movePos_; - /// 标记锚点 - QPolygon listMarker_; - /// 屏幕原画 - std::shared_ptr originPainting_; - /// 当前窗口几何数据 用于绘制截图区域 - QRect currentRect_; - /// 右键菜单对象 - QMenu *menu_; - -}; - - - -#endif /// OESCREENSHOT_H