[分享]牛牛截圖控件最終版

牛牛截圖控件已經提供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/



發佈了36 篇原創文章 · 獲贊 24 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章