2009年4月26日星期日

该安静一会了

该安静一会了。
就这样,如题.
五一之前,完成MFC,数据库,算是爆发的开始。

2009年4月21日星期二

又是一次反思

在这个不为人知的世界里,我又要进行一次反思了。

微软俱乐部蒋勇团队获得了微软精英大挑战第一名,在这里先祝贺祝贺。反正他们也看不到。

我最近有了女朋友,感觉很快乐。

但这并不能使我浮躁,确实,我这几天确实浮躁了一些。

看到他们的成就,我并不会很急,急功近利反而会事半功倍,我不急,我会稳稳的使自己的技术提高上去,总会有华丽爆发的一天。

成功的唯一路线,便是心静志坚,目标明确,抓紧每分每秒。小鱼,朋友,你们要相信我。

我从不给自己定无法实现,超出能力的目标。所以我一旦定了目标,便一定会将它实现,在我能力范围我为什么不实现。

低调,低调......我缓步前进。。

不能太浮躁。。。

抓紧每一秒。。。最后,要吃早点

2009年4月20日星期一

辩论赛计时器发布







前几天 抽空做了个辩论赛计时器,校辩论队用得。

周日亲眼看到自己写的代码运行在多人面前,感觉很不一般。
代码量:3000

其中代码冗余的地方很多。而且运行的时候还出了点小bug.

不碍事,今天完美无bug版本终于做好了。

还是发几张图吧,下周是决赛,就等看了。






2009年4月13日星期一

又要考试了

软件工程导论,第八周就考试,真是的。。。

最近专业课又多,要学的东西又多,晚上宿舍里3个宿舍连DOTA,我也只有看的份.

心情总是那么平静,感觉自己有点心理疾病。总是想成为一个疯子。。。。我已经确认了自己心里有毛病。所有事情都是平淡的看待,有点感觉没有锐气的感觉,心境进化到这种地步了?这和疯子有点矛盾啊。。。。。

还是做一个神好一些,我想自己差不多具备了这个条件了。。。其实我只是一个狂热的只是份子

又去ORGE的官网看了下,看到了SpeedTree阿,那个效果,看的我心里痒痒的.......



我果然有点问题。。。

2009年4月12日星期日

CScrollView CTreeCtrl


CScrollView::SetScrollSize()呵呵,设置页面的逻辑尺寸,太好了,还是自动滚动的,以后所有控件的实验九在那里面画了。


昨晚断网中,搞到半夜,对那个所谓的树形控件摸索了下

关键字HTREEITEM 然后就是SetImageList() Create() Insert()之类的就有些简单了。关键是可以从ClistCrrl派生自己的控件,消息响应那块没咋搞,也弄个会。马马虎虎做了个类似QQ好友列表的东西,只是表面上看起来一样。俗话所1图胜万语,发图拉。

2009年4月10日星期五

CWinApp::OnFileNew CWinApp::OnFIleOpen CDocument::OnOpenDocument() CDocument::ONNewDocument

单说CArchive,在单文档应用程序中确实方便,但是要是MFC做得是辅助程序,比如地图编辑器,那么生成的文档必然不能在游戏中用,若要用的话得引入MFC库,凭空使程序增加了大小。

单文档ID_File_New 根据我的理解 会调用CWinApp::OnfileNew ,然后CwinApp::OnfileNew 调用 CDocument::OnNewDocument 这个就不用改了。
注意:经过我的实验OnNewDocument是不能用 afx_msg映射的

CwinApp::OnFIleOpen 也是这样都会调用CDocument::OnOpenDocument(name) 注意,CDocument::OnOpenDocument 会调用serilize()函数,这样会串行化,所以在覆盖的时候不要调用CDocument::OnOpenDocument, 那个传入的name 就是弹出CFIleDilog中文件的名字,我估计那个弹出对话框的工作是CWinApp::OnOpenFile()做得。

至于CDocument::OnFileSave() 这个的对话框显示是CDocument做得,也会调用serilize()函数,所以覆盖的时候不要调用基类的OnFileSave就行了,至于对话框的显示,自己做一个吧,就用CFileDialog,很简单。


后面说说OnUpdateAllViews()

Invalidate()是让程序重画窗口。
UpdateAllViews()是在DOC/VIEW结构中,当一个视图的数据改变后,通知所有视图作相应的改变,和重画毫无关系。

Invalidate()是使窗口无效,使系统向其发WM_PAINT消息,使的程序的OnPaint被调用重画客户区。

而UpdateAllViews()是文档与视之间的联系,调用从它会使程序与此文档相关的所有视的UpdateView被调用至于是否重画以及怎么画是由各视的UpdateView来决定的。

Invalidate()是Cwnd的成员函数,与DOC-VIEW无关;
UpdateAllViews是CDocument的成员函数,具体体现DOC-VIEW的精神。

如果仅重画当前窗口用 this->Invalidate(); 如果通知所有和当前文档相关的窗口重画用GetDocument()->UpdateAllViews()(在View中)或this->UpdateAllViews()(在Doc中)。

Invalidate()函数产生一条WM_PAINT消息,并送入windows消息队列中,是窗口产生重画。 而,UpdateAllViews 并不进入windows消息队列中,直接产生重画
*******************************************
Invalidate函数的总结
InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效

InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。

Invalidate()之后:(MFC的,顺便了)OnPaint()->OnPrepareDC()->OnDraw()所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。
Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。

Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放哪里,都是最后的。

InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘之前。UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT

如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。(windows程序设计第5版 P98)
UpdateData()顺便说下,这个函数不是刷新界面用的。UpdateData();参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1618571
onDraw和onPaint函数的区别
CWnd::OnPaint() 是CWnd类的成员函数,是WM_PAINT 消息的响应函数.当你调用CWnd::UpdateWindow(),CWnd::RedrawWindow()时, 或者窗口被其他窗口覆盖,改变大小等事件就会产生WM_PAINT 消息. 你可以在CWnd派生的子类中使用它.

CView::OnDraw()是CView类的一个纯虚函数.你要使用,必须重载它.

CView::OnPaint()会调用它.OnPaint是收到WM_PAINT消息时所调用的,
OnPaint调用OnDraw函数,而由于OnDraw是虚拟函数,你可以自己改写,所以就实现了,不同的绘图目的ondraw用于cview,而onpaint用于cdialogonpait 响应WM_PAINT消息,在CView中,它接着调用OnDraw CPaintDC响应wm_paint消息,自动完成绘制 ClientDC实时绘制一般情况下,你看不到两个函数有什么太大区别,因为一般情况下,它们的任务都是重画窗口。

在CView及其子类中,恰如浪刀所言,OnDraw是由OnPaint调用的,也就是你可以像在窗口类中一样,调用Invalidate函数导致,OnDraw的调用(当然,Invalidate是先导致OnPaint的调用)。 要说OnDraw和OnPaint有什么区别,那就是它除了可以把画画到屏幕外,还可以把它画到其它任何标准输出设备,如打印机


最后再说下OnUpdate()

CView::OnUpdatevirtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
参数:
pSender 指向修改了文档的视图,如果需要更新所有的视图,则为NULL。 lHint 包含了与修改有关的信息。 pHint 指向保存了与修改有关的信息的对象。

说明:框架在视图的文档被修改后调用这个函数;这个函数CDocument::UpdateAllViews调用的,使视图能够更新它的显示以反映那些变化。它也被OnInitialUpdate的缺省实现所调用。缺省的实现使整个客户区域无效,使得下一次接收到WM_PAINT消息时重画这些区域。如果你只想更新与文档的修改部分对应的区域,则应重载这个函数。为此你必须利用提示参数传递有关修改的信息。如果要使用lHint,则应定义特殊的提示值,通常是位掩码或枚举值,并且使文档传递其中的一个值。要使用pHint,则应从CObject集成一个提示类,并使文档传递提示对象的指针。当你重载OnUpdate函数的时候,应使用CObject::IsKindOf成员函数来确定提示对象的运行时类型。通常你不用在OnUpdate中直接执行任何绘图操作。相反,确定以设备坐标表示的矩形,描述要更新的区域,将这个矩形传递给CWnd::InvalidateRect。这会使下一次接收到WM_PAINT消息时产生绘图操作。如果lHint为0,pHint为NULL,文档将发送一个一般的更新通知。如果一个视图接收到了一般的更新通知,或者它没有解码出提示,它将会使整个客户区无效。

关于求职很有意思的文章

这一篇权当做求职的入门初级读物,或许对于已经过了这个阶段的朋友来说显现了一点。
    
故事先从昨天下午的一次面试说起,来面试的是一个刚刚毕业的大学生,85年的,男生。一见面印象就不太好,稀疏的胡子长长短短地留着,脸上很油,头发窝在脑袋上,看不出发型,眼镜片上乌蒙蒙的,我非常怀疑他能不能看得清我,好在从头到尾他都没看我一眼。他的表情一直让我摸不透,好像是那种不太高兴的表情,微皱着眉头,常常有那种“这我也没办法”的表情。
  
按耐下有些不愉快的心情,我还是开始正常给他面试,对于刚刚进社会的大学生,我也没报太高期望,但几个问题的问答还是迅速让我对他失去了兴趣。

“你说你在XX单位实习过对么?”其实简历上写了他在三家单位实习过。

“恩,对。” 

“那YY单位呢?” 

“恩……”不知道他为什么开始支支吾吾。 

“你到底有没有在YY单位实习过?”
  

“有,就是讲去离子水的制备,他们都跟我们讲的。”
 
“哪个科室的人和你讲的?”

“………………很多科室的。”

“那究竟是哪些呢?”
  
“我也搞不清楚。”
  
“……”  
“好吧,你觉得自己最大的特长是什么,也就是你凭什么在这社会上安身立命?”  

“……没什么,……我体育比较好……恩,对了我电脑比较好……”  

“好吧,说说你对我们公司有用的特长。”  

“……其他也没什么了,我大概责任心比较强。”  

“你责任心强表现在什么地方?”  

“反正,交给我做的事情我都会尽力去做。”  

“交给你做的是你尽力去做不是应该的么?难道交给你做的事情你不尽力才是正常的?”  

“……”  

到了这里我已经失去了耐性,问他他还有什么想要了解的,于是他开始和我谈薪水的事情。  

“你们公司的薪水一般是多少?”  

“这,相差比较大,没有一个统一的概念。”  

“那象我这样的呢?”  

“你能做什么呢?我总要根据你能做什么来考虑薪水吧?”  

“反正应聘这个职位的应该总有个大概的薪水吧?”  

“这个岗位,我们刚入职的员工从一千多到三千多都有的,情况不同。”  

“一千多,大学本科的太低了吧?”  

“我说也有三千多的,可是大学本科并不代表更多薪水哦。”  

“你们是不是都喜欢选专科的?我去应聘会上,大多数公司都喜欢选专科的。”  

“他们选专科的自然有他们的理由。”  

“他们都觉得专科的比较能吃苦,我觉得这是不一定的。”  

……  
零七八碎还说了些其他的,只是我已经没有心情听下去了,最终我告诉他准备得太不够充分,很快就打发他走了。    

没有经验的应聘者,他大约是一个典型了,几乎能犯的错误全犯了。  

1.外表和表情,虽然基本上外表不是一个最大的问题,可是第一印象非常糟糕,让我没太有和他仔细对话的兴趣。而且我很难想象象他这个样子跑到我的客户那里,我的客户会怎么想,会不会觉得我们公司要开不下去了?而且看起来精神面貌很差,一点都没有活力,只想离他远点,免得被他搞坏了一天的心情。至少看了他的表情我不会太高兴。  

2.对于自己的经历语焉不详,究竟做过些什么也说不清楚,这很让人怀疑他说的话的真实性,说实话,我认为他就是实习的时候每天去混的。至于他说什么学过这个学过那个就都没有什么可信程度了。  

3.不了解自己,说不出自己有什么特长,又不是在谈朋友,体育特长对公司有用么?电脑好对这个职务有用么?至于他说的有责任心第一并不让人信服,第二也不具体,或许他是很有责任心但是他不知道怎么表达。但我没有义务来帮他发掘他的特长。  

4.没有从招聘者的角度来思考问题,并不是大学毕业社会就欠自己一份工作,要一份工作首先要考虑能给雇主带来什么,如果不考虑这个问题就谈薪水,而且觉得自己大学毕业就应该拿多少薪水,这完全是一厢情愿的事情。正因为有这样的一厢情愿,所以大多数公司才喜欢用大专生多过本科生。  

5.不自信,从头到尾,没有正眼看我,不是在看地板就是在看天花板,支支吾吾,说起他为什么这个样子就会对自己的学校一大堆牢骚,我总觉得他好像有很多怨念,好像让学校给害了,其实他那个学校还算不错,而且原来一个专科学校刚刚被合并变成本科,不知道有什么不好。    

总而言之,没有准备充分,在我看来,所谓准备充分,就是要反复问自己这三个问题,并且找到答案。  

1.我对这家公司有什么用?  

2.我究竟想要的是什么?是这家公司能提供的么?  

3.我想要的东西和我能提供的东西对等么?

前面碰到的这种应聘人员应该属于比较特别的,我也记不得我曾经面试过多少这样的人了,总有很多无奈。写下这些文字的目的也是为了能帮上这些人,以此对社会尽自己一点绵薄之力罢了。    

其实,我总觉得,应聘首先要关注的是自己,自己想要什么?基本上,我们之中的大多数人,一生中最大的一部分都是花在了工作上面,最终我们成为什么样的人,过什么样的日子,都受到工作很大的影响。所以,最要紧的事情,先想好自己想要什么。    

从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作的薪水,这在刚刚出校园的学生中间是很常见的。正常人大概要工作35年,这好比是一场马拉松比赛,和真正的马拉松比赛不同的是,这次比赛没有职业选手,每个人都只有一次机会。要知到,至少有一半人甚至坚持不到终点,大多数人最后是走到终点的,只有少数人是跑过终点的,因此在刚开始的时候,去抢领先的位置并没有太大的意义。刚进社会的时候如果进500强公司,大概能拿到3k-6k/月的工资,有些特别技术的人才可能可以到8k/月,可问题是,5年以后拿多少?估计5k-10k了不起了。起点虽然高,但增幅有限,而且,后面的年轻人追赶的压力越来越大。 看待工作,至少要看15年,基本上,15年以后,再重新开始的机会不大。剩下的20年基本上只能在原来十五年的基础上保持或者缓慢增长了。所以,40岁以后你做什么?这个问题很重要。刚开始找工作的人,生活还没什么压力,上面的老人身体还好,下面又没有孩子,不用还房贷,也没有孩子要上大学,但是到了40岁,老人老了,要看病要吃药,要有人看护,要还房贷,要养小孩,那个时候需要挣多少钱才够花才重要。    

外企公司40岁附近的经理人是很尴尬的,我见过的40岁附近的外企经理人大多在一直跳槽,最后大多跳到民企。我们也可以发现,外企公司少有中国员工在40岁以上的。进外企的人的成功很大程度上是公司的成功,并非个人的成功,西门子的确比国美大,但并不代表西门子中国经理比国美的老板强,甚至可以说差得很远。而进外企的人往往并不能很早理解这一点,把自己的成功90%归功于自己的能力,实际上,外企公司随便换个中国区总经理并不会给业绩带来什么了不起的影响。好了问题来了,当这些经理人40多岁了,他们的薪资要求变得很高,而他们的才能又不是那么出众,作为外企公司的老板,你会怎么选择?有的是要出位的精明强干精力冲沛的年轻人,有的是,为什么还要用你?当初微软有个唐骏,很多大学里的年轻人觉得这才是他们向往的职业生涯,我在清华bbs里发的帖子被这些学子们所不屑,不过如今看来,我还是对的,唐骏没声音了,而且是在陈天桥手里没声音了。一个高学历的海归在500强的公司里拿高薪水,这大约是很多年轻人的梦想,问题是,每年毕业的大学生都在做这个梦,好的职位却只有500个。  

我想,一个人应该把这辈子最大的困难放在最有体力最有精力的时候,如果到了40多岁,那正是一辈子最脆弱的时候,上有老下有小,如果在那个时候碰上了职业危机,实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点苦,好让自己脆弱的时候活得从容一些。    

基本上从职业规划来说,人还是要从长远来考虑,刚刚开始的一时一地的得失,实在是算不得什么。

人生的职业生涯就像一场马拉松比赛,很多人跑了一半就跑不动了。上面说的就是这种情况,我常常告诉我老婆,路还长着呢,这个时候不用急,虽然开始的时候大家都急于表现,急于成功,没有关系,一两年之后他们就坚持不住了,那个时候,你还跑得正轻松,他们却已经退出比赛了。正如我所预言的,当初和她资历相当甚至表现突出的,大多辞职了,没辞职的也每日过的苦不堪言。大多数人辞职都是因为不快乐,而加班不是唯一的不快乐的理由。 要让自己在职业的道路上走得更远,首先要让自己工作得快乐,如果一份工作让你觉得不快乐,甚至很受罪,那么你就是那个坚持不到终点的选手,即使你坚持到终点了,这样的人生有意思么? 在这个浮躁的社会,很多人耗不起,你跟一些急于表现,急于成功的人说:“看待工作,至少要看15年”,大家都理解你的好心,然后呢?他们都会认为你拿高工资站着说话腰不酸,腿不疼,还倍儿有精神。现在物价横飞,每个人都要为它买单,很多工作低于10年的人对工作的要求已经很低了,只要能够满足他们的基本生活要求就可以了,他们频繁跳槽,不安于现状只是为了让自己的生活负担小一些,至于事业,呵呵,暂时让它见鬼去吧。 工作好不好并不一定是完全按照赚钱多少来衡量的,看每个人追求不同,不一定大家要一样的价值取向。有的人喜欢挑战,有的人喜欢稳定,有的人喜欢安逸,有些人喜欢忙碌,有的人喜欢管人,有的人只想做好自己的事情,有的人喜欢在外企,有的人喜欢自己创业……最关键的是,“你”喜欢什么? 很多人并不清楚自己想要什么,每每总是跟在别人后面,追捧热门,却不知道自己究竟要去向哪里,过了一阵才发现,其实追求的东西自己其实并不喜欢。比如说出国,大家都觉得有机会出国当然好,可真正出了国的,就真的开心满足了么?未必见得。再比如学英语,英语是很重要,可如果不用,忘得比学得还快,每天痛苦得要死得去背单词,结果却用不上,除了折磨自己,并帮不上自己什么忙。 对于自己想要什么,自己要最清楚,别人的意见并不是那么重要。很多人总是常常被别人的意见所影响,亲戚的意见,朋友的意见,同事的意见……问题是,你究竟是要过谁的一生?人的一生不是父母一生的续集,也不是儿女一生的前传,更不是朋友一生的外篇,只有你自己对自己的一生负责,别人无法也负不起这个责任。自己做的决定,至少到最后,自己没什么可后悔。对于大多数正常智力的人来说,所做的决定没有大的对错,无论怎么样的选择,都是可以尝试的。比如你没有考自己上的那个学校,这辈子就过不下去了?就会很失败?不见的。在继续讨论之前,我有这样几个理论,我并没有证据来验证我的这些理论,我只能把他们称作假设。  

1.所谓普通人,就是说概率这件事是很准的,我们大多数人都是普通人,所以我们必须相信概率。因此,我们不会买彩票中500万,我们不会成为比尔盖茨或者李嘉诚,我们当中很少的人会创业成功,我们之中有30%的人会离婚,我们之中大部分人会活过60岁,我们和朋友合伙做生意很可能会最后翻脸朋友都没得做……很多判断,必须基于概率的考虑。

2.我们究竟会成为一个什么样的人,决定权在我们自己,每天我们都在做各种各样的决定,我可以在这篇文章里少写两行,也可以多写两行,我可以多注意下格式,也可以写成一堆,我可以做件事情更用心,我可以多为别人考虑一点,你可以选择就这样去面试,也可以选择出门前照照镜子……每天,每一刻我们都在做这样那样的决定,我们可以漫不经心,也可以多花些心思,成千上万的决定累计起来,就决定了最终我们是个什么样的人。

3.态度决定很多事情,你可以悲观地看待事情,然后用悲观的做法,把自己的悲观带给别人,也可以乐观地看待事情,用乐观的做法,让别人也乐观起来。往往,成功的人,大多是乐观的。我们也必须相信,我们所处的这个历史环境,既不是特别好,也不是特别差,我们的周围的人和环境,既不是特别差,也不是特别好。我们没什么好抱怨的,也不应该把自己的不成功归咎于外界的环境。把责任推给别人很简单,但这并不能帮助我们什么,相反养成遇到失败就找理由的习惯。世界上有两种人,一种人永远在解释自己为什么做不到,一种人从不解释,因为他不是已经成功就是花时间在研究如何成功,没时间解释。

4.有80%的人成功是因为情商而不是智商,如果你对于某件事情感到愤怒或者不能控制自己的情绪,那么你要改变的不是做法,而是想法。

5.对于我们大多数人来说,贪婪、懒惰、怯懦、放纵、虚荣、不愿承担责任……这些是正常状态,而向上、努力、宽容、克制、勇于承担责任……这些是激发态,学过大学化学的知道所谓激发态就是需要很大能量的状态。我们必须了解,我们的同事,我们的老板,这些人往往都处于正常状态,其实我们自己也往往都处于正常状态。

6.很多时候,大家在做的事情实际上是个财务陷阱。我们在自己的财务上需要算笔账,比如买车,买一般的车要10万,加上各种费用12万(不在上海),如果打车,按照每天100元算,12万可以打4年,加上油钱,过路费,保险,装饰,修理,出事耽误的时间,可以打6年车。省去了停车的麻烦,省去了检修的麻烦,省去了事故处理的麻烦。实在需要辆车出游的时候租一辆就是了,没有必要在刚刚积攒起来一点钱的时候就去买一辆车。按照《穷爸爸富爸爸》里面的关点,要富有就要买进资产,而不是买进负债。一份好的工作,必然是一份员工和公司双赢的工作,任何一方的利益受损,必然导致工作的不愉快。在这个帖子里我们仅从员工的角度来讨论,事实上,没有人会认为自己有问题,99.9%的人一旦发生问题必然先从别人或者环境的身上找原因,如果我们觉得别人都有问题,那么同理就知到,别人一样会觉得我们有问题。    

如果要员工和公司双赢,那么员工也必须考虑一下公司需要什么,要知道公司并不欠你一份工作,只有你的产出大于公司付你的薪水,公司才会乐意雇用你。否则,赔本生意,你自己会做么?所以应聘者最需要考虑的一个问题就是,我有什么价值,这个问题对于第一次找工作的人来说,尤其重要,因为第一次找工作的人往往不清楚自己有什么用。如果真是这样,不妨先听听对方把需求说清楚,然后再想想自己能不能做,而不是急于问薪水多少?人生的曲线应该是曲折向上的,偶尔会遇到低谷但大趋势总归是曲折向上的,而不是象脉冲波一样每每回到起点,我见过不少面试者,30多岁了,四五份工作经历,每次多则3年,少则1年,30多岁的时候回到起点从一个初级职位开始干起,拿基本初级的薪水,和20多岁的年轻人一起竞争,不觉得有点辛苦么?这种日子好过么?    

有人说我站着说话不腰疼,我知到所有人对于薪水的渴望,可是,你想5年以后重来一次么?你想每年都在这种对于工作和薪水的焦急不安中度过么?不想的话,就好好想清楚。饮鸩止渴,不能因为口渴就拼命喝毒药。越是焦急,越是觉得自己需要一份工作,越饥不择食,越想不清楚,越容易失败,你的经历越来越差,下一份工作的人看着你的简历就皱眉头。于是你越喝越渴,越渴越喝,陷入恶性循环。最终只能哀叹世事不公或者生不逢时,只能到天涯上来发泄一把,在失败者的共鸣当中寻求一点心理平衡罢了。我始终觉得我要说的话题,沉重了点,需要很多思考,远比唐笑打武警的话题来的枯燥乏味,但是,天下没有轻松的成功,成功,要付代价。一般我们处理的事情分为重要的事情和紧急的事情,如果不做重要的事情就会常常去做紧急的事情。比如锻炼身体保持健康是重要的事情,而看病则是紧急的事情。如果不锻炼身体保持健康,就会常常为了病痛烦恼。又比如防火是重要的事情,而救火是紧急的事情,如果不注意防火,就要常常救火。找工作也是如此,想好自己究竟要什么是重要的事情,找工作是紧急的事情,如果不想好,就会常常要找工作。往往紧急的事情给人的压力比较大,迫使人们去赶紧做,相对来说重要的事情反而没有那么打的压力,大多数人做事情都是以压力为导向的,压力之下,总觉得非要先做紧急的事情,结果就是永远到处救火,永远没有停歇的时候。(很多人的工作也像是救火队一样忙碌痛苦,也是因为工作中没有做好重要的事情。)那些说自己活在水深火热为了生存顾不上那么多的朋友,今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不去思考,那么或许要继续承受痛苦找工作的结果。 我并不反对跳槽,但跳槽决不是解决问题的办法,而且频繁跳槽的后果是让人觉得没有忠诚度可言,而且不能安心工作。现在很多人从网上找工作,很多找工作的网站常常给人出些馊主意,要知道他们是盈利性企业,当然要从自身盈利的角度来考虑,大家越是频繁跳槽频繁找工作他们越是生意兴隆,鼓动人们跳槽是他们的工作。所以他们会常常告诉你,你拿的薪水少了,你享受的福利待遇差了,又是“薪情快报”又是“赞叹自由奔放的灵魂”。至于你跳了槽是否解决问题,是否更加开心,那个他们管不着。问题发生了,躲是躲不开的,很多人跳槽是因为这样或者那样的不开心,如果这种不开心,在现在这个公司不能解决,那么在下一个公司多半也解决不掉。你必须相信,90%的情况下,你所在的公司并没有那么烂,你认为不错的公司也没有那么好。每个公司都有每个公司的问题,没有问题的公司是不存在的。换个环境你都不知道会碰到什么问题,与其如此不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许并没有那么难。有的时候你觉得问题无法解决,事实上,那只是“你觉得”。  

以前上大学的时候,有个老师,对我们说,你们现在碰到的这些事情算什么事情,相对我们这些人来说∑=0,那个时候我们是很不服气的,觉得老头在倚老卖老,随着年龄的增长,才知道,果然,学校里那点经历那点荣誉那点知识相对于整个人生来说,基本可以忽略不计。我在天涯上常常看到《为了工作,我抛弃了尊严》这样的文章,我都不知道现在的年轻人哪来那么多尊严,动不动就觉得自己被冒犯了,这样活在社会上,很难。 很多朋友希望我给与一些职业生涯上的建议,我只能说,我也只是一个普通人,不是来当上帝给标准答案的,我也不知道什么答案适合你,何况社会学范畴里这世界上也没有什么标准答案,写这个帖子的目的是为了帮助你自己找到自己的答案。授人以鱼不如授人以渔,我不会拿出一个答案给你,这样对你也不负责,我只能告诉你应该怎么想这个问题。而且我总是觉得,大多数时候选择什么并不要紧,大多数的选择并没有对错之分,要紧的是选择了以后要怎么做。一个大学生毕业了,他要去微软也好,他要卖猪肉也好,他要创业也好,他要做游戏代练也好,都没有什么关系,要紧的是,选择了以后,怎么把事情做好。

2009年4月8日星期三

真魂斗罗

魂斗罗,一款耳熟能详的游戏。

2002年发售的真魂斗罗,今天被通关了,虽然是个badEnding,好歹我也练了两天了。

游戏画质是非常的好,这让我不得不感叹美工的力量,尤其是哪个爆炸效果,看着太爽了。(就是boss做的有些恶心)。

游戏保持了一代的秘籍,上上下下 左1右1左2右2左3右3,这样可以立即让你的只数变成30只,不过30只也不好打,费劲努力,30只才只能在normal难度下打过第5关。

另外就是游戏的一大特色,破击率低的话达不到隐藏关卡,看不到原画CG,拿不到隐藏武器。

哎,我自问是废不了那些时间练习这个了,第五关,呵呵,在优酷上把67关看了也就当是自己玩了吧。

此游戏唯一不足之处就是GUI的模式太差,游戏中连个退出按钮都没有,这是唯一令人郁闷的地方。

由于打得太投入,图也没截下几张,截得都是些无关紧要的图,将就吧。


思考

关于文件储存的问题,昨天晚上和今天早上看了一下MFC中CFile,CStdioFile,CArchive,个人感觉MFC中文档的串行化是一个很方便的东西。

地图编辑器文件储存格式的话,针对于魔塔那个小游戏,我想一般的txt就应该够了,但是这并不是一个好办法,我想到了暑假中学习过得xml,是的,xml确实是储存信息的好方法,可以自己设计树形结构,精确的查找定位。

关于c++中读写xml,我去搜了一下,阿帕奇的xerces-c重量级的xml parser,花些时间研究研究吧。

2009年4月7日星期二

BrowseInfo ShellExcute

看来还是少玩游戏的好,从12点到3点完了鬼泣,然后睡了一觉,就到5点了,哎,失误啊。不多说了。
学到的是选择文件夹对话框的创建。
关键字BrowseInfo。ItemIDlist

CString sFolder;
LPMALLOC pMalloc;
// Gets the Shell's default allocator
if (::SHGetMalloc(&pMalloc) == NOERROR)
{
BROWSEINFO bi;
char pszBuffer[MAX_PATH];
LPITEMIDLIST pidl;

bi.hwndOwner = GetDesktopWindow();
bi.pidlRoot = NULL;
bi.pszDisplayName = pszBuffer;
bi.lpszTitle = _T("Select a directory...");
bi.ulFlags = BIF_RETURNFSANCESTORS BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
// This next call issues the dialog box.
if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
if (::SHGetPathFromIDList(pidl, pszBuffer))
{
// At this point pszBuffer contains the selected path
sFolder = pszBuffer;
}
// Free the PIDL allocated by SHBrowseForFolder.
pMalloc->Free(pidl);
}
// Release the shell's allocator.
pMalloc->Release();
}


还有就是ShellExcute()这个函数可以根据路径运行一个相应程序或者打开一个文件。补充下:关于第二个参数执行的操作类型,个人在main()函数尝试了下,有以下理解。
"open"表示打开
"explore"可以打开文件夹,不过是用资源管理器打开
"find"会直接调用windows自带的那个搜索器

以前看到浩哥做得那个在shell下输入ps就可以运行Photoshop,输入qq就可以运行qq,想起来也就是用在本地文件保存了一张表,这张表对应了相应的快捷键和路径,然后用shellExecute运行....
ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
  有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。
  ShellExecute函数原型及参数含义如下:
  ShellExecute(
  HWND hwnd, //父窗口句柄 (如:NULL,Handle等)
  LPCSTR lpOperation, //操作类型 (如:"open")*要加英文双引号
  LPCSTR lpFile, //要进行操作的文件或路径
  LPCSTR lpParameters, //当lpOperation为“explore”时指定要传递的参数,通常设为NULL
  LPCSTR lpDirectory, //指定默认目录,通常设为NULL
  INT nShowCmd //文件打开的方式,以通常方式还是最大化或最小化显示,一般为SW_SHOWNORMAL
  )
  例子如下:
  //调用计算器
  ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
  //调用记事本
  ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);
  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。
  ●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。
  ●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
  ●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。
  ●Directory:用于指定默认目录。
  ●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
  若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。
  上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。
  2.特殊用法
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。
  格式一:http://网站域名。
  如:ShellExecute(Handle, "open", http:// ;
  www.neu.edu.cn’, NULL, NULL, SW_SHOWNORMAL);
  格式二:http://网站域名/网页文件名。
  如:ShellExecute(Handle, "open", http:// ;
  www.neu.edu.cn/default.htm',NULL,NULL,
  SW_SHOWNORMAL);
  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。
  格式一:mailto:
  如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。
  格式二:mailto:用户账号@邮件服务器地址
  如:ShellExecute(Handle, "open"," mailto:who@mail.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。
  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。
  例子(delphi):
  在一个应用程序调用c:\Project1.exe;
  ShellExecute(handle, 'open','c:\Project1.exe','字串内容',nil, SW_SHOWNORMAL);
  在Project1.exe里可以调用:
  procedure TForm1.FormCreate(Sender: TObject);
  var i:integer;
  begin
  for i:=1 to paramcount do
  if ParamStr(i)<>'' then showmessage(ParamStr(i));
  end;
  最后的那个参数,为窗口指定可视性方面的一个命令。
  请用下述任何一个常数
  SW_HIDE 隐藏窗口,活动状态给另一个窗口
  SW_MINIMIZE 最小化窗口,活动状态给另一个窗口
  SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
  SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
  SW_SHOWMAXIMIZED 最大化窗口,并将其激活
  SW_SHOWMINIMIZED 最小化窗口,并将其激活
  SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
  SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
  SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
  SW_SHOWNORMAL 与SW_RESTORE相同

鬼泣3(2)

中午刚吃过饭,看代码也有些累了,闲着也是闲着。
接着昨天的战役,今天挑战的boss有一只大蜈蚣,小丑,和刀斧二人组。
那个蜈蚣是相当的简单,小丑也很简单,就是躲闪要躲闪好。刀斧二人组还算挺有难度的,整个过程只吃了一个血。
鬼泣那美工的确做得好啊,单看但丁的动作,如此流畅协调,用手柄玩的如此流畅,再看CG动画又做得如此之华丽,如此的帅,再续辉煌之作。
整个游戏音效很好,砍人的判定也做的无比精准。开枪判定也是很精准。不多说了,发几张图上来。





小鱼 对不起

无意间转到峰哥做得那个靖边人网站,一种无地自容的感觉瞬间传遍了我的全身。

真的是要拼搏了,我在游戏制作上达到的高度无法和他们网页制作达到的高度相提并论。

不过这样也好,本人最喜欢的就是挑战了,越困难我就越兴奋,在这里只能无比愧疚的对小鱼说声:“对不起,真的得走了。虽然你看不到我在这里的文字,也就不会有一丝哀叹吧。其实,在体育课上能远远的望见你我就很满足了...

看代码ing

2009年4月6日星期一

MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别

转帖http://blog.csdn.net/wuyijc/archive/2008/05/27/2487177.aspx
http://www.cppblog.com/Lee/archive/2008/09/19/62305.html
ON_COMMAND是菜单和工具栏项处理消息的宏
ON_MESSAGE是处理自定义消息的宏
ON_NOTIFY 是控件向其父窗口发送消息处理的宏对这几个消息的理解要先了解一下Window消息的背景。在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中。由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以Windows3.1中定义了许多其它的消息种类,比如WM_VSCROLL, WM_CTLCOLOR等等,每种消息wParam,lParam中附带的信息是不同的。当到了Win32后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在Win32中定义了唯一一个强大的消息 WM_NOTIFY。当然WM_NOTIFY也遵守原来的消息规则,既只带参数wParam和lParam。唯一不同处在于,此时的lParam中传送的是一个NMHDR指针。不同的控件可以按照规则对NMHDR进行扩充,因此WM_NOTIFY消息传送的信息量可以相当的大,这个可以看看MSDN中的相关说明,TreeControl中就有很多这种消息。现在就可以知道为什么有ON_MESSAGE ,ON_COMMAND, , ON_NOTIFY了。ON_MESSAGE是处理所有的Windows的消息的,因为所有的消息都以相同的格式传送,也就是ID, WPARAM, LPARAM.ON_COMMAND是专门处理WM_COMMAND消息的,这样我们就不用自己解开WM_COMMAND中wParam和lParam中传送的控件ID,事件种类…(所有的都在MFC内部解决了:),当然方便了。ON_NOTIFY更是不用说了,看看他的处理函数,是不是把NMHDR解出来了。这样一样就一目了然了,ON_COMMAND和ON_NOTIFY都可以用ON_MESSAGE来处理,只不过自己要多做很多事情。ON_COMMAND和ON_NOTIFY最好就不要互换了!



几点说明:
1、ON_COMMAND(id,memberFxn) 此宏通过ClassWizard或手工插入一个消息映射。它表明那个函数将从一个命令用户接口(例如一个菜单项或toolbar按钮)处理一个命令消息。当一个命令对象通过指定的ID接受到一个Windows WM_COMMAND消息时,ON_COMMAND将调用成员函数memberFxn处理此消息。在用户的消息映射中,对于每个菜单或加速器命令(必须被映射到一个消息处理函数)应该确实有一个ON_COMMAND宏语句。
2、ON_MESSAGE(message,memberFxn)指明哪个函数将处理一用户定义消息。用户定义消息通常定义在WM_USER到0x7FF范围内。用户定义消息是那些不是标准 Windows WM_MESSAGE消息的任何消息。在用户的消息映射中,每个必须被映射到一个消息处理函数。用户定义消息应该有一个 ON_MESSAGE宏语句。
3、ON_Update_COMMAND_UI(id,memberFxn)此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个用户接口个更改命令消息。在用户的消息映射中,每个用户接口更改命令(比讯被映射到一个消息处理函数)应该有一个ON_Update_COMMAND_UI宏语句。4、ON_VBXEVENT(wNotifyCode,memberFxn) 此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个来自VBX控制的消息。在用户的消息映射中每个被映射到一消息处理函数的VBX控制消息应该有一个宏语句。5、ON_REGISTERED_MESSAGE(nmessageVarible,memberFxn) Windows的RegisterWindowsMesage函数用于定义一个新窗口消息,此消息保证在整个系统中是唯一的。此宏表明哪个函数处理已注册消息。变量nMessageViable应以NEAR修饰符来定义。
6、ON_CONTROL(wNotifyCode,id,memberFxn)表明哪个函数将处理一个常规控制表示消息。控制标识消息是那些从一个控制夫发送到母窗口的消息。

鬼泣3(1)

看着CFileFind有点累了,那个dlg涉及的东西还真多,tnnd,玩会游戏再说。
话说我的ps16张碟子终于到了,以前在pc上玩的鬼泣3,感觉自己机子运行上有点卡,现在专用的ps2来了,哈哈。这几张碟子估计够我玩一个学期了
刚把那只狗打过去,话说鬼泣3做得还真好,尤其是打斗系统,那真是爽的不行,由此对capcom佩服的五体投地。
发几张游戏截图上来

CFileFind

今天研究CFileFind
1、CFileFind类的声明文件保存在afx.h头文件中。
2、该类的实现的功能:执行本地文件的查找(查找某个具体的文件,查找某类文件x*.x*,查找所有文件*.*)
3、CFileFind类是CGopherFileFind和CFtpFileFind类的基类。
4、CFileFind类的构造函数::CFileFind()和关闭函数::Close()我会成对使用。
5、CFileFind类的成员函数我根据其操作特性划分为3类:查找操作类、获得文件属性类、判断文件属性类。(下面我先进行函数罗列并没有完整的描述函数的参数)
查找操作类
::FindFile();
::FindNextFile();
获得文件属性类
::GetCreationTime();
::GetLastAccessTime();
::GetLastWriteTime();
::GetFileName();
::GetRoot();
::GetFilePath();
::GetFileTitle();
::GetFileURL();
::GetLength();

判断文件属性类
::IsArchived();
::IsCompressed();
::IsDirectory();
::IsDots();
::IsHidden();
::IsNormal();
::IsReadOnly();
::IsSystem();
::IsTemporary();
::MatchesMask();
6、CFileFind类中成员函数使用应注意的顺序
在创建了CFileFind对象后,先执行::FindFile()函数,然后执行::FindNextFile(),然后选择执行(获得文件属性类)的函数或者(判断文件属性类)函数。
7、CFileFind类成员函数的详细分析
virtual BOOL FindFile(LPCTSTR pstrName = null,DWORD dwUnused = 0);
该函数若返回非0 则表明执行成功,0 则表明执行不成功。
pstrName:需要查找的文件名,例:“E:\\编程工具\\VC++\\MFC例子.rar”,“E:\\编程工具\\VC++\\MFC*.rar”,“E:\\编程工具\\VC++\\*.*”,也可以是NULL表示“*.*”。
dwUnused:必须为0

virtual BOOL FindNextFile();
该函数返回值非0 还有符合条件的文件, 0表示是最后一个文件。

virtual BOOL GetCreationTime(FILETIME *pFileTime) const;
virtual BOOL GetCreationTime(CTime& refTime) const;
该函数用来获得查找到的某个文件的创建时间,返回值非0 获得创建时间成功操作,0表示执行获得创建时间失败或者FindNextFile()没有被执行的时候。
FILETIME *:容纳时间的结构指针
CTime&:容纳时间的对象地址
此处介绍:FILETIME和CTime相互转换的处理方法:
FILETIME转CTime的方法:
A、CTime对象在初始化时可以传递FILETIME结构
FILETIME ft;
CTime time(ft);
B、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构
FILETIME ft;
SYSTEMTIME st;
BOOL bSuccess = ::FileTimeToSystemTime(&ft , &st);
CTime time(st);
CTime转FILETIME方法:
CTime time(CTime::GetCurrentTime());
SYSTEMTIME st;
time.GetAsSystemTime(st);
FILETIME ft;
::SystemTimeToFileTime(&st,&ft);

virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;
virtual BOOL GetLastAccessTime(CTime& refTime) const;
该函数用来获得某个文件最后被访问的时间,非0表示执行成功,0表示执行失败或者FindNextFile()函数没有执行的时候。

virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;
virtual BOOL GetLastWriteTime(CTime& refTime) const;
该函数用来获得某个文件最后被访问的时间,非0表示执行成功,0表示执行失败或者FindNextFile()函数没有执行的时候。

virtual CString GetFilePath() const;
该函数用来获得查找到的文件绝对路径,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“E:\\编程工具\\VC++\\MFC.rar”

virtual CString GetFileName() const;
该函数用来获得查找到的文件的全称,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“MFC.rar”

virtual CString GetFileTitle() const;
该函数用来获得查找到的文件的名称,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“MFC”

virtual CString GetRoot() const;
该函数用来获得查找到的文件的根目录,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“E:\\编程工具\\VC++\\”

virtual CString GetFileURL() const;
该函数用来获得查找到的文件的URL路径,必须在执行了FindNextFile()后该函数才能执行成功。
返回的结果是CString对象,例“file://E:\\编程工具\\VC++\\MFC.rar”

DWORD GetLength() const;
该函数返回值获得查找到的文件的长度,必须在执行了FindNextFile()后该函数才能执行成功。

BOOL IsArchived() const;
该函数用来判断查找的文件属性是否是档案文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsCompressed() const;
该函数用来判断查找的文件属性是否是压缩文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsDirectory() const;
该函数用来判断查找的文件属性是否是路径文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsDots() const;
该函数用来判断查找的文件属性是否是“.”,“..”,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsHidden() const;
该函数用来判断查找的文件属性是否隐藏文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsNormal() const;
该函数用来判断查找的文件属性是否正常文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsReadOnly() const;
该函数用来判断查找的文件属性是否只读文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsSystem() const;
该函数用来判断查找的文件属性是否系统文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL IsTemporary() const;
该函数用来判断查找的文件属性是否临时文件,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功

BOOL MatchesMask(DWORD dwMask) const;
该函数用来判断查找的文件的综合属性,非0表示是,0表示不是。必须在执行了FindNextFile()后该函数才能执行成功
dwMask参数的使用方法:几种文件属性采用或运算()
文件属性的结构定义:
FILE_ATTRIBUTE_ARCHIVE:档案文件
FILE_ATTRIBUTE_COMPRESSED:压缩文件
FILE_ATTRIBUTE_DIRECTORY:路径文件
FILE_ATTRIBUTE_NORMAL:正常文件
FILE_ATTRIBUTE_READONLY:只读文件
FILE_ATTRIBUTE_SYSTEM:系统文件
FILE_ATTRIBUTE_TEMPORARY:临时文件
FILE_ATTRIBUTE_HIDDEN:隐藏文件

心境上的总结

放假了2天了,BNB段位刚开赛就被我打了个3段,看来真的是到了极致了,我相信现实中我也可以如此极致。
根据我实践中的经验,一个人还是说道做到得好,不管是对自己说的,还是对别人说的,这不仅是毅力上的锻炼,而且也是勇气的锻炼。
再次根据我实践中的经验,我还是少说话的好,这是一种舒服的感觉,也是一种让大脑保持清醒的方法。
顺带提一下关于爱情,我曾经无比热情的对待了它,但是........我不想说了。对此,我想到:这就是命运吧。还是技术好啊,至少你很懂事......
孤独一世也好,总之,我是不会再爱情付出我的热情了,除非你能像我一样付出的热情可以令我如此感动...........我说到做到。。。
有人曾经告诉我,不能变成机器,但是此刻,我毫无疑问的要成为机器了,心已静,眼已冷,若如此我不会再败。
别了,花花世界。