[分享]牛牛截图控件2.0版本发布

5 篇文章 0 订阅

牛牛截图现已完美支持多显示器及DPI放大的场景,欢迎试用。

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




在上一个版本发布后,收到非常多朋友的反馈,近期有了些时间,对控件进行了升级;同时对比测试了几大主流的截图功能,除了腾讯QQ最新版,其他如360、旺旺、人生日历截图等,均对DPI放大的支持不是很好,多显示器支持我仅测试了腾讯,其他的实现不清楚。

 

上一个版本的链接请见:

http://blog.csdn.net/tragicguy/article/details/20741077


以下是牛牛截图控件2.0的相关介绍: 

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

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

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

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

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

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

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

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

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

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

 

2. 本次控件升级的更新项

1). 修复了原有文字功能bug,防止文字丢失的情况

2). 修复了对设置了透明属性的窗口不能截取的bug

3). 增加了荧光笔功能

4). 优化了箭头功能

5). 扩展了放大镜的显示效果,一种是跟随鼠标,一种是跟随选中区域

6). 其他一此细节体验优化

7). 增加对保存时的默认文件名进行设置的功能

8). 增加对多显示器的支持

9). 增加对DPI放大的支持 [ 需要在调用程序中设置 ]

 

效果图如下:



 

3. 控件接口的使用方法

最新控件有三个接口:InitCaptureParam,StartScreenCapture以及InitScreenCapture,

InitScreenCapture是为了兼容旧版本的控件,在此不做过多说明。

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

1).参数初始化接口

int InitCaptureParam(int flag,unsignedlong flagvalue);

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

参数说明:

参数名

参数类型

参数说明

备注

flag

int

要设置的参数项

此处对应的枚举ExtendFlagTypeEnum的整形值

flagvalue

unsigned long

设置的参数值

根据不同的枚举来设置不同的值

枚举定义如下:

typedef enum ExtendFlagTypeEnum
{
      emPensize = 1, //
      emDrawType, //
      emTrackColor,    //
      emEditBorderColor,    //
      emTransparent, //
      emWindowAware,
      emDetectSubWindowRect,
      emSetSaveName,
};

枚举项的说明如下:

枚举参数名

枚举对应数值

参数值说明

备注

emPensize

1

设置画笔大小

如不设置,默认为2

emDrawType

2

设置是腾讯风格还是360风格

0表示腾讯风格,1表示360风格

emTrackColor

3

Track及自动识别的边框的颜色

如:RGB(255, 0, 0)

emEditBorderColor

4

文本输入的边框颜色

如:RGB(0, 174, 255)

emTransparent

5

工具栏的透明度

默认为220

emWindowAware

6

设置是否禁用随着DPI放大,flagvalue传递任意值均可

此项设置非常重要,相当于调用SetProcessDPIAware,如果不设置,在高DPI的环境下,截图将会错乱

emDetectSubWindowRect

7

是否自动检测子窗口,暂时无用

未使用

emSetSaveName

8

设置保存时的文件名称

如:

const char* szName = "测试名";

InitCaptureParam(emSetSaveName, (unsigned long) szName);

 

2).启动截图接口:

int StartScreenCapture(constchar* szAuth,constchar* szDefaultSavePath,void* pCallBack,unsignedlong hWndNotice,unsignedint noticeMsg);

参数说明:

参数名

参数类型

参数说明

备注

szAuth

字符串

用于调用控件时的授权

目前固定传入”niuniu”即可

szDefaultSavePath

字符串

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

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

pCallBack

Void*

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

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

hWndNotice

UINT

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

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

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

noticeMsg

UINT

 

 

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

typedef int (*FnStartScreenCapture)(constchar* szAuth, const char* szDefaultSavePath, void*pCallBack, unsignedlong hWndNotice,unsigned int noticeMsg);
FnStartScreenCapture m_StartScreenCapture = NULL;
typedef int (*FnInitCaptureParam)(int flag, unsigned long flagvalue);
FnInitCaptureParam gl_InitCaptureParam = NULL;
 
m_hModule = LoadLibrary("NiuniuCapture.dll");
 
m_StartScreenCapture = (FnStartScreenCapture)GetProcAddress(m_hModule,"StartScreenCapture");
gl_InitCaptureParam = (FnInitCaptureParam)GetProcAddress(m_hModule, " InitCaptureParam ");
 
gl_InitCaptureParam(ExtendFlagTypeEnum::emPensize,2);    //画笔线宽
gl_InitCaptureParam(ExtendFlagTypeEnum::emDrawType,0); //设置放大镜风格:0:腾讯风格  1:360风格
gl_InitCaptureParam(ExtendFlagTypeEnum::emTrackColor,RGB(255, 0, 0));       //自动识别的边框颜色
gl_InitCaptureParam(ExtendFlagTypeEnum::emEditBorderColor,RGB(0, 174, 255));      //文字编辑框边框颜色
gl_InitCaptureParam(ExtendFlagTypeEnum::emTransparent,240); //设置工具栏窗口透明度
const char* szSavePath = "测试截图名";
gl_InitCaptureParam(ExtendFlagTypeEnum::emSetSaveName,(unsigned long)szSavePath); //设置保存时的开始文字
gl_InitCaptureParam(ExtendFlagTypeEnum::emWindowAware,1); //此函数必需窗口创建前调用,其等同于如下代码

其中 gl_InitCaptureParam(ExtendFlagTypeEnum::emWindowAware,1); 等同于调用如下代码,通过这段代码调用后,应用程序将不随DPI进行放大,在设置了DPI放大的机器上,需要调用此API;一定要在窗口创建前进行调用,建议放在应用程序最开始初始化的地方:

 

HINSTANCE hUser32 = LoadLibrary( "user32.dll" );
      if( hUser32 )
      {
           typedef BOOL ( WINAPI* LPSetProcessDPIAware )( void );
           LPSetProcessDPIAware pSetProcessDPIAware = (LPSetProcessDPIAware )GetProcAddress(hUser32, "SetProcessDPIAware" );
           if( pSetProcessDPIAware )
           {
                 pSetProcessDPIAware();
           }
           FreeLibrary( hUser32 );
      }

 通过如下代码启动截图:

m_StartScreenCapture("niuniu","", NULL, (unsigned long)m_hWnd, WM_USER + 1111);

 

4. 关于在设置了DPI放大的环境下使用的进一步说明

     在设置了DPI放大的系统下[WIN7以上],桌面窗口会被Windows进行虚拟放大,这会导致截取的图片是放大后的,本控件采取的方式是调用SetProcessDPIAware来禁止程序的界面随API放大,所以强烈建议您在使用本控件时,在程序初始化的地方,调用一下控件提供的此设置的接口,或者自行调用SetProcessDPIAware。

如果您的程序是需要让Windows来进行放大处理,不能调用SetProcessDPIAware,您可以针对截图单独启动一个进程,在这个进程中来调用截图控件进行截图。

 

5. 对于多显示器以及DPI放大支持实现的简要技术说明

1).在多显示器共用的情况下,获取桌面截图不能只考虑一个监视器,截取桌面时,获取DC应该通过:

HDC hdc = ::GetDC(::GetDesktopWindow()); 

2).同时桌面的原点不一定是(0,0),有可能是负值[取决于哪个是主显示器],获取桌面尺寸及原点应该通过如下方式获取:

gl_nScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
gl_nScreenHeight= GetSystemMetrics(SM_CYVIRTUALSCREEN);
gl_nScreenXStart = GetSystemMetrics(SM_XVIRTUALSCREEN ); //可能为负值
gl_nScreenYStart= GetSystemMetrics(SM_YVIRTUALSCREEN ); //可能为负值

3).在取得桌面截图,进行二次编辑的时候,是以(0,0)作为原点来绘制的,故在获取到窗口区域以及通过GetCursorPos得到鼠标位置后,需要针对系统原点gl_nScreenXStart及 gl_nScreenYStart进行偏移处理,否则在绘制自动识别边框及涂鸦时会不准确。

 

4).在DPI放大的环境中,设置了SetProcessDPIAware的情况下,通过GetWindowRect得到的窗口区域对于部分窗口会不准确,需要利用DwmGetWindowAttribute,通过参数DWMWA_EXTENDED_FRAME_BOUNDS来获取。

 

最新升级更新[2015-03-14]:

1).优化了WIN8下的窗口识别

2). 优化了文字字号选择下拉框的显示效果

3). 调整了放大镜的显示,支持在放大镜上显示LOGO文字,并且提供设置的接口 

4). 缩减体积至145KB

5). 工具栏拆分成两个窗口显示,调整工具栏效果与QQ、360等主流截图工具一致 


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


如果有任何意见建议,请联系QQ:182534287

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值