MFC实习的QQ游戏“大家来找茬”游戏辅助工具的实现
这段时间GF一直在玩QQ找茬,看了一下,原理很简单,就是找到2附图片的不同之处,那么程序的思路也就很明了了,就是抓图,存入buffer,比较,显示,这么一个过程。闲话不多说了,下面我用MFC来实现它。
首先先要拿到QQ找茬从窗口的句柄,拿到句柄想咋搞就咋搞,哈哈。当然也可以不要句柄,直接屏幕截图,不过那样就要保证窗口在某个特定的位置,不如句柄来的方便。嗯,还是拿句柄吧,就FindWindow这个函数吧,至于窗口名和类名,用spy++就好啦。
得到句柄之后,接下来要做的是获得窗口大小及设备DC,然后利用CreateCompatibleBitmap函数,创建与QQ找茬窗口DC兼容的BITMAP对象,针对左右2副图,创建2个,便于以后的比较,然后根据坐标偏移,这个用photoshop可以数出来,利用BitBlt函数复制QQ找茬窗口DC里的位图数据进入创建好的BITMAP对象,然后再把BITMAP中的位图数据复制到内存Buffer中,CopyBMPToBuffer是我对GetDIBits函数做了一下简单的封装,少了几个参数而已。代码如下:
BOOL CFindDlg::CopyWindowBlt(CWnd *pWndSrc){ if(pWndSrc == NULL) { return FALSE; }
CRect cRect,cRectClient; pWndSrc->GetWindowRect(&cRect); pWndSrc->GetClientRect(&cRectClient); pWndSrc->ClientToScreen(&cRectClient);
CDC *pSrcDC = NULL; CDC cNewDC; CBitmap cBitmapLeft,cBitmapRight; BITMAPINFO bi;
pSrcDC =pWndSrc->GetDC(); //create Compatible Bitmapwith the game window cBitmapLeft.CreateCompatibleBitmap(pSrcDC, m_nPicWidth,m_nPicHeight); cBitmapRight.CreateCompatibleBitmap(pSrcDC, m_nPicWidth,m_nPicHeight); cNewDC.CreateCompatibleDC(pSrcDC); CBitmap* pcOldBitmap =cNewDC.SelectObject(&cBitmapLeft); //copy bitmap to dc cNewDC.BitBlt(0, 0,m_nPicWidth, m_nPicHeight, pSrcDC, m_nLeftPicLeftTopX - (cRectClient.left -cRect.left), m_nLeftPicLeftTopY - (cRectClient.top -cRect.top), SRCCOPY);
CopyBMPToBuffer(cNewDC.GetSafeHdc(),(HBITMAP)cBitmapLeft.GetSafeHandle(), m_pBufLeft,&bi);
cNewDC.SelectObject(&cBitmapRight); cBitmapLeft.DeleteObject();
cNewDC.BitBlt(0, 0,m_nPicWidth, m_nPicHeight, pSrcDC, m_nRightPicLeftTopX - (cRectClient.left -cRect.left), m_nRightPicLeftTopY - (cRectClient.top -cRect.top), SRCCOPY);
CopyBMPToBuffer(cNewDC.GetSafeHdc(),(HBITMAP)cBitmapRight.GetSafeHandle(), m_pBufRight,&bi);
cNewDC.SelectObject(pcOldBitmap); cBitmapRight.DeleteObject(); cNewDC.DeleteDC(); pWndSrc->ReleaseDC(pSrcDC);
return TRUE;}
完成上述工作以后,要比较的位图已经在2块buffer中了,数学建模完成了,已经转化成数学问题了,下面要做的就是比较数组中的数据和显示了。这里我没有用2维数组来做比较,简单的用一下一维就好啦。建立一块新的buffer,全部置为蓝色,这样可以设置alpha透过,以便直接在QQ找茬窗口上面直接显示差异,稍后就会看到效果。比较算法如下,很简单,找到不同处涂为黄色,临近的左右2点图为红色,iDifFlag是为了只涂边缘的点,实际用下来效果不是很好,如果有更好的算法,请告诉我,其中MAKECOLOR是类似COLORREF的一个宏#defineMAKECOLOR(r, g, b) (0xff000000 | ((r & 0xff)<< 16) | ((g & 0xff)<< 8) | (b &0xff))
for (int i = iLen - 1; i >= 0;i--) { pdwDstBuf[i] = MAKECOLOR(0, 0, 255); //all colorsfill blue, in order to set alpha blend if((pdwLeft[i] != pdwRight[i] &&iDifFlag == 0) || (pdwLeft[i] == pdwRight[i]&& iDifFlag == 1)) {
pdwDstBuf[i] = MAKECOLOR(255,255, 0); if (iDifFlag == 0) { //first different in one time iDifFlag = 1; } else { iDifFlag = 0; }
//nearby points if (i + 1 <iLen) { pdwDstBuf[i + 1] = MAKECOLOR(255, 0, 0); } if (i - 1 >=0) { pdwDstBuf[i - 1] = MAKECOLOR(255, 0, 0); } if (i + 2 <iLen) { pdwDstBuf[i + 2] = MAKECOLOR(255, 0, 0); } if (i - 2 >=0) { pdwDstBuf[i - 2] = MAKECOLOR(255, 0, 0); } i -= 2; } }
然后呢?最后一步了,就是将比较好的位图显示出来,我这里用到CreateBitmap和CreatePatternBrush这2个函数,然后再利用FillRect刷到窗口中,再把窗口用SetLayeredWindowAttributes设置为蓝色透过,然后移动到QQ找茬窗口上方,这样就OK了。不过CreateBitmap要把图片行序颠倒一下,我懒得转2维数组,直接用偏移搞了一下,OK哈哈。
for (DWORDi = 0; i < PIC_HEIGHT / 2; i++) { for (DWORD j = 0; j < PIC_WIDTH;j++) { temp = *((DWORD*)pBuf + i * PIC_WIDTH + j); *((DWORD*)pBuf + i * PIC_WIDTH + j) =*((DWORD*)pBuf + PIC_WIDTH * (PIC_HEIGHT - 1 - i) + j); *((DWORD*)pBuf + PIC_WIDTH * (PIC_HEIGHT - 1 - i)+ j) = temp; } }
cBM.CreateBitmap(PIC_WIDTH,PIC_HEIGHT, 1, 32, pBuf); m_cBr.CreatePatternBrush(&cBM); cBM.DeleteObject();最后用SetWindowPos将显示差异的窗口置为顶层窗口。效果图如下:目前已知的问题:区域标示很奇怪,是算法的问题,上面我也说过了,有个flag,因为不能保证2附图片的点与点完全不同,所以这样的效果也是显而易见的。
更多阅读
怎样安装QQ游戏大厅 下载腾讯游戏大厅
今天就教大家如何安装QQ2012游戏大厅,希望对大家能有所帮助和借鉴。怎样安装QQ游戏大厅——工具/原料qq游戏大厅2012怎样安装QQ游戏大厅——步骤/方法怎样安装QQ游戏大厅 1、如果您是从QQ下载QQ游戏大厅,在下载完后,会自动完成QQ游戏
qq游戏购物券怎么使用 精 qq炫舞购物券怎么使用
qq游戏购物券怎么使用 精——简介QQ游戏购物卷是QQ游戏里面一种能代替Q币购买部分QQ游戏商城物品的道具。不过有些童鞋不知道QQ游戏购物卷怎么使用。QQ游戏购物卷怎么获得。这里小编就嘞为大家来演示一下QQ购物卷的使用方法。以及获
qq游戏人生怎么关闭 精 qq游戏人生官网
qq游戏人生怎么关闭 精——简介QQ游戏人生是一个平台,是腾讯游戏推出的一个新品牌。它记录了玩家一个QQ号码在腾讯旗下所有游戏从开始到发展的所有游戏阶段的成长。 qq游戏人生怎么关闭 精——方法/步骤qq游戏人生怎么关闭 精 1、首
QQ游戏中怎么兑换获得的白金卡? qq游戏白金卡怎么获得
QQ游戏中怎么兑换获得的白金卡?——简介QQ游戏中的欢乐斗地主,当你获得前三名的时候,会有白金卡的奖项。很多人肯定会有疑问,这个白金卡可以做什么用呢?又如何去兑换这个白金卡呢?QQ游戏中怎么兑换获得的白金卡?——工具/原料电脑QQ游戏QQ
qq游戏被加入黑名单的解决方法 qq客服电话怎么转人工
qq游戏被加入黑名单的解决方法——简介由于某种原因,我们登陆qq游戏时候会发现,我们的账号被腾讯封了,不知道是什么原因。其实原因有很多,有可能你登陆游戏用过非法的程序,也有可能你的账号被别人登陆了,做了非法的事情。这个时候,我们该怎