posts - 195, comments - 34, trackbacks - 0, articles - 1

哈佛馆训

 
1.现在睡觉的话会做梦而现在学习的话会让梦实现
This moment will nap, you will have a dream; But this moment study, you will interpret a dream.
2.我无所事事地度过的今天是昨天死去的人们所奢望的明天
I leave uncultivated today, was precisely yesterdayperishes tomorrow which person of the body implored.
3.感到晚了的时候其实是最快的时候
Thought is already is late, exactly is the earliest time.
4.不要把今天的事拖到明天
Not matter of the today will drag tomorrow.
5.学习的痛苦是一时的而没有学习的痛苦是一辈子的
Time the study pain is temporary, has not learned the pain islife-long.
6.学习不是人生的全部但连学习都征服不了你还能做什么?
The study certainly is not the life complete. But, sincecontinually life part of - studies also is unable to conquer, what butalso can make?
7.学习不是因为缺少时间而是缺少努力
Studies this matter, lacks the time, but is lacks diligently.
8.所有人的成功都不是偶然的
Nobody can casually succeed, it comes from the thoroughself-control and the will.郭澧葱
9.无法避免的痛苦就去享受吧!
Please enjoy the pain which is unable to avoid.
10.早起的鸟儿有虫吃
Only has compared to the others early, diligently diligently, canfeel the successful taste.
11.成功并不属于每个人
Nobody can casually succeed
12.时间在流逝
HOW time flies
13.今天流下的口水将变成明天流下的泪水
Now drips the saliva, will become tomorrow the tear

posted @ 2008-11-01 22:11 小强摩羯座 阅读(83) | 评论 (0)编辑 收藏


    从马思伟那里看过来的,此君不是一般牛人也,其在视频编码方面成就令人仰慕,吾若可略有所成,便是万幸,会感天谢地。

下在是网站对这个性格测试的说明:

由美国的心理学家Katherine Cook Briggs (1875-1968) 和她的心理学家女儿Isabel Briggs Myers根据瑞士著名的心理分析学家Carl G. Jung (荣格)的心理类型理论和她们对于人类性格差异的长期观察和研究而著成。经过了长达50多年的研究和发展,MBTI已经成为了当今全球最为著名和权威的性格测试。

主要应用于职业发展、职业咨询、团队建议、婚姻教育等方面,是目前国际上应用较广的人才甄别工具。

人的性格倾向,就象分别使用自己的两只手写字一样,都可以写出来,但惯用的那只写出的会比另一只更好。每个人都会沿着自己所属的类型发展出个人行为、技巧和态度,而每一种也都存在着自己的潜能和潜在的盲点。本次测试主要探讨各种性格类型与相关职业的匹配程度。

MBTI倾向显示了人与人之间的差异,而这些差异产生于:
– 他们把注意力集中在何处,从哪里获得动力(外向、内向)
– 他们获取信息的方式(实感、直觉)
– 他们做决定的方法(思维、情感)
– 他们对外在世界如何取向;通过认知的过程或判断的过程(判断、知觉)

用字母代表如下:

精力支配:外向 E — 内向 I

认识世界:实感 S — 直觉 N

判断事物:思维 T — 情感 F

生活态度:判断 J — 知觉 P

其中两两组合,可以组合成16种人格类型。




我的测试结果:    

Psytopic分析:您的性格类型是“ISTJ”(内向+实感+思维+判断)

沉静,认真;贯彻始终、得人信赖而取得成功。讲求实际,注重事实和有责任感。能够合情合理地去决定应做的事情,而且坚定不移地把它完成,不会因外界事物而分散精神。以做事有次序、有条理为乐---不论在工作上, 家庭上或者生活上。重视传统和忠诚。

ISTJ型的人是严肃的、有责任心的和通情达理的社会坚定分子。他们值得信赖,他们重视承诺,对他们来说,言语就是庄严的宣誓。 ISTJ型的人工作缜密,讲求实际,很有头脑也很现实。他们具有很强的集中力、条理性和 准确性。无论他们做什么,都相当有条理和可靠。他们具有坚定不移、深思熟虑的思想,一旦他们着手自己相信是最好的行动方法时,就很难转变或变得沮丧。ISTJ型的人特别安静和勤奋,对于细节有很强的记忆和判断。 他们能够引证准确的事实支持自己的观点,把过去的经历运用到现在的决策中。他们重视和利用符合逻辑、客观的分析,以坚持不懈的态度准时地完成工作,并且总是安排有序,很有条理。他们重视必要的理论体系和传统 惯例,对于那些不是如此做事的人则很不耐烦。ISTJ型的人总是很传统、谨小甚微。他们聆听和喜欢确实、清晰地陈述事物。ISTJ型的人天生不喜欢显露,即使危机之时,也显得很平静。他们总是显得责无旁贷、坚定不变 、但是在他们冷静的外表之下,也许有强烈却很少表露的反应。

您适合的领域有:工商业领域、政府机构 金融银行业、政府机构、技术领域、医务领域

您适合的职业有:

· 审计师
· 会计
· 财务经理
· 办公室行政管理
· 后勤和供应管理
· 中层经理
· 公务(法律、税务)执行人员
· 银行信贷员
· 预算分析师
· 保险精算师
· 税务经纪人
· 税务检查员
· 机械、电气工程师
· 计算机程序员
· 数据库管理员
· 地质、气象学家
· 法律研究者
· 律师
· 外科医生
· 药剂师
· 实验室技术人员
· 牙科医生
· 医学研究员
· 信息总监
· 电脑编程员
· 证券经纪人
· 会计
· 文字处理专业人士


注:本测试为beta版,答案供参考,不妨给本次测试结果的准确度给予百分比评价(100%为完全符合)
同时为更好地帮助后来的测试朋友,如果您觉得有不合适或者遗漏的职业,欢迎一起参与这个测试的改善

posted @ 2008-11-01 18:56 小强摩羯座 阅读(184) | 评论 (0)编辑 收藏

yuvyCbCr的差异

Peter Lee 2006.02.28 videosky.9126.com

 

今天在看intel ipp tutorial的时候,看到了讲色彩模型的部分。以前,一直没明白yuvYcbCr之间的差异,想必有些朋友也会有同样的疑惑。所以,我看完之后就记载下来了。

 

一、和rgb之间换算公式的差异

yuv<-->rgb

Y'= 0.299*R' + 0.587*G' + 0.114*B'

U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')

V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')

R' = Y' + 1.140*V'

G' = Y' - 0.394*U' - 0.581*V'

B' = Y' + 2.032*U'

yCbCr<-->rgb

Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16

Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128

Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

R' = 1.164*(Y’-16) + 1.596*(Cr'-128)

G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)

B' = 1.164*(Y’-16) + 2.017*(Cb'-128)

Note: 上面各个符号都带了一撇,表示该符号在原值基础上进行了gamma correction

 

二、来源上的差异

yuv色彩模型来源于rgb模型,

该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。

应用:basic color model used in analogue color TV broadcasting.

 

YCbCr模型来源于yuv模型。YCbCr is a scaled and offset version of the YUV color space.

应用:数字视频,ITU-R BT.601 recommendation

 ps:

通过上面的比较可以确定,我们在h.264,mpeg等编码标准中用的yuv其实是YcbCr,大家不要被名称搞混淆了。

posted @ 2008-10-30 10:45 小强摩羯座 阅读(419) | 评论 (0)编辑 收藏



  知人者智,自知者明。此二句文全出自老子《道德经》。

  智,是自我之智。明,是心灵之明。“知人者”,知于外;“自知者”,明于道。智者,知人不知己,知外不知内;明者,知己知人,内外皆明。智是显意识,形成于后天,来源于外部世界,是对表面现象的理解和认识,具有局限性和主观片面性;明,是对世界本质的认识,具有无限性和客观全面性。欲求真知灼见,必返求于道。只有自知之人,才是真正的觉悟者。

  老子说了,知道别人,你是智慧。你了解别人,你是智慧;你知道自己,了解自己,这是高明。同志们想,知道别人是智慧,知道自己是高明,合起来就是明智,你这个人很明智。


  圣人孔子说过:“知人者智,自知者明,胜人者有力,自胜者强。”意思是说,能认识别人的叫做机智,能认识自己的才叫做高明,能战胜别人的叫做有力,能克制自己的人才算刚强。


   知人者智,自知者明。胜人者有力,自胜者强。

  大意是说:了解他人是一种智慧,而了解自己更是一种智慧;战胜他人表明自己有力量,而战胜自己则表明自己很强大。

  在老子看来,了解他人和了解自己都是智慧,然而了解自己比了解他人更进了一步。

  为什么这样说?

  其一是因为,了解自己要比了解他人难,之所以说难,那是因为自己看不到自己,自己想不到自己;而要看到自己,想到自己,就无原则要有更大的智慧,需要有以他人为鉴的能力。

  这一点,战国时期的哲学家韩非用具体事例做了说明。他说:

  楚庄王欲伐越,杜子谏曰:“王之伐越何也?”曰:“政乱兵弱。”杜子曰:“臣愚患之。智如目也,能见百肯之外而不能自见其睫。王之兵自败于秦、晋,丧地数百里,此兵之弱也。庄路为盗于境内而吏不能禁,此政之乱也。王之弱乱非越之下也,而欲伐越,此智之如目也。”王乃止。故知之难,不在见人,在自见。故曰:“自见之谓明。”

  楚庄王只看到越国朝政混乱、兵力薄弱,而看不到自己国家朝政混乱和兵力薄弱,因此想去讨伐越国。杜子认为这是不明智的,并且用眼睛只能看到外物而看不到自己为比喻,使他明白了自己的缺陷,停止了愚蠢的行动。韩非通过这个事例说胆老子“自知者明”。并且下结论说:达到有智是很难的,之所以难,不是难在了解他人,而是难在了解自己。

  其二是因为,了解自己以具有自我意识为前提,而自我意识一旦产生,这就将会把人的智慧由个体自我意识引向类别自我意识:当人有了个体自我意识的时候,也就在人的头脑中树立起了一个自我的标的,形成了一个全新的认识目标;向着这个目标前进,就会在深入了解个体自我的基础上,逐步形成类别自我的意识。

      

《道德经》“知人者智”有感

      知人者智,自知者明。胜人者有力,自胜者强。知足者富。强行者有志。不失其所者久。死而不亡者寿。

                                                                ——《道德经》第三十三章

    在读这一章的时候,我总是感觉每两句之间是一种递进的关系,细细忖度,似又不全是,前四句倒可以这么判断,后四句就未必了。产生这种模糊的感觉可能与恰好每两句的第二句给我的感触更深有关系。

    “自知者明,自胜者强,强行者有志,死而不亡者寿”。自知比知人更难,自胜比胜人更艰,这是现时为人普遍认可的真理性的结论。“知足者富”则成为有些人挂在嘴边聊以自慰的麻醉剂,使得这一句总是让人联想到停步不前与不思进取。其实从“为”的广义论,老子无为即是有为,因为饯行“无为”的行为就是“有为”。所以“知足者富”更强调的是控制欲望,对结果淡然处之的境界。与此同时,便是要有志,要强行。所以人言:老子的哲学是无为,就是消极避世,是消极哲学,我深不以为然,这是对老子的思想一知半解的产物,是没有读懂老子的主张。否则老子怎么会在“知足者富”后马上阐明“强行者有志”?怎么会还提到“言善信,正善治,事善能,动善时”?

    “死而不亡者寿”是老子对生命价值的阐述,也引发了我对生死问题的思考。人从出生一刻起就在经历死亡的过程。死亡是死亡过程的终结,也是死亡过程的高潮,就如同新年午夜的最后一声钟鸣。所以,所有活着的人都无时无刻不是在体验死亡的过程。长寿不单纯是以存活时间来计算的,如果用整个人类的历史来衡量,活到二百岁,与活二十岁的区别小到可以忽略不计。对于个体来讲,多活几十年在生命终结时也是没有多大差别的,遗憾也罢,没有遗憾也罢,都要撒手的。而生命的价值则是长寿的矫正值。老子的思想存活到现在,历经约2500多年而不朽,老子的寿命应是实际生存时间加上这还在延续的2500多年。普通百姓一生疼儿疼女,他的寿命则应是实际生存时间加上儿女怀念他的时间。而如果生命特征仍在,但凡事以一己私利为本,全然无惠及他人之处,那么,他的寿命就要做减法了,需要用实际生存时间减去开始自私自利的时间。左派诗人臧克家的那句诗是有道理的:有的人活着,他已经死了。有的人死了,他还活着。我们都要反省,我们还活着吗?我们要怎样活?

posted @ 2008-10-28 23:23 小强摩羯座 阅读(170) | 评论 (0)编辑 收藏

一个可爱男人对老婆的忏悔
2008-08-08 10:20
遵照您的旨意,我在书房里反省了一个小时四十三分零七秒,喝了一杯白开水,上了一次卫生间,没有抽烟,以上事实准确无误,请审查。附上我的检讨报告,不当之处可以协商。
  经过3个月的婚姻生活,我认为老婆同志温柔贤良,勤奋聪颖,是不可多得的好妻子,而身为丈夫的我却举止乖张,态度轻狂,所作所为确有值得商榷之处。
  以下是我对自己恶劣行径的剖析,请领导批阅:
  1.昨天的事情是我不对。你做的红烧茄子虽然有点咸,但是香醇可口,瑕不掩瑜,我不该指责你浪费盐。我这么求全责备,完全是暗藏嫉妒之心。不过再加点水是可以的。
  2.你说喜欢陆毅的时候,我不该信口雌黄说我喜欢梁咏琪,害得你两天不能理我,极其痛苦 。仔细一想,我的回答确实很不妥当,因为你的花心还局限于内地,我却冲到了港台,我还是喜欢周迅好了。
  3.你喜欢看韩剧里的小政哥,我不该百般阻挠,你拿我和他比较我也不该表示抗议,因为人家小政哥都没有抗议。
  4.星期六的那次婚礼,我说我开会,不知道能不能去,你准备了两个红包,一个100的,一个200的,结果我没去,你不小心送出去了厚的。亲爱的,我不该笑你,你已经做得很好了,换作我,可能将两个都一块儿送出去了。
  5.上次你买来黄花鱼,我不该信誓旦旦,冒充大厨,结果你帮厨时欢呼雀跃,闻味时垂涎欲滴,吃的时候却垂头丧气,对于你脆弱的心理而言,这是难以承受的。
  6.你剪短了头发,问我好不好看,我说好看,你很高兴;进一步求证,我说还行;你追问到底好不好,我回答,不如以前好,使你非常难过。这是我的错,以后此类的回复均以第一次为准。
  7.你在网上认识了很多优秀的朋友,一时间鸿雁传书,玉照纷飞,我不该用报纸上的报道打击你 。不过你穿白裙子的那张照片真的不好看,还是穿高领衫的那张好,旁边有我当保镖,显得气派。
  8.探望你外甥那次,你回来和我讨论谁应该洗尿布,我的确不该推卸责任,惹你生气。不过亲爱的,这项任务过于遥远,我们还是讨论谁负责生好了。他们家是谁生的?
  9. 你指责我把袜子到处乱放时,我不应该反诬你到处放书,毕竟袜子是臭的,书是香的。
  10.你请雪儿吃麦当劳的时候,我不该在桌子下面偷偷踢她,让你大发雷霆,可是她踩坏了我那么多皮鞋,你为什么都不管?
  11.你说我长得不如你漂亮的时候,我不应该顽固抵赖,你说得很对,证据确凿,可以让瞎子作证。
  12.我下楼倒垃圾回来,你围着我转了好几圈,问我抽了几根,我说一根,你就大生其气。亲爱的,我真不知道你的鼻子如此灵敏,其实我抽了两根。
  你一直是善解人意的女孩,希望你能够原谅我,给我改过自新的机会。为了家庭安定,经济繁荣,顺便提几个小小的建议:
  1.不要指着电视里的帅哥说他像你从前的男友,你第一次近距离接近男士是在大二的舞会上,慌慌张张地狂踩别人的脚,很不幸那个人是我。
  2.逛商店的时候,不要总是突发奇想,比如要买一个粉碎机回去做蒜泥,你不觉得我这个机器比较经济吗?
  3.吃饭的时候,你总是嫌我吃得少,照相的时候却又嫌我胖,亲爱的,这真的让我很为难。
  4.不要给我出一些刁钻古怪的问题,说那是脑筋急转弯,结果让我逻辑混乱。
  5.不要在我看枪战片的时候给我讲笑话,而且不笑不行。
  以上种种,请老婆大人明鉴。友情提示:卧室里昨日有蜘蛛出没,如需护驾,请联系客厅西面休闲区组合沙发一号,竭诚为您服务。

posted @ 2008-10-09 22:27 小强摩羯座 阅读(182) | 评论 (1)编辑 收藏


        喜欢过很多东西,喜欢学很多东西,因为好奇,因要寻找不确定中的确定之美。歌德的话始终在心中萦绕“一个聪明而又好学的人,通过他所做好的一个事,可以做好每一件事”。

        人生却是充满了不确定。被拉着进入小学教室,不知怎么上了初中,一不小心还考上高中,上了大学,又读了研,或许会再读。是啊,人很多时候不知道自己要做什么,甚至其实很多时候都不知道自己正在做什么。可一个人如果能把这些都想清楚了,那他就不是人了,是人精了。我们活着就是要不断的经历。

        我却又常是要寻找确定性,于是喜欢数学,相信我能做好一件事因为我都能把它做坏。于是颠覆了好与坏的原义,超越了观念的阻挠,直接面对事情本身。这是好的,它简化了我了解事情本原的过程。
        
        很多的信念在心里慢慢的变成了原则,于是就顺理成章,理所当然,自然而然的做事,不对人。是好也有坏。

        我不是在写《忏悔录》,但发现我用了它的语气。

        想自己或许可以写小说,至少懂得怎么玩语言,有些想象,有些经历,也会瞎编。可什么时候写呢?我没有时间?

posted @ 2008-10-09 00:49 小强摩羯座 阅读(103) | 评论 (0)编辑 收藏


     曾经给自己定下规划,要常常问自己在做什么,要自省,要整理思路,可时常却不会。毕竟吾非柏拉图之辈,乃一介平民。求事事尽心,求我心泰然,求稳健求成熟,目标有甚多。目标分解,大事化小,小事个个击破,思路也常有,行动却迟缓。

  常思人生苦短,应趁有心有力之时,有所建树,有所累积,有一专能,却未能。钱老说二十岁不狂者无志,三十岁仍狂者无智,可我处中间者应如何。生活的要素不多也不少,却也常使人困惑,常不能专心。坚持是成功的必要条件,却不曾实践之。忘记是沉浸另一件事的需要,却鲜有做到。这或许且称之为人生的第一个四份之一的结束,究竟意味着什么呢,我却还不知道。

        简单的道理,丰富的生活。有很多时候却是“老人(指我以前的老师们)言“终究是对的:

         王玉国老师说:没有做不到,只不想不到。
         张老师说:能改变自己的人是成功的人,能改变别人的人是一个伟大的人。
        高老师说:做人其实低头比抬头更难。艰难困苦,于汝玉成。
        
     有幸初生牛犊就见到了我”高高在上“的导师,也给四点忠告,说在研究生阶段很重要的要着力发展的四点
            一、人际关系;
            二、扩大知识面;
            三、英语;
            四、术业要有专攻。

        还有很多,时常在经意间想起,感触良多。但是过后却也如云烟,许是道理懂得太多,行动却是太少吧。努力行动吧!
        
        

posted @ 2008-09-17 19:49 小强摩羯座 阅读(162) | 评论 (0)编辑 收藏


『VC++技术内幕』(第四版)读书笔记

关键字:VC++
原作者姓名:loose_went
文章原出处:vczx.com

写在前面:

  站长所看的『VC++技术内幕』版本为--潘爱民和王国印译清华大学出版的第四版,因有时工作忙碌,不能及时更新,请大家见谅!


第一天 Windows的编程模式 第二天 MFC应用程序框架
第三天 消息映射和视图类 第四天 资源和编译
第五天 基本事件处理 第六天 映射模式
第七天 滚动视窗 第八天 社备环境类
第九天 GDI对象 第十天 windows颜色映射

第一天 Windows的编程模式

  Windows程序中必须要有WinMain函数,因为该函数最重要的任务是创建该应用程序的主窗口。Windows程序与基于MS-DOS程序的最大差别就在于:MS-DOS程序是通过调用操作系统的功能来获得用户输入的,而Windows程序是通过操作系统发送的消息来处理用户输入的。Windows消息都是经过严格定义的,并且适用于所有的程序。
  WINDOWS提供通用的图形设备接口(GUI),我们通过调用(GDI)函数和硬件打交道,不必理会设备环境,WINDOWS会自动将设备环境结构映射到相应的物理设备。
  Windows程序设计中所需要的数据是存储在资源文件中的,这样,连接器就可以把编译好的二进制代码和二进制资源文件结合起来生成可执行程序。资源文件可以包括位图、图标、菜单定义、对话框设计,甚至可以包含用户自己定义的格式。
  Windows程序允许动态的连接目标模块,并且多个应用程序可以共享同一个动态连接库。
VC++的源程序浏览器能够使我们从类或函数的角度来了解或编辑程序,而不是直接从文件入手。在看别人的源代码时如果能熟练的使用源代码浏览器将会事半功倍。源程序浏览器主要的查看状态有以下几种:
Definitions and References--选择任何函数、变量、类型、宏定义可以看到它在项目中的定义,并且在何处和什么地方用到它。
Call Graph/Caller Graph--对于所选择的函数,给出它的调用与被调用函数的图示。
Derived Class Graph/Base Class Graph--给出类层次关系的图形表示,可以看到所选择的类的派生类和基类以及成员。
File Outline--对于所选的文件,列出文件中的类、函数和数据成员,同时还显示它们定义的位置和使用位置。
  可见Source Brower比起Class View来功能多了很多也更加好用。
  对于本章学习loose_went建议大家在VC++6中用AppWizard生成一个空的程序,然后试着看看都有哪些文件,和他们的类层次、函数、宏、结构的定义,我就是这样干的,学编程不动手是不行的。


Top of Page

第二天 MFC应用程序框架

?MFC是C++的Microsoft Windows API
?MFC产生的应用程序使用了标准化的结构。
?MFC产生的应用程序短而运行速度快。
?VC++工具降低了编码的复杂性,这当然了,很多代码都由它代劳了,呵呵。
?MFC库应用程序框架的功能非常丰富。
  以上说的都是MFC库的优点,虽然说MFC有着这样多的优点,但我个人认为不能盲目的学习它,要想学好,那么您必须先掌握C++,这是毋庸置疑的。可能刚开始的时候,您觉得收获很大,也很有趣,但要进一步提高,没有C++基础是很难的。所以站长建议大家学习的时候要有先有后,这样才能学好!
应用程序框架是一种类库的超集。
  我们现在先来看一个例子,看看MFC有多么强大!您只需加一行代码,甚至一行都不用加只需要点几下鼠标就可以创建一个windows 程序,不信,试一下:
1、打开VC++6从菜单选择NEW,给项目命名为"MyApp "。
2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。
3、在Class View选择CMyAppView类的OnDraw()成员函数双击会在C++编译器看到以下内容

void CMyAppView::OnDraw(CDC* pDC)
{
CMyAppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
在 // TODO: add draw code for native data here的位置增加一行代码
void CMyAppView::OnDraw(CDC* pDC)
{
CMyAppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,"愿vc在线能成为您学习vc最好的朋友!"); //增加的一行
// TODO: add draw code for native data here
}
  完了,就这么简单。编译运行。看到了吗?这个程序具备WINDOWS程序的所有特性,例如有菜单、工具条、状态栏、最大化、关闭、甚至还有关于对话框、打印预览.....全了,这就是AppWizard通过MFC动态创建的一个应用程序。从这个小例子可以看出用VC/MFC设计WINDOWS程序多么方便。

下面我们看看书上的例子,以便更进一步了解应用程序框架。
1、先建立一个Win32 Application的应用程序。
2、选择Project->Add to project->Files,分别创建一个名为MyApp.h和一个名为MyApp.cpp的文件。
3、添加代码:(最好照敲一下代码到编译器,别用Ctrl+C/Ctrl+V)
//***********************************************
// MyApp.h
//

class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};

class CMyFrame:public CFrameWnd
{
public:
CMyFrame();
protected:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};

//*****************************************************
// MyApp.cpp
//

#include "afxwin.h"
#include "myapp.h"
CMyApp theApp;//建立一个CMyAPP对象
BOOL CMyApp::InitInstance ()
{
m_pMainWnd=new CMyFrame();
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}

BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()

CMyFrame::CMyFrame(){
Create(NULL,"MYAPP Application");
}
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
(long)nFlags,point.x ,point.y);
}

void CMyFrame::OnPaint ()
{
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}

4、编译运行,报错。为什么呢?原来还没有添加MFC的支持,在Project Setting选项General属性页选择"Use MFC in a Static Library"
5、再按Ctrl+F5,怎么样,简单吧?
让我们看看这个程序中的一些元素。
①WinMain函数:Windows总是要求每个应用程序都要有WinMain函数的,您之所以看不见,是因为它已经隐藏在应用程序框架内部了。
②CMyApp类:CMyApp类的对象代表一个应用程序,CWinApp基类决定它的大部分行为。
③应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain会查找该应用程序的全局对象theApp。
④CMyApp::InitInstance成员函数:发现theApp后自动调用重载的虚函数InitInstance来完成主窗口的构造和显示工作。
⑤CWinApp::Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,它被隐藏在基类中负责传递应用程序的消息给相映的窗口。
⑥CMyFrame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类CFrameWnd的Create函数创建具体的窗口结构。
⑦CMyFrame::OnLButtonDown函数:演示消息处理机制,当鼠标坐键被按下这一事件被映射到CMyFrame的OnLButtonDown函数上,如果你选择F5进行编译运行的话可以在调试窗口看到TRACE宏显示的类似下面的信息
Entering CMyFrame::OnLButtonDown - 1,309,119
Entering CMyFrame::OnLButtonDown - 1,408,221
⑧CMyFrame::OnPaint函数:应用程序每次重新绘制窗口都需要调用此函数,将显示"Hello World!"放在这里是因为每次窗口发生变化时保证"Hello World!"被显示,你可以试着将语句:
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
写在别出,例如写在
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
(long)nFlags,point.x ,point.y);
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}
运行后当点击左键时显示"Hello World!",但当窗口最小化再最大化时"Hello World!"不见了。
⑧关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CMyFrame对象被删除,然后退出Run,进而退出WinMain,最后删除CMyApp对象。
  通过上面的示例我们看见程序的大部分功能包含在基类CWinApp和CFrameWnd中,我们只写了很少的函数,便可以完成很复杂的功能。所以应用程序框架不仅仅是一种类库,它还定义了应用程序的结构,除了基类外还包括WinMain函数,以及用来支持消息处理、诊断、DLL、等都包含在应用程序框架中。


Top of Page

第三天 消息映射和视图类

  MFC库应用程序框架没有采用虚函数来处理windows消息,而是通过宏将消息映射到派生类相应的成员函数上。文档-视图结构是应用程序框架的核心,它把数据从用户对数据的观察中分离出来,这样做最大的好处就是同一个数据可以对应多个视图。比如同一个股票报价数据,既可以有报表观察窗口,也可以有图形观察窗口,明白了否?
  视图简单来说就是一个普通的窗口,对于程序员来说就是一个从MFC库中Cview类派生出来的类的一个对象。视图类分为两个源文件模块:头文件(H)和源代码文件(CPP)。
用Appwizard创建一个SDI应用程序,产生了如下文件(假设工程名为Exc01):
Exc01.dsp 项目文件,Visual Studio用它来创建应用程序
Exc01.dsw 工作空间文件,包含一个项目Exc01.dsp
Exc01.rc ASCII码资源描述文件
Exc01View.cpp 包含CExc01View类成员函数和视图类文件
Exc01View.h 包含CExc01View类定义的视图类头文件
Exc01.opt 二进制文件,告诉Developer Studio本项目的哪些文件是打开的,又是如何排序的
Readme.txt 用来解释所产生的所有文件的文本文件
Resource.h 包含#define常量定义的头文件
  从Exc01View.cpp和Exc01View.h的代码中可以看出,这两个文件已经完全定义了CExc01View类,而该类正是此应用程序的核心。CExc01View类的对象与应用程序的视窗相关联,应用程序的所有"动作"都会在这个视窗中显示出来。
  CExc01View类的两个最重要的基类是CWnd和CView类。CWnd类提供了CExc01View的窗口属性,而CView类则提供了它和应用程序框架的其它部分之间的联系,特别是和文档以及框架窗口之间的联系。这一点一定要记住。
  下面我们来看一下如何在视窗内绘图。最重要的一个函数是OnDraw()函数,它是一个虚函数,每次窗口被重画时,应用程序都要先调用这个函数。注意:尽管可以随时对窗口绘制,但最好还是等变化内容积累到一定程度后再教给OnDraw()函数处理,这样效率会高一些。
在MFC中,设备环境是由C++的CDC类对象来表示的,该对象被作为参数传给Ondraw()函数,这样,我们就可以调用CDC的许多成员函数来完成各种绘制了。
找到OnDraw()函数,用以下语句替换函数原来的内容:
pDC->TextOut( 0, 0, "Hello World!" );
pDC->Ellipse(CRect(0,20,100,120));
再编译运行,看到了什么?
  TextOut和Ellipse都是设备环境类CDC的成员函数,MFC库提供了一个用来表示windows矩形的类CRect,在这里CRect的一个临时对象被作为参数传递给 了Ellipse函数,当外接矩形的宽和高相等时,Ellipse函数就画出个圆。


Top of Page

第四天 资源和编译

  资源文件(就是以应用程序名和扩展名是.rc的文件)很大程度上决定了应用程序的用户界面。在VC++中资源文件包括以下内容:
Accelerator //模拟菜单和工具栏选择的键盘定义
Dialog //对话框的布局及内容
Icon //图标有两种一种是16X16一种是32X32。
Menu //应用程序的主菜单及所属的弹出式菜单
String table //一些字符串,不属于C++源代码部分
Toolbar //工具条。
Version //程序的描述、版本号、支持语言信息。
  除了以上信息,.rc文件还包含了以下语句: #include "afxres.h" #include "afxres.rc" 它们的作用是把适合于所有应用程序的一些通用MFC库资源包含进来,其中包括字符串、图形按钮以及打印所需的一些元素。
  关于资源编辑器的使用就不多说了,因为它的操作很简单,需要注意的是虽然resource.h是一个ASCII码文件可以用文本编辑器进行编辑,但如果使用文本编辑器进行编辑的话,下次再使用资源编辑器时所做的修改有可能丢失,所以我们应该在尽量在资源编辑器中编辑应用程序的资源,新增的资源内容回自动的添加在我们的程序相应位置,例如resource.h而不用我们操心。
  编译在VC++中有两种模式,一种是Release Build另一种是Debug Build。它们之间的区别在于,Release Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC Release库,编译十对应用程序的速度进行优化,而Debug Build则正好相反,它允许对源代码进行调试,可以定义和使用MFC的诊断宏,采用MFC Debug库,对速度没有优化。所以我们应该在Debug模式下开发应用程序,然后在Release模式下发布应用程序。在我们的工程文件夹下会有一个Debug文件夹和一个Release文件夹分别存放输出文件和中间文件。
  诊断宏是我们编译程序时检测程序状态的有利工具,例如上两篇用到的TRACE宏,可以在Debug窗口获得你需要的诊断信息,而不用设置对话框之类的方法,在发布时Release会自动滤掉此信息。
  为了更好的管理项目,最好理解系统是如何处理预编译头文件的。VC++有两个预编译系统:自动的和手工的。这一部分笔者就不多说了,建议读者好好看看。


Top of Page

第五天 基本事件处理

  用户在视窗中的任何一个操作,都会引起Windows自动发送一个消息给该视窗。我们以一个例子来说明:比如我们在视窗中按下鼠标左键,Windows就会发送ON_LBUTTONDOWN消息给视窗,那么在视窗类中就必须包含下面的成员函数:
Void CmyView::OnLButtonDown(UINT nFlags, Cpoint point)
{
//event processing code here
}
  在类头文件中也要包含相应的函数声明:
afx_msg void OnLButtonDown(UINT nFlags, Cpoint point)
在代码文件中还要有一个消息映射宏,用于将OnLButtonDown函数和应用程序框架联系在一起:
BEGIN_MESSAGE_MAP(CmyView, CView)
ON_WM_LBUTTONDOWN()
// other message map entries
END_MESSAGE_MAP
  最后,在类库头文件中包含如下语句:
DECLARE_MESSAGE_MAP()
  以上这些步骤,我们都可以借助于ClassWizard来完成。这就是消息映射的过程。

  MFC库对140种windows消息直接提供了消息控制函数,并且我们还可以自己定义自己的消息,下面列出的五种消息是我们应该特别注意的(MSDN上有更详细的内容)。
WM_CREATE
  该消息是Windows发给视图的第一个消息。当应用程序框架调用create函数时该消息便会被发送,此时窗口还未创建完成,不可见,因此在消息控制函数OnCreate内不能调用那些依赖窗口处于完全激活状态的Windows函数。如果需要可以在重载的OnInitialUpdate函数内调用。不过注意在SDI应用程序OnInitialUpdate函数可能被多次调用。
WM_CLOSE
  当用户关闭窗口时,系统会发送WM_CLOSE消息。如果派生类重新定义了OnClose函数,就可以完全控制关闭过程,可以将提醒用户存盘之类的工作放在这里完成。我们可以通过重载CDocument::SaveModified虚函数达到相同的目的。
WM_QUERYENDSESSION
  从字面的意思看就可以看出,当用户退出Windows时,或者调用了ExitWindows 函数时。Windows会发送WM_QUERYENDSESSION消息给所有的正在运行的应用程序,由OnQueryEndSession消息映射函数对消息进行处理。在它之后应该是WM_ENDSESSION 消息。
WM_DESTROY
  在Windows发送WM_CLOSE消息后,紧接着会发送WM_DESTROY消息,虽然窗口已经Close但实际上并没有完全清除,在任务管理器中还可以看见应用程序的进程(我想很多木马或病毒都是无窗口的程序,它们的做法是生成了已经活动状态的窗口但不显示出来),利用这个消息控制函数便可以对依赖于当前窗口存在的东西做清除工作,不过一定要注意,应该调用基类的OnDestroy函数,而不能在用户自己的视图的OnDestroy函数中终止窗口的析构过程,终止析构过程应该在OnClose函数中。
WM_NCDESTROY
  当窗口被取消所发送的最后一个消息就是这个消息。我们可以在OnNcDestroy函数中做一些不依赖该窗口是否处于活动状态的最后的处理工作,(我实在想不出还需要做什么?那位朋友能给个例子),注意一定要调用基类中的OnNcDestroy函数。

  MFC库中非静态数据成员的名字以m_为前缀。
  一个窗口具有一个矩形的"客户区域",CWnd中的GetClient成员函数可以给出客户区域的大小,只允许在客户区域内绘图。
  标准的windows应用程序会首先登记一个窗口类,这不同于C++类,同时在处理过程中,还需要对每个类指定窗口过程。每次应用程序调用CreateWindow建立一个窗口时,都要指定一个窗口类作为参数,这样就把新建立的窗口和窗口过程函数连接起来了,每次windows给窗口发送消息的时候,这个函数就会被调用,以检查用参数传进来的消息码。

Top of Page

第六天 映射模式

  所谓映射模式,说白了就是坐标系。在默认情况下,Windows所绘图像单位为像素,这是因为设备环境用了默认的映射模式MM_TEXT,所以如下语句所绘图形为长和宽都为200像素的方块:   pDC->Rectangle(CRect(0,0,200,200));
  那么我们要绘制一个长和宽都是4厘米的方块该怎么做呢?这就必须改变设备环境的默认映射模式为MM_HIMETRIC,它的图像单位为1/100mm,而不是像素了。它的y轴方向和MM_TEXT的相反,它的向下为递减的,因此用如下语句就可以绘出4×4cm的方块了:
pDC->SetMapMode( MM_HIMETRIC);
pDC->Rectangle(CRect(0,0,4000,-4000));
  下面我们再来了解一下Windows都提供了哪些映射模式。
1、MM_TEXT映射模式
  这种模式下,绘图单位为像素,x轴向右递增,y轴向下递增,我们可以用CDC的SetViewPortOrg和SetWindowOrg函数来改变坐标原点的位置,下面的代码就是把坐标原点设在了(100,100)处,画了一个200×200像素的方块,此时逻辑坐标点(100,100)被映射到了设备坐标点(0,0)处,下一篇的滚动窗口使用的就是这种变换。
Void CmyView::OnDraw( CDC *pDC ){
pDC->SetMapMode(MM_TEXT);
pDC->SetWindowOrg(Cpoint(100,100));
pDC->Rectangle(CRect(100,100,200,200));
}
2、固定比例映射模式
  Windows提供了一组非常重要的固定比例影视模式,所有这种模式都遵循x轴向右递减,y轴向下递减的规则,而且我们无法将其改变。固定比例模式之间唯一的差别就在于实际的比例因子。下表列出了影视模式和比例因子的对应情况:

映射模式 逻辑单位
MM_LOENGLISH 0.01英寸
MM_HIENGLISH 0.001英寸
MM_LOMETRIC 0.1mm
MM_HIMETRIC 0.01mm
MM_TWIPS 1/1440英寸

  MM_TWIPS模式常用于打印机。
3、可变比例映射模式
  Windows还提供了两种映射模式MM_ISOTROPIC和MM_ANISOTROPIC,这两种模式允许我们修改比例因子和坐标原点。在MM_ISOTROPIC模式下,纵横比总是1:1,就像改变图像时锁定比例一样,而MM_ANISOTROPIC模式则可以独立的改变x和y的比例因子,即圆可以变成扁圆。
  以上就是常见的映射模式,笔者建议:我们没必要死记住这些模式,只是到用的时候会用就可以了,哪怕查查MSDN,这个东东真好!
  在设置了映射模式和相应参数之后,我们可以用CDC的LPtoDP函数将逻辑坐标转换为设备坐标,用DptoLP函数将设备坐标转换为逻辑坐标。那么我们什么时候用什么样的坐标呢?有一些规则如下:
① 可以认为CDC的所有成员函数都以逻辑坐标为参数
② 可以认为CWnd的所有成员函数都以设备坐标为参数
③ 所有选中测试都应该选用设备坐标,区域的定义应采用设备坐标,某些像CRect::PtInRect之类的函数只有采用设备坐标才能有正确的结果
④ 将一些长期使用的值用逻辑坐标来保存,如果用设备坐标,那么只要用户对窗口进行一下滚动,坐标就不再有效了
  一般情况下,我们在CView的虚函数OnPrepareDC中设置映射模式,应用程序框架在调用OnDraw函数之前调用这个虚函数。


Top of Page

第七天 滚动视窗

  CView类并不直接支持窗口滚动,如要实现窗口滚动,就要用到CView的派生类CScrollView类,CScrollView的成员函数能够处理滚动条并发送给视图WM_HSCROLL和WM_VSCROLL消息,从而实现窗口的滚动。
  在文档-视图结构中,视图窗口建立以后,框架最先调用OnInitialUpdate虚函数,在框架第一次调用OnDraw函数前也是先调用OnInitialUpdate函数,因此在OnInitialUpdate函数中设置滚动视窗的初始化最合适。
  下面我们就来创建一个滚动示例程序a:
  1、 用AppWizard创建一个文档-视图程序a,注意在第六步时设置CAView的基类应为CScrollView而不是CView。
  2、 在CAView中加入数据成员m_rectEllipse和m_nColor。
  3、 修改OnInitialUpdate函数如下:
void CAView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CSize sizeTotal( 20000, 30000 ); //逻辑窗口大小20×30cm
CSize sizePage( sizeTotal.cx/2, sizeTotal.cy/2 );
CSize sizeLine( sizeTotal.cx/50, sizeTotal.cy/50 );
SetScrollSizes( MM_HIMETRIC, sizeTotal, sizePage, sizeLine );

}
4、 用ClassWizard产生对消息WM_KEYDOW控制的OnKeyDown函数,并编辑代码如下:
void CAView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default

switch( cChar ){
case VK_HOME:
OnVScroll( SB_TOP, 0, NULL );
OnHScroll( SB_LEFT, 0, NULL );
break;
case VK_END:
OnVScroll( SB_BOTTOM, 0, NULL );
OnHScroll( SB_RIGHT, 0, NULL );
break;
case VK_UP:
OnVScroll( SB_LINEUP, 0, NULL );
break;
case VK_DOWN:
OnVScroll( SB_LINEDOWN, 0, NULL );
break;
case VK_PRIOR:
OnVScroll( SB_PAGEUP, 0, NULL );
break;
case VK_NEXT:
OnVScroll( SB_PAGEDOWN, 0, NULL );
break;
case VK_LEFT:
OnHScroll( SB_LINELEFT, 0, NULL );
break;
case VK_RIGHT( SB_LINERIGHT, 0, NULL );
break;
default:
break;
}

5、 编辑构造函数和OnDraw函数如下:
CAView::CAView():m_rectEllipse( 0, 0, 4000, -4000 )
{
// TODO: add construction code here
m_nColor = GRAY_BRUSH;
}

void CAView::OnDraw(CDC* pDC)
{
pDC->SelectStockObject( m_nColor );
pDC->Ellipse( m_rectEllipse );
}
6、 映射WM_LBUTTONDOWN消息并编辑消息处理函数OnLButtonDown如下:
void CAView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CClientDC dc( this );
OnPrepareDC( &dc );
CRect rectDevice = m_rectEllipse;
dc.LPtoDP( rectDevice );
if( rectDevice.PtInRect( point ) ){
if( m_nColor = GRAY_BRUSH )
m_nColor = WHITE_BRUSH;
else
m_nColor = GRAY_BRUSH;
}
InvalidateRect( rectDevice );
}
编译并运行看看结果吧。
另外,我们要特别注意下面五种比较特殊的windows消息:
1、 WM_CREATE消息
该消息是windows发给视图的第一个消息,由于应用程序框架调用Create函数时该消息就会被发送,而此时窗口创建还未完成,因此在Create函数内不能调用那些依赖于窗口处于完全激活状态的windows函数。不过对于SDI应用程序,在视图生存期间,OnInitialUpdate函数可以被调用多次。
2、 WM_CLOSE消息
当用户从系统菜单中关闭窗口或者父窗口被关闭时,windows会发送WM_CLOSE消息。
3、 WM_QUERYENDSESSION消息
当用户退出windows时,windows就会发送WM_QUERYENDSESSION消息给正在运行的程序,处理这个消息的映射函数为OnQueryEndSession。
4、 WM_DESTROY消息
Windows在发送完WM_CLOSE消息后,紧接着就发送WM_DESTROY消息,消息映射函数为OnDestroy。当程序接收到该消息时,它将假定此时视窗已经消失,但仍处于活动状态。利用这个消息控制函数,就可以对依赖于当前窗口的所有东西作清除工作,不过一定要记住,应该用基类的OnDestroy而不能在自己视图中的OnDestroy中"终止"窗口的析构过程,终止析构的处理应该在OnClose函数中。
5、 WM_NCDESTROY消息
当窗口被取消时发送的最后一个消息就是这个消息,由于此时所有的窗口都被关闭,所以我们可以在OnNcDestroy函数中做一些不依赖于窗口是否处于激活状态的最后处理工作,不过一定要调用基类的OnNcDestroy函数。不要在OnNcDestroy中取消动态申请的窗口对象,这一工作是由CWnd的一个特殊虚函数PostNcDestroy来完成的,它是由基类的OnNcDestroy来调用的。何时取消窗口对象最为合适呢,去看MFC的联机文档吧!

Top of Page

第八天 设备环境类

  任何程序在画图时都需要调用图形设备接口( GDI )函数, GDI 包含了一些绘制点、线、矩形、椭圆、位图以及文本的函数。 Windows 的设备环境是 GDI 的关键元素,它代表了物理设备,每一个 C++ 设备环境对象都有与之对应的 Windows 设备环境,并通过一个 32 位的 HDC 句柄来标识。

  MFC 中的基类 CDC 包含了绘图所需要的所有成员函数,并且除了 CMetaFileDC 类外,所有的派生类都只有构造函数和析构函数不同。对于显示器来说,常用的派生类有 CClientDC 和 CWindowDC 。

  显示设备环境的类 CClientDC 和 CWindowDC , CClientDC 类绘图只局限于客户区域内,即不包含边框、菜单栏和标题栏,而 CWindowDC 类可以。简单来说,如果创建 CclientDC 对象,点( 0,0 )指客户区域的左上角,如果创建的是 CWindowDC 对象,则点( 0,0 )指整个屏幕的左上角。

  在创建 CDC 对象的时候,不要忘记在合适的时候将它删除,不然程序在退出之前有小部分内存就会丢失。要保证设备环境对象能够被适时的删除,可以有两种方法:

一种是在堆栈中构造对象,比如在 OnLButtonDown 函数中,它的析构函数在函数返回时自动被调用。

void CMyView::OnLButtonDown(UINT nFlags,CPoint point){

CRect rect;

CClientDC dc(this); //constructs dc on the stack

} //dc automatically destroyed

另一种是通过调用 CWnd 的成员函数 GetDC 来获得设备环境指针,但此时必须要调用 RleaseDC 来释放设备环境。

void CMyView::OnLButtonDown(UINT nFlags,CPoint point){

CRect rect;

CDC *pDC=GetDC();

pDC->GetClipBox(rect);

ReleaseDC(pDC); // 不要忘了这句

}

注意:千万不要删除作为参数以指针形式传递给 OnDraw 函数的 CDC 对象,应用程序框架会自动控制它的删除。

在绘图时我们离不开设备环境,那么在绘图时我们就要依赖于设备环境的当前状态,这种状态包括:

•  被选中的 GDI 绘图对象,如笔、刷子和字体等

•  绘图时的缩放尺寸的映射模式

•  其他各种细节,如文本的对齐方式,多边形的填充状态

  创建设备环境对象时,通常会有些默认的特性,而其他特性都是通过 CDC 类的成员函数来设定的,可以通过重载 SelectObject 函数来将 GDI 对象选进设备环境中。

  如果我们要重新编写 OnPaint 函数,就需要使用 CPaintDC 类,这个类是比较特殊的,它的构造函数和析构函数所完成的工作都是针对显示用的,当我们一旦获得一个 CDC 指针,就可以把它当成任何设备环境指针来用。

Top of Page

第九天 GDI对象

  所有 GDI 对象类都是由抽象基类 CGdiObject 派生出来的。下面是 GDI 派生类列表:

  CBitmap - 位图是一种位矩阵,每一个显示像素都对应一个或多个位,我们可以用位图来表示图像,也可以用它来创建刷子。

CBrush - 刷子定义了一种位图形式的像素,用它可以对区域内部填充颜色。

CFont - 字体是一种具有某种风格和尺寸的所有字符的集合。

CPalette - 调色板是一种颜色映射接口。

CPen - 笔是一种画线和有形边框的工具,可以指定画线的宽度,以及画虚线,实线等。

CRgn - 区域是一种范围,可以用它来填充、裁剪以及鼠标点中测试。

  我们只需要构造 CGdiObject 类的派生类对象,而无需构造它的对象,有些 GDI 派生类允许构造函数一步完成创建对象的任务,如 CPen 和 CBrush 。而有些派生类的对象要两步,如 CFont 和 CRgn ,首先要调用默认的构造函数,然后还要调用相应的创建函数,如 CreateFont 、 CreatePolygonRgn 等。

  CGdiObject 类有一个虚析构函数,如果构造了一个它的派生类的对象,则在程序退出之前要将其删除,为了删除它,要先将其从设备环境中分离出来。那么如何分离呢?其实, CDC 类的 SelectObject 成员函数在将 GDI 对象选进设备环境的同时,它已经从设备环境中分离出来了,但在未选中新的对象前,还不能将旧的对象分离。所以在选进自己的 GDI 对象时,将原来的 GDI 对象也保存起来,任务完成后,再将其恢复,这样就可以将自己的 GDI 对象分离并删除了。下面看一个例子:

void CMyView::OnDraw( CDC *pDC ){

CPen newPen( PS_DASHDOTDOT, 2, (COLORREF)0); //black 2 pixels wide

CPen * pOldPen = pDC->SelectObject( &newPen );

pDC->MoveTo( 10, 10 );

pDC->LineTo( 110, 10 );

pDC->SelectObject( pOldPen ); //newPen 被分离

} //newPen 在函数退出时自动删除

  对于一些库存的 GDI 对象,由于它们是 windows 系统的一部分,因此我没有必要删除它们。 MFC 库函数 SelectStockObject 可以将一个库存对象选进设备环境中,并返回原先被选中对象的指针,同时使该对象被分离。在上例中,我们就可以用库存对象代替“旧”对象:

void CMyView::OnDraw( CDC *pDC ){

CPen newPen( PS_DASHDOTDOT, 2, (COLORREF)0); //black 2 pixels wide

pDC->MoveTo( 10, 10 );

pDC->LineTo( 110, 10 );

pDC->SelectStockObject( BLACK_PEN ); //newPen 被分离

} //newPen 在函数退出时自动删除

  对于显示设备环境来说,在每个消息控制函数的入口处,设备环境都是未被初始化的,因此每次都必须从头开始设置设备环境,由于 SelectObject 返回的 GDI 对象指针的临时性,而应用程序框架在函数返回时会删除 C++ 临时对象指针,所以不能简单地将设备环境指针保存在类的数据成员中,而要借助于 GetSafeHandle 成员函数来将它转换为 windows 句柄(唯一能够持久存在的 GDI 标识)。

  注意,当删除由 SelectObject 返回的指针所指向的对象时,一定要当心,如果该对象是我们自己申请的,可以删除,如果是临时的,则不能随便删除。

posted @ 2008-08-26 03:27 小强摩羯座 阅读(238) | 评论 (0)编辑 收藏

     摘要: (1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) //使程序最大化. ...  阅读全文

posted @ 2008-08-26 02:59 小强摩羯座 阅读(313) | 评论 (0)编辑 收藏

中国绝美情诗名句排行榜TOP100

1 柳永 凤栖梧 衣带渐宽终不悔,为伊消得人憔悴。

2 佚名 击鼓《诗经.邶风》 死生契阔,与子成说。执子之手,与子偕老。

3 秦观 鹊桥仙 两情若是久长时,又岂在朝朝暮暮。

4 李白 三五七言 相思相见知何日?此时此夜难为情。

5 佚名 凤求凰,琴歌 有美人兮,见之不忘,一日不见兮,思之如狂。

6 郑愁予 赋别 这次我离开你,是风,是雨,是夜晚;你笑了笑,我摆一摆手,一条寂寞的路便展向两头了。

7 李白 三五七言 入我相思门,知我相思苦,长相思兮长相忆,短相思兮无穷极。

8 元稹 离思五首其四 曾经沧海难为水,除却巫山不是云。

9 曹植 明月上高楼 君若扬路尘,妾若浊水泥,浮沈各异势,会合何时谐?

10 纳兰性德 虞美人 凄凉别後两应同,最是不胜清怨月明中。

11 张籍 节妇吟 还君明珠双泪垂,恨不相逢未嫁时。

12 席慕蓉 一棵开花的树 如何让你遇见我,在我最美丽的时刻为这,我已在佛前求了五百年,求他让我们结一段尘缘。

13 陈衡恪 题春绮遗像 嗟余只影系人间,如何同生不同死?

14 梁启超 台湾竹枝词 相思树底说相思,思郎恨郎郎不知。

15 徐干 室思 自君之出矣,明镜暗不治。思君如流水,何有穷已时。

16 司马光 西江月 相见争如不见,有情何似无情。

17 龚自珍 己亥杂诗 落红不是无情物,化作春泥更护花。

18 张先 千秋岁 天不老,情难绝。心似双丝网,中有千千结。

19 黄景仁 绮怀诗二首其一 似此星辰非昨夜,为谁风露立中宵。

20 李商隐 无题六首其三 直道相思了无益,未妨惆怅是清狂。

21 李商隐 暮秋独游曲江 深知身在情长在,怅望江头江水声。

22 纳兰性德 摊破浣溪沙 人到情多情转薄,而今真个不多情。

23 李商隐 锦瑟 此情可待成追忆,只是当时已惘然。

24 张仲素 燕子楼 相思一夜情多少,地角天涯未是长。

25 元好问 摸鱼儿二首其一 问世间,情是何物,直教生死相许。

26 李商隐 无题 身无彩凤双飞翼,心有灵犀一点通。

27 张可久 塞鸿秋 兽炉沈水烟,翠沼残花片,一行行写入相思传。

28 徐再思 折桂令 平生不会相思,才会相思,便害相思。

29 李冠 蝶恋花 一寸相思千万绪,人间没箇安排处。

30 苏轼 江城子 十年生死两茫茫,不思量,自难忘,千里孤坟,无处话凄凉。

31 佚名 绸缪《诗经.唐风》 今夕何夕,见此良人。

32 白居易 长恨歌 天长地久有时尽,此恨绵绵无绝期。

33 白居易 长恨歌 在天愿作比翼鸟,在地愿为连理枝。

34 文廷式 蝶恋花 重叠泪痕缄锦字,人生只有情难死。

35 曹雪芹 枉凝眉 一个是阆苑仙葩,一个是美玉无瑕。若说没奇缘,今生偏又遇著他;若说有奇缘,如何心事终虚话?

36 李商隐 无题 春蚕到死丝方尽,蜡炬成灰泪始乾。

37 况周颐 减字浣溪沙 他生莫作有情痴,人间无地著相思。

38 欧阳修 玉楼春 尊前拟把归期说,未语春容先惨咽。

39 佚名 关雎《诗经.周南》 关关雎鸠,在河之洲。窈宨淑女,君子好逑。

40 欧阳修 玉楼春 人生自是有情痴,此恨不关风与月。

41 柳永 雨霖铃 此去经年,应是良辰好景虚设。便纵有,千种风情,更与何人说。

42 李之仪 卜算子 只愿君心似我心,定不负相思意。

43 晏几道 临江仙二首其二 落花人独立,微雨燕双飞。

44 陈陶 陇西行 可怜无定河边骨,犹是春闺梦裏人。

45 辛弃疾 摸鱼儿 千金纵买相如赋,脉脉此情谁诉。

46 温庭筠 更漏子三首其三 梧桐树,三更雨,不道离情正苦。一叶叶,一声声,空阶滴到明。

47 苏武 结发为夫妻 结发为夫妻,恩爱两不疑。

48 聂胜琼 鹧鸪天 寻好梦,梦难成。况谁知我此时情。枕前泪共帘前雨,隔箇窗儿滴到明。

49 柳永 昼夜乐 一场寂寞凭谁诉。算前言,总轻负。

50 李白 长相思二首其一 天长路远魂飞苦,梦魂不到关山难,长相思,摧心肝。

51 席慕蓉 印记 不要因为也许会改变,就不肯说那句美丽的誓言,不要因为也许会分离,就不敢求一次倾心的相遇。

52 范成大 车遥遥篇 愿我如星君如月,夜夜流光相皎洁。

53 戴叔伦 相思曲 鱼沈雁杳天涯路,始信人间别离苦。

54 柳永 雨霖铃 执手相看泪眼,竟无语凝噎。

55 元稹 遣悲怀三首其二 诚知此恨人人有,贫贱夫妻百事哀。

56 顾敻 诉衷情 换我心,为你心,始知相忆深。

57 鱼玄机 江陵愁望有寄 忆君心似西江水,日夜东流无歇时。

58 李商隐 无题六首其六 春心莫共花争发,一寸相思一寸灰。

59 乐婉 卜算子 相思似海深,旧事如天远。

60 白居易 浪淘沙 相恨不如潮有信,相思始觉海非深。

61 温庭筠 新添声杨柳枝 玲珑骰子安红豆,入骨相思知不知?

62 邵瑞彭 蝶恋花 忍把千金酬一笑?毕竟相思,不似相逢好。

63 晏殊 玉楼春 天涯地角有穷时,只有相思无尽处。

64 曹雪芹 终身误 都道是金玉良缘,俺只念木石前盟。空对著,山中高士晶莹雪;终不忘,世外仙姝寂寞林。

65 周邦彦 玉楼春 人如风後入江云,情似雨馀黏地絮。

66 曹雪芹 红豆词 滴不尽相思血泪抛红豆,开不完春柳春花满画楼。

67 欧阳修 蝶恋花二首其一 泪眼问花花不语,乱红飞过秋千去。

68 冯小青 怨 瘦影自怜秋水照,卿须怜我我怜卿。

69 朱彝尊 高阳台 锺情怕到相思路。盼长堤,草尽红心。动愁吟,碧落黄泉,两处难寻。

70 贺铸 横塘路 若问闲情都几许?一川烟草,满城风絮,梅子黄时雨。

71 张泌 寄人 多情只有春庭月,犹为离人照落花。

72 刘禹锡 竹枝词四首其二 花红易衰似郎意,水流无限似侬愁。

73 晏殊 山亭柳:赠歌者 若有知音见采,不辞遍唱阳春。

74 范仲淹 苏幕遮 明月楼高休独倚,酒入愁肠,化作相思泪。

75 陈叔达 自君之出矣 思君如明烛,煎心且衔泪。

76 苏武 结发为夫妻 生当复来归,死当长相思。

77 陈蓬姐 寄外二首其二 休言半纸无多重,万斛离愁尽耐担。

78 朱彝尊 鸳鸯湖棹歌 妾似胥山长在眼,郎如石佛本无心。

79 韦庄 女冠子二首其一 不知魂已断,空有梦相随。除却天边月,没人知。

80 佚名 涉江采芙蓉《古诗十九首》 同心而离居,忧伤以终老。

81 秦观 八六子 夜月一帘幽梦,春风十里柔情。

82 晏几道 鹧鸪天三首其一 从别後,忆相逢,几回魂梦与君同。

83 柳永 雨霖铃 多情自古伤离别。更那堪,冷落清秋节。

84 晏殊 玉楼春 无情不似多情苦,一寸还成千万缕。

85 元稹 遣悲怀三首其三 唯将终夜长开眼,报答平生未展眉。

86 韦庄 应天长 别来半岁音书绝,一寸离肠千万结。

87 卢仝 有所思 相思一夜梅花发,忽到窗前疑是君。

88 卢仝 楼上女儿曲 直缘感君恩爱一回顾,使我双泪长珊珊。

89 晏几道 鹧鸪天三首其二 相思本是无凭语,莫向花牋费泪行。

90 欧阳修 踏莎行 离愁渐远渐无穷,迢迢不断如春水。

91 辛弃疾 鹧鸪天 若教眼底无离恨,不信人间有白头。

92 曹雪芹 红楼梦引子 开辟鸿蒙,谁为情种?都只为风月情浓。

93 晏殊 鹊踏枝 明月不谙离恨苦,斜光到晓穿朱户。

94 白居易 长恨歌 临别殷勤重寄词,词中有誓两心知。

95 陈端生 寄外 泪纵能乾终有迹,语多难寄反无词。

96 苏曼殊 本事诗 还卿一钵无情泪,恨不相逢未剃时。

97 温庭筠 南歌子四首其二 终日两相思,为君憔悴尽,百花时。

98 晏殊 鹊踏枝 欲寄彩笺兼尺素,山长水阔知何处。

99 李煜 清平乐 离恨却如春草,更行更远还生。

100 晏殊 清平乐二首其二 鸿雁在云鱼在水,惆怅此情难寄。

posted @ 2008-07-31 22:32 小强摩羯座 阅读(205) | 评论 (0)编辑 收藏

仅列出标题
共20页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last