通過使用GDI+和CImage類配合實現針對目標窗體的子控件進行截圖

[簡介]
常用網名: 豬頭三
出生日期: 1981.XX.XX
個人網站: http://www.x86asm.com
QQ交流: 643439947
編程生涯: 2001年~至今[共15年]
職業生涯: 13年
開發語言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
開發工具: Visual Studio、Delphi、XCode、Eclipse
技能種類: 逆向 驅動 磁盤 文件
研發領域: Windows應用軟件安全/Windows系統內核安全/Windows系統磁盤數據安全
項目經歷: 磁盤性能優化/文件系統數據恢復/文件信息採集/敏感文件監測跟蹤/網絡安全檢測

[序言]
由於項目的需求, 需要開發一個針對目標窗體的子控件區域進行截圖. 這個功能, 在幾年前我一直都很感興趣, 曾經想嘗試去做, 但看到網絡資料沒有現成而且很零散, 我也就不做了. 這次是真正的需求, 必須要實現. 結果沒想到是那麼的複雜. 前後一直花費了8個小時才能搞定. 爲什麼需要這麼久? 原因很簡單:
1> 網絡分享的代碼是過時的
2> 網絡資料介紹是不全的
3> 網絡的描述是不正確的

[遇到一個很白癡的問題, 這個問題纔是我寫這篇文章的原因, 時刻提醒自己的無知]
本來代碼寫對了, 但我習慣性在系統分區根目錄創建測試文件, 結果總是無法成功. 也沒有返回錯誤信息, 也不拋出異常.  爲了解決這個創建文件的問題, 我折騰了3個小時, 換了不下十幾次的不同寫法來處理, 還是告終失敗, 差點想放棄. 如果是用CreateFile()還好說, 我可以調用GetLastError()進行查看失敗原因. 但是問題不是這樣. 真是操蛋. 反正我就是不甘心, 不停的FUCK代碼, 思路也不停在變化, 但沒有跳出一個誤區: 總是以爲自己的代碼錯誤. 後來實在惱火了, 測試在其他分區根目錄下創建看看, 結果成功了. 這讓我恍然大悟: windows 8版本以上的操作系統如果要在系統分區根目錄創建文件需要管理員權限. 我徹底暈死, 好想把電腦砸爛~~

[昨晚花費4個小時搞定圖像保存, 今早花費3個小時搞定子控件截圖]
昨晚的白癡問題搞定之後, 今早就起來繼續開發, GDI+不熟悉, 網絡大部分都是GDI+配合C#, 而沒有完整的C++代碼, 都是零零散散. 哪怎麼辦? 只能一邊看MSDN文檔, 然後看C#的代碼, 然後理解思路之後把C#的代碼轉換爲C++, 幸虧GID+的封裝很牛B, 因爲很多函數名和參數可以直接套進C++, 但這也花費了不少時間. 主要解決3個問題:
1> GDI+和CImage圖片信息相互切換
2> 使用GID+進行圖片區域的裁剪
3> 子控件相對於父控件的座標

第1個問題真是非常的複雜, 網絡資料根本就沒有現成代碼, 全靠自己看MSDN開發文檔, 但結果最終實現只用5行代碼, 真是無語. 然後第2個問題C#版本的很多, 一下就可以解決了. 第3個問題就扯淡了, 這個是非常古老的問題, 結果網絡竟然沒有現成代碼, 很多人都在問這個東西, 其實這個技術很實用.問是問了, 可回答的人真是莫名奇妙, 完全不正確. 後來我還是自己寫了, 也不難, 只要瞭解屏幕座標的原理就可以一下轉換出來, 轉換公式寫成代碼也就是3行.

[前後一共花費了8個小時, 源碼不開源但有償提供]
爲了實現這個技術, 前後花費了8個小時, 我寫的“通過使用GDI+和CImage類配合實現針對目標窗體的子控件進行截圖”這個功能, 封裝成1個函數, 大約也就是60行代碼, 支持png, jgp, bmp, gif等主流圖片文件保存. 就算有其他子控件被其他外部的窗體遮擋, 一樣可以截圖. 而且目前網絡上是沒有完整且簡單易懂, 可讀性強的源碼案例. 當然我這裏就不免費開源了.如果誰對這份源碼感興趣, 可以考慮購買, QQ聯繫: 643439947 [備註: 這裏的截圖不是對遊戲界面截圖, 沒有針對遊戲進行鍼對性開發.]

[開發感悟]
我已經有5~6年不用MFC來開發項目了, 大多數情況都是用DELPHI和C#, 但是這個項目必須要用C/C++, 所以在Windows平臺下首選的是MFC, 一股濃濃懷舊的味道. 通過這8個小時的開發, 特別感悟出, MFC還是那麼的強大而且改進了不少, 做偏底層的還是MFC最合適.

[函數截圖]



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