154 lines
5.0 KiB
C++
154 lines
5.0 KiB
C++
/**
|
||
* @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 <QPixmap>
|
||
#include <QPainter>
|
||
|
||
#ifndef QT_NO_DEBUG
|
||
#include <QDebug>
|
||
#endif
|
||
|
||
|
||
#include "oecommonhelper.h"
|
||
|
||
OEAmplifier::OEAmplifier(std::shared_ptr<QPixmap> 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);
|
||
}
|