#
摘要: 如何使用BHO定制你的Internet Explorer浏览器 ,当时觉得这个是一个很好的资料。。
阅读全文
摘要: doxygen 使用简介(C,C++为代码作注释)
阅读全文
最近看朋友玩QQ找茬( QQ找茬主要是比较2张图片的不同之处,然后双击即可 ) 我也去玩了把,结果高手如云,沦为近视眼(等级)打算写个程序让程序自动去识别,自动去点击鼠标。
实现方法很简单,先得到2张需要比较的图片(可以通过QQ找茬窗口句柄,得到当前HITMAP,然后得到其像素点),建立一个一张表的数组,然后比较其对应像素点的值是否相同,不同为1,相同为0.
这样就可以在内存中得到不同的区域,但这个区域是离心的,也就是不完全对,必须对其进行处理,可以通过对这些数组值为1的点进行腐蚀(关于腐蚀算法主要让一些区域膨胀一圈)
其中腐蚀算法:
对Z中的集合A和B,B对A进行腐蚀的整个过程如下: 是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为: 结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为0,结果图像的该像素为0。否则为1
通过腐蚀过后可以基本上得到我们需要找的区域,然后利用BFS得到其Rect,说明如果用DFS的话可能会出现栈溢出,因为有些区域太大。
得到Rect后可以SetCursorPos设置鼠标位置(注意 : Rect是相对于窗口句柄, SetCursorPos是设置的位置是相对桌面的坐标),最后可以
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
相应事件。
后记:就是在做这个的时候有时候会出现本来是一个区域,程序会统计出2个区域,其实就是在腐蚀算法的时候未处理好,还有一个就是可以通过网络抓包获取原始图片。
因为在预处理的时候,复杂度还是较高,所以在找完一张完整的图片需要5秒左右的时间。
最近学校的事情挺多,同时也换了新的住处。
上周毕业答辩顺利结束,宣告我的大学生活即将结束。四年,弹指一挥,四年,磨一剑,记得刚进大学的时候有过不少憧憬,对一切都充满着幻想,可是四年后的今天,很多憧憬都被现实粉碎,把我的性格磨平了,把我磨得稍微平静了,但是变得更加的倔强,变得比较宅男,有些东西拿得起,放却不下。
6月是一个离别的季节,在这离别之际,不得不给自己的同窗好友说再见,祝福每一个人都有美好的明天,这里充满着我们大学的回忆,有欢笑,有泪水,有无助等等,所有的这一切我都会喜欢,同时也因为女友,我也喜欢怀旧,喜欢把以前的东西翻出来看看,品味得与失。离别是为了下一次重逢,我们会再次相遇。
我不后悔我大学生活,这里我认识了不少朋友和老师,学到的不仅是知识,而更多的是做人,更是思想上进步,这才是想要的。我不浪漫,也不浪漫,我更喜欢独自一个人在哪儿凝思,一个人在哪儿玩游戏,品味这一切自己可能才可能感觉的快乐。
我说话一般不经过大脑,平时可能有些语言过于刺激,但是跟多的是成为笑话,夜深人静的时候我喜欢在哪儿听最近一直听的哪首歌,对着电脑发呆不知道做什么。想着那里来,就那里去吧,去我该去的地方,去我该寻觅的角落,去我小小的世界,去我追寻的港湾,去我……
我口才不怎么好,交流上也不是很主动,但是信念一直支撑着我,坚持,努力,为了那当初的承诺和梦想。
在工作上我真的学到不少,最近也没在坚持每天都在哪儿敲键盘,忙毕业答辩的事情,可惜我制作的PPT,对于我长篇大论的说算法,老师却没多大兴趣。在公司学会了代码重用性,可扩展性的重要行。在后期维护以及代码重用都是很重要,一个好的设计模式可能直接影响整个系统的性能或者稳定性。最近也比较闲,没事看到内存池,脚本系统的设计。自己的兴趣一直在网络,虽然学得较浅,但是还是坚持学习,感谢公司的fox,kevinlynx,pozen,还有女友一切帮助。中午休息时玩war对战,一直被fox虐,一是打得撇,二是很久不打,对其没多大兴趣。
努力吧,为了自己,也为了关心自己的所有人。
很久没来更新blog了,一是忙毕业设计,二是最近看的都是哪些所谓的C++巨著,他们都提供了很多不错的建议;他们能提高你的c++编程能力,也能提高你设计出稳定的c++程序的能力,但是它们的内容主要集中在c++的通用知识,虽然也有一些讲述游戏编程的书籍,但是都不是很深入。
游戏软件开发与一般的程序开发在要求更应该严格。对于游戏应该首先保证稳定,然后效率,性能都很重要。
最近看的主要是模块代码,对于代码分格问题有一定提高。
通过培训对于一个模块开发流程有一定的了解,切记多沟通!
A.特化类的友元模板函数的操作符重载
最近写一测试代码关于特化类的友元模板函数的操作符重载遇到一问题。
先贴一个错误代码:
1#pragma region 类DTest信息
2
3// 声明一个类
4template<class Type , int dim>
5class DTest
6{
7public:
8 // 构造函数
9 DTest()
10 {
11 memset(_cords,0,sizeof(_cords));
12 }
13 DTest(Type cord[dim])
14 {
15 memcpy(_cords,cord,sizeof(cord));
16 }
17
18 // 友元模板
19 friend ostream & operator << (ostream & out , const DTest<Type,dim> & data);
20
21private:
22 Type _cords[dim];
23};
24// 友元模板的实现
25template<class Type, int dim>
26ostream & operator << (ostream & out , const DTest<Type,dim> & data)
27{
28 for(int i = 0 ; i < dim-1 ; i++)
29 out << data._cords[i] <<" ";
30
31 out <<endl;
32 return out;
33}
34
35#pragma endregion
用devc++,Vs2005,vc2008都不能编译通过,报连接错误,或者报模板函数是一个普通非模板类,或者非模板函数。
于是翻开C++ Primer,在16.4节有详细的说明,
1.对于一个特化的类,声明一个友元模板必须对友元模板授予类的一个实例。
2.对特定实例化的友元关系时,必须在可以用于友元声明之前声明类或函数。
所以下面是修改后的代码
1template<class Type , int dim>
2class DTest;
3template<class Type , int dim>
4ostream & operator << (ostream &out ,const DTest<Type,dim> &sess);
5
6
7#pragma region 类DTest信息
8template<class Type , int dim>
9class DTest
10{
11public:
12 // 构造函数
13 DTest()
14 {
15 memset(_cords,0,sizeof(_cords));
16 }
17 DTest(Type cord[dim])
18 {
19 memcpy(_cords,cord,sizeof(cord));
20 }
21
22 // 特化时,<Type,dim> 省略为<>
23 friend ostream & operator << <>(ostream & out , const DTest<Type,dim> & data);
24
25private:
26 Type _cords[dim];
27};
28
29// 友元模板的实现
30template<class Type, int dim>
31ostream & operator << (ostream & out , const DTest<Type,dim> & data)
32{
33 for(int i = 0 ; i < dim-1 ; i++)
34 out << data._cords[i] <<" ";
35
36 out <<endl;
37 return out;
38}
39#pragma endregion
B. 常见的几种内存泄漏
1.分配空间未释放
2.嵌套对象指针未释放,
比如,一个类中包含另一个类的指针,在初始化的时候分配空间,缺没有在析构函数释放他。
3.释放一个对象数组的时候没有使用[] ,
delete m_pObj; 只是释放第一个&m_pObj[0] 对象,应该使用delete [] m_pObj;
4.出现浅拷贝现象
5.返回一个动态分配的对象,其实可以看【effective c++】 的条款23: 必须返回一个对象时不要试图返回一个引用
先总结这些,以后慢慢记录我的学习笔记。