[分享]牛牛截图控件最终版

2024-04-21 10:08

本文主要是介绍[分享]牛牛截图控件最终版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

牛牛截图控件已经提供Web控件及标准的Javascript接口,测试程序及调用示例请访问: http://www.ggniu.cn/



实现牛牛截图控件的初衷,是想在学习的同时,实现一个具备当前主流截图功能的插件,方便集成进不同的应用系统中,节省开发时间。

一直以来,都对目前各主流即时通讯软件的截图效果比较喜欢,前段时间专门花时间进行了一些研究,实现了自己的一个截图控件,我给它取名叫“牛牛截图”;此控件可免费使用,开放了调用的接口,有兴趣的朋友可以试一下,具体的调用方法及使用示例见下文。

 

1. 本控件实现的基本功能及特点如下

1). 支持窗口区域的自动识别

2). 支持矩形、圆形、箭头、文字的绘制以及撤销

3). 可另存为png、jpg、bmp等格式

4). 支持鼠标所在区域的图像放大功能,以便精准定位

5). 窗口大小、鼠标坐标显示以及光标处的颜色拾取

6). 采用C++语言开发的Win32动态库,大小为150KB

7). 支持XP、WIN7、WIN8及WIN2003、WIN2008等操作系统;

8). 此控件提供标准的接口,方便集成进其他软件中;

例如可以与浏览器控件整合,实现Web页面截图的功能,也可以与其他如即时通讯等其他任何系统中

 

先看看使用效果:

 

 

2. 控件使用方法

1). 在测试程序中点击启动截图[在集成此控件后,可以自行通过热键进行启动],按下鼠标左键并拖动,以确定需要截图的范围,也可以直接在自动识别到的窗口上点击一下鼠标左键,确定截图范围;此时可以通过放大的区域来精确定位截图区域。

2). 确定截图范围后,工具栏将会显示出来,选中指定的绘制类型[绘制类型、大小、颜色],可以进行二次绘制涂鸦。

3). 可以通过点击撤销按钮来取消上一笔所绘制的形状。

4). 在截图的过程中,可以按ESC键或者点击鼠标右键来取消截图。

5). 按下回车键或者在截图区域内双击鼠标左键,可以完成截图[也可以点击工具栏上的“完成”按钮]。

6). 点击“保存”按钮,可以将所截区域保存至图片文件。

 

 

3. 控件接口的使用方法

可以在程序中使用LoadLibrary的方式加载此控件,进行初始化后,直接调用启动截图的函数即可:

typedef int (*FnStartScreenCapture)(const char* szAuth, const char* szDefaultSavePath, void* pCallBack, unsigned long hWndNotice, unsigned int noticeMsg);
FnStartScreenCapture m_StartScreenCapture = NULL;
typedef int (*FnInitScreenCapture)(unsigned long trackerColor, unsigned long editBorderColor, int nTransparent, int flag);
FnInitScreenCapture m_InitCapture = NULL;
//加载截图控件
m_hModule = LoadLibrary("NiuniuCapture.dll");m_StartScreenCapture = (FnStartScreenCapture)GetProcAddress(m_hModule, "StartScreenCapture");
m_InitCapture = (FnInitScreenCapture)GetProcAddress(m_hModule, "InitScreenCapture");m_InitCapture(RGB(255, 0, 0), RGB(0, 174, 255), 180, 0);
m_StartScreenCapture("niuniu", "", NULL, (unsigned long)m_hWnd, WM_USER + 1111);

 

具体可以参考调用Capturedemo_source.rar [下载地址见本文末尾],接口的具体描述如下:

1). 初始化接口

int InitScreenCapture(unsigned long trackerColor, unsigned long editBorderColor, int nTransparent, int flag);

此接口函数用于初始化界面的显示效果,如果不调用,则以默认值处理。

参数说明:

参数名

参数类型

参数说明

备注

trackerColor

COLORREF

用于设置橡皮筋框的颜色以及自动识别窗口的边框色

如果不调用此函数,则此框颜色默认为:

RGB(0, 174, 255);

editBorderColor

COLORREF

用于设置文本输入框的边框颜色

如果不调用此函数,则此框颜色默认为:

RGB(255, 0, 0);

nTransparent

int

用于指定工具栏窗口的透明度(0-255)

如果不调用此函数,则透明度默认为200

flag

int

暂未使用

 

 

 2). 启动截图接口:

int StartScreenCapture(const char* szAuth, const char* szDefaultSavePath, void* pCallBack, unsigned long hWndNotice, unsigned int noticeMsg);

参数说明:

参数名

参数类型

参数说明

备注

szAuth

字符串

用于调用控件时的授权

目前固定传入”niuniu”即可

szDefaultSavePath

字符串

用于指定在截图完成时自动保存的文件路径

如:c:\\test.jpg,如果此字符串为空,则完成时将只写入剪贴板

pCallBack

Void*

用于指定在截图完成时自动回调的函数

用于通知调用程序截图完成

hWndNotice

UINT

用于指定截图完成时发送通知的窗口句柄及发送的消息

用于通知调用程序截图完成,截图完成时,控件将会发送消息:

::PostMessage(hWndNotice, noticeMsg, 1, 1);

noticeMsg

UINT

 

 

4. 控件的主要技术点简介

本控件采用C++语言,通过Win32程序进行实现,内部使用了Duilib来做工具栏以及图片放大区域的显示;对于画图部分,主要采用了GDI+,以下对我个人认为需要注意的技术点进行简要描述:

 

4.1 橡皮筋类的绘制、大小调整以及拖动等

此橡皮筋类是从MFC的源代码中提取的CRectTracker,进而移植到Win32环境中的,具体橡皮筋类的原理就不描述了,需要重点关注的是TrackRubberBand及Track两函数:

1) 当鼠标按下,且橡皮筋没有显示的情况下,使用TrackRubberBand,以确定橡皮筋所包含区域

if(!gl_rectTracker.TrackRubberBand(hWnd, pt, TRUE))
{ //说明鼠标没有移动,则获取自动识别到的窗口
if (gl_borderRt.right != 0 && gl_borderRt.right > gl_borderRt.left)
{
gl_rectTracker.m_rect.SetRect(gl_borderRt.left, gl_borderRt.top, gl_borderRt.right, gl_borderRt.bottom);
}
}
2) 当橡皮筋类已经显示,则需要判断此时鼠标的落点,如果在橡皮筋区域内[gl_rectTracker.HitTest(pt)的返回值 大于0],则需要调用Track,以便拖动橡皮筋调整大小或者移动它。 

 

4.2 自动窗口区域识别

在Windows系统中,所有的窗口都是有一个层级的(ZORDER),此处采用的方法是在获取屏幕截图之前,保存下当前所有可见的窗口句柄以及其子窗口句柄[主要利用FindWindowEx],此处值得一提的是,需要过滤掉一些带WS_EX_LAYERED属性的窗口[在不过滤的情况下,WIN8下会有问题,存在透明的窗口处于当前窗口之上],同时针对任务栏窗口不能过滤掉。

4.3  GDI+绘制矩形、圆形、箭头、文字

1). 绘制箭头的代码类似如下: 

void DrawArraw(Graphics& graphics, CPoint pt1, CPoint pt2, Color color )
{
Point pt[3] = { Point(3, -5), Point(-3, -5), Point(0, 0)};
GraphicsPath strokePath;
strokePath.AddLines(pt, sizeof(pt)/sizeof(Point));
Pen pen(color, 1);
CustomLineCap custCap(&strokePath, NULL);
pen.SetCustomEndCap(&custCap);
graphics.DrawLine(&pen, pt1.x, pt1.y, pt2.x, pt2.y);
}
此处需要通过对所画的直线进行平滑处理,否则线条将会很难看。

 

2). 绘制文字 

此处有两点需要注意,我只解决了其中的第一点:

a). 针对每一行需要单独绘制,否则在EDIT控件中的行高要比DrawString的行高要少,导致绘制出来的文字占用高度比在EDIT中要多,感觉文字的Y坐标有移位  

b). 在同时有中文与英文时,绘制出来的文字的X坐标是有移位的,我暂时没有处理,估计需要一个字符一个字符的绘制来解决 

 

4.4 可变大小、可拖动的EDIT控件

此处在效果上参考了微软的mspaint程序的实现,通过将一个EDIT控件与橡皮筋类进行组合来实现,此处需要重点处理一下鼠标按下以及防止闪烁;还需要注意与EDIT控件组合的橡皮筋类的绘制细节 

 

4.5 鼠标所在区域的放大镜效果显示 

通过一个透明的PNG做背景图 StretchBlt函数,通过光标所在点为基点,以4倍大小放大显示即可 

 

 5. 未解决的问题

5.1 目前没有处理当输入文字或者粘贴文字时,自动改变文本框的大小,此处不太清楚如何处理控件的自动变更大小

5.2 当文本框中有中文与英文混合时,绘制到截图上后,文字的X坐标会有移位

 


牛牛截图控件已经提供Web控件及标准的Javascript接口,测试程序及调用示例请访问: http://www.ggniu.cn/



这篇关于[分享]牛牛截图控件最终版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922809

相关文章

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

XMG xib中不属于一个类的控件,拖线到指定的类中

1.比如我现在有一个view绑定为GreenView,我们按住control向类里面拖线的方式想要达到目的,显然拖不进去。例图如下 那么我们此时还想要达到目的,就需要自己去GreenView的类内部去写IBo 然后这面连接起来 2.第二,大哥郝良建给做的扩展 可以在.h或者.m中写一个NSObject的属性 然后在xib中对应的位置创建一个NSObject的属性

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment="Center" Content="Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header="打开"/><MenuItem Header="-"/><MenuItem Header="关闭"/></MenuFlyout></Button.Flyout></B

3_创建Tab控件

1,新建MFC 对话框项目,为对话框添加Tab控件,选中Tab控件,新建控件变量m_tab_ctrl 2,为Tab控件添加tab项 m_tab_ctrl.InsertItem(0, L”000”),参数1,哪个位置;参数2,item的名称 3,为Tab控件添加监听事件, void C测试Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESUL

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

示例:推荐一个基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器

一、目的:基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器,感兴趣的可以去下方链接地址查看开源控件库地址。本控件封装的目的在于将第三方库的皮肤和样式封装到皮肤库中可统一设置样式,同时生成nuget方便调用 二、效果如下 三、环境 VS2022 Net7 四、使用方式 1、安装nuget包:H.Con