Posted on 2010-11-29 21:57
海邊沫沫 閱讀(3190)
評論(6) 編輯 收藏 引用 所屬分類:
高起點C++學習之路
不久前發表在首頁的
QQ美女找茬(外掛)學習筆記一文讓我深受啟發,我看了該文章后,也自己動手實現了一個外掛,效果挺不錯的。請看截圖:

從圖中可以看出,我沒有讓結果顯示在原游戲窗口中,而是顯示在了外掛窗口中。這么做是為了實現起來簡單。我的實現的確是很簡單的:先通過向導創建一個SDI項目,再在工具欄上添加一個按鈕,再為該按鈕添加事件處理程序即可,所有的代碼都在這個事件處理程序中。另外,要感謝MFC為我們提供的CDC類、CBitmap類以及ATL提供的CImage類。代碼很簡單,簡單得我都懶得解釋了:
void CI_Love_BeautyView::OnFind()
{
//游戲中圖片的位置及大小
int nPicWidth = 498-1;
int nPicHeight = 448;
int nOffsetLeftPicX = 8;
int nOffsetLeftPicY = 193;
int nOffsetRightPicX = 516 + 1;
int nOffsetRightPicY = 193;
//獲取游戲窗口指針
CWnd* pGame = FindWindow(NULL, _T("大家來找茬"));
//將游戲數據復制到兩個CBitmap對象中
CDC *pSrcDC=pGame->GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pSrcDC);
CBitmap bitmap_left;
bitmap_left.CreateCompatibleBitmap(pSrcDC,nPicWidth,nPicHeight);
CBitmap bitmap_right;
bitmap_right.CreateCompatibleBitmap(pSrcDC,nPicWidth,nPicHeight);
//獲取左邊的圖片
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap_left);
memDC.BitBlt(0,0,nPicWidth,nPicHeight,pSrcDC,nOffsetLeftPicX,nOffsetLeftPicY,SRCCOPY);
//獲取右邊的圖片
memDC.SelectObject(&bitmap_right);
memDC.BitBlt(0,0,nPicWidth,nPicHeight,pSrcDC,nOffsetRightPicX,nOffsetRightPicY,SRCCOPY);
memDC.SelectObject(pOldBitmap);
//創建兩個CImage對象,然后逐像素比較
CImage image_left;
CImage image_right;
image_left.Attach(bitmap_left);
image_right.Attach(bitmap_right);
for(int i=0; i<nPicWidth;i++){
for(int j=0; j<nPicHeight; j++){
if(image_left.GetPixel(i,j) != image_right.GetPixel(i,j)){
image_left.SetPixel(i,j,RGB(255,0,0));
}
}
}
//顯示結果
CClientDC dc(this);
image_left.BitBlt(dc,0,0);
}