[分享]牛牛截圖控件2.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章