2006-08-31

系统何时发送WM_PAINT消息?

关于WM_PAINT消息为何没有被处理这篇文章给了很好的解释。
(来自:http://dev.csdn.net/article/74/74935.shtm)

系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和 InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生WM_PAINT消息。

系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽 可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn 来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update Region是否为空等。

恼火!老是犯些低级错误!

今天一上午就为了处理Rebarwindow32在2000下未注册的问题了。
不停的从xp上取U盘,2000插U盘,时间就这么过去了。
到11:00才想起跟踪调试(先一直以为是代码的问题),才发现居然Rebar的Com没注册,又找了半天代码,突然发现,当初为了实现Delphi下的Unicode和Ansi转换方便,居然把GetProcAddress都给改成PWideChar了。结果当然无法得到地址,所以Com也就没有注册上了,那当然Rebar就无法创建了。
不过这有个问题:难道XP下GetProcAddress兼容PWideChar了?有空研究研究...

关于窗体的奇怪问题,正在想...

自己Register的控件(主窗体中的窗体,同样Createwindow创建,不过为了便于理解,就用控件来称呼),自己注册了WndProc过程 ,本来使用一切正常。
一不小心想重画了,鼓捣鼓捣,很容易就搞定。
本以为一切结束了,测试时发现一个问题:
往上拖动控件时一切正常,往下拖动时就拐了---我画了个居中的点,理论上无论怎样拖动都应该在中间,可往下拖动的时候那居中的点也跟着往下移动,除非手动刷新。
纳闷了!检查半天代码,没发现问题!没法,打开Spy来跟踪消息看看,突然发现往下拖动的时候居然没发WM_PAINT消息,我靠!太奇怪了,我重新设置了控件位置,也没屏蔽Redrow啊。
又一阵鼓捣,最后解决方法:把这个控件放到另外一个同样自己注册的控件之后建立就好了。
晕了,为何会如此却没想通,难道Defwindowproc会造成消息错位?本该控件1的消息发到控件2去了!?
研究研究再说吧。。。
发此文纯粹只是为了汗一个 (- -!)

2006-08-29

在Delphi 7 中加载MapControl或者SceneControl时会出现Invalid floating point operation的错误

错误描述
在Delphi 7 中使用ArcGIS Engine 9.1时,加载空的SceneControl或者为MapControl加载MXD文档都会出现Invalid floating point operation的错误。对于SceneControl,即使设计状态没有加载任何sxd文件,只要在Delphi 7中运行程序,就会出现Invalid floating point operation的错误。
导致原因
在Delphi 7中需要通过浮点单位控制指令设置浮点运算单位。浮点单位控制指令控制着浮点运算的精度、四舍五入的方式以及特定的浮点运算是否触发异常。可以参阅Intel处理器的详细文档。
在Delphi 7中有函数可以直接访问处理器的控制指令。比如,可以使用Set8087CW函数改变8087CW控制指令的值,从而改变程序浮点计算的行为。编程人员需要自己负责在程序结束时重置这个指令。
解决办法
第一种方法是下载并安装delphi 7 的update包。
需要注意的是,在安装补丁包之前,必须删除import中已经导入的所有esri的pas,dcu,dcr文件,编译并保存包含这些库的package,默认是dclusr.dpk。

第二种方法就是直接禁用浮点异常,方法如下:
在Delphi 7中,当使用OpenGL进行3D渲染时,推荐使用Set8087CW函数禁用浮点异常。可以在调用OpenGL函数之前,比如在mainForm的OnCreate的过程中写入: Set8087CW(0x133f)

实例代码:
1.声明全局的变量保存原有的8087CW设置
var
Saved8087CW: Word;

2.在mainForm的OnCreate过程中改变8087CW的值,改变之前先保存默认值
Saved8087CW := Default8087CW;
Set8087CW($133f); { Disable all fpu exceptions }

3.在程序结束前,使用默认值重置8087CW指令值。在mainForm的OnClose过程中
Set8087CW(Saved8087CW);

4.还有一点需要注意,如果在程序中使用了SceneControl.LoadSxFile载入了3D文档,那么必须在程序退出时,在Set8087CW之前调用IScene的ClearLayers方法清除图层,否则程序在退出时会出现异常。
参考代码为:
SceneControl1.Scene.ClearLayers;
Set8087CW(Saved8087CW);

5.还有在程序退出之前需要调用如下语句
(CoAoInitialize.Create as IAoInitialize).Shutdown;

2006-08-28

终于回宜宾了

累的不想动!
回来才醒目的觉得宜宾真的好小,发展空间也实在不够,最多向南岸发展吧~另外在外面的时候,望着窗外川流不息的车辆,看着拥挤的人群,自己也乱七八糟的想了很多,现在却无法用语言来形容了,瀑布汗!
不过我还是迫切的希望回家,毕竟外面再好,总没自己窝里爽啊~
望着熟悉的街道,那感觉实在无法形容,终于到家了!
就像我经常唱的那样:回家的感觉真好,就是TMD不一样!

2006-08-23

表达式的类别与类型里面值得注意的

1. 这里的“长度”仅指参考长度(字节),在代码中可以用SizeOf()来取得该值。一些较复杂的数据类型,以及几乎所有的用户定义类型的长度,都在表中所列出的“长度”值之外。同时,这里的“长度”值还表明:如果该数据类型的变量被声明,则系统“至少”为该变量初始化的字节数。

2. 常量与全局变量的分配是不同的。但是,类型化常量与全局变量在同一内存空间中被分配,且使用相同的分配规则。

3. 官方资料中,“动态分配的内存”被定义为“动态变量”。但由于它实际上是变量的数据体部分。因此,为了将它与普通变量区分开来,这里称为变量 “动态分配的内存”。一些其他的函数也可以完成这样的内存分配,例如ReallocMem()、Initialize()、StrAlloc()和 StrNew()等。

4. 静态数组也将直接在栈上进行分配。这意味着在局部变量中声明过大的静态数组是不安全的。细节请参见2.3.3小节中的“数组类型”。

5. 以后的行文中,变量的这两个部分将分别以“变量”和“变量的内存占用”来称呼。需要一再强调的是:变量的内存占用、动态变量和变量“动态分配的内存”是同一概念。

6. 这种情况下,变量的4字节总是可以通常类型强制,当作指向其内存占用的指针进行操作。

7. 除了字符串和集合,Delphi中定义的常量大小都不能超过8字节(Int64)。否则必须声明成“类型化的”,而这种情况下,Delphi按照变量的规则进行内存分配。

8. 编译指示字$Align只对记录、类和对象有意义。它不影响字符串在堆栈和应用程序内存区中的内存分配规则。

9. 部分Delphi的内核源码同时提供两个版本,即“PUREPASCAL”和“BASM”版本。Delphi内核是以BASM版本编译的——PUREPASCAL版本的部分代码甚至在产品的正式版本中仍是有错误的。但通常而言,PUREPASCAL版本的代码是一个非常好的对照,也是学习BASM最佳的Sample。

10. 对于Linux系统来说,这两种字符串使用相同的处理机制。因此,Linux版本的WideString例程大多数直接跳转到AnsiString例程中。Delphi为WideString保留这些例程声明,以使得Linux版本的内核代码更易于维护。

11. Delphi手册中,该函数是两种声明。第三种声明只对动态数组的唯一化有意义。

12. 绝大多数(但并不是全部)的Delphi基本数据类型和明确声明过的类型,都具有惟一的一个类型信息。但是像整型这样一些简单数据类型的RTTI,通常是不需要关注的。同时需要注意的是:每一个类型信息都指向独立的内存结构。兼容的两个类型,在内存结构上也是相互独立的。

和剑桥合作:新协议为BT更大地提速

  BitTorrent正和英国剑桥的Cachelogic在一个称为“Cache Discovery Protocol(CDP,缓存发现协议)”的新协议上展开合作,据推测对于点对点网络来说,它和DHCP的工作原理相像。这个协议是由 Cachelogic开发的。

  DHCP自动的为网络上的设备分配IP地址而不要求用户的过多参与。与这种情况类似,新的CDP协议允许BT客户端自动的发现已经缓存在网络上的更好的种子,并且允许以更快的速度下载文件。预计这种新技术在只有少数种子文件的情况下特别有用。

  网络服务提供商将会对这个新协议特别感兴趣。通过运用这项技术,能够加快下载的速度,但从上传数据方面来说,只会对下载用户的系统施加很少的限制。

2006-08-22

原来可视化开发工具也不简单啊

delphi是典型的RAD工具,强大的IDE功能基本上为新手提供了很大的方便。
最近几个同事都开始学习delphi了,我当然首当其冲当了个傀儡老师,我这三脚老师得到的微薄报仇就是几个鸡腿几根烟,和我被杀死的亿万脑细胞完全无法形成对比。
阿G就是其中之一,我不得不佩服他的学习热情,自己头天在家疯狂下载各种“XX日通delphi”,"delphi完全高手指南"之类垃圾教程,第二天就抱着他买的那本“Delphi进阶”对照着他下的那些垃圾狂啃起来。
对如此积极的“学生”,我当然乐于指导,不过最好只限于指导,千万别看他是怎么操作的:

G:我下了个delphi中文版,裤吧?这下轻松了!
B:Borland都把delphi卖了,听说有个公司买了,这么快出中文版了?
G:嘿嘿,对啊(他还不知道我在说什么 - -!),专门打的补丁。
B:靠!SB初学者才打中文补丁,你看教程都是英文的,TMD你又是英盲,我敢肯定你连怎么调试编译器都找不到了!
G:不是还有你嘛。
B:大脑短路10分钟。。。

---正在渡过漫长的10分钟---

G:咦?
B:(正在看自己的资料,听到这种声音就觉得天气真的热了,汗! - -!)
G:看来不行。
B:我就说嘛,别用中文补丁,该怎么学就怎么学,别TMD标新立异(这么说是为了爽他面子 - -!)。
G:不关中文的事,算了,给我找个Delphi8来,我对照着教程打都不行。
B:?为啥?你别看后面的哦,后面的是.NET,你看基础的就是了。
G:就是基础的,检查了n遍了,一个字没错,应该是Delphi8比Delphi7先进,编译不过。
B:先进?编译不过?(不会是用中文补丁的问题吧?)
G:嗯,对!Delphi7应该是老了,我这教程上最基础的都编译不了。
B:(那教程我看过,讲Win32和Pascal方面是基础又基础的东西,Delphi随便哪个版本都能过的)不会吧?我看看?

【G的程序:】
项目:
窗体:Form1(TForm)
窗体事件:无
其它组件: 无
代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("我是神");
end;

……
B:我日!!!你个SB,谁TM叫你手工输的啊!

(B = Bitx ,也就是我)

看来Blogspot已经解封了

已经几周了吧?
一直访问blogspot都没问题了,开心不已!
一直嫌sina的速度太慢,最近图片还经常只现X(应该是为了防止图片盗链,对图片引用做了处理,可惜技术不到家,弄得正常访问都打不开),心情好的时候口水稍微多点,发表还告诉你你话多了,少说点!弄得人郁闷的不行!
现在一切问题都解决了,优秀的google提供了一切完美的服务,不用就sb了。。。

没有一位电影演员能像玛丽莲·梦露(转载)


  没有一位电影演员能像玛丽莲·梦露那样,生前命途多舛,万众瞩目,光艳绝伦,60年代初“美国最受欢迎十大名人”,傲列榜首,总统肯尼迪屈尊居次;身后璨烂不衰,全球媒体冷炒热卖从未休止,一些正直人士也不断地为其悲惨之死仗义执言,奔走呼吁。她未获奥斯卡奖,但举世公认:她是20世纪美国电影的偶像。当年就有个美国人把多次结缡、两拿奥斯卡奖的伊丽莎白·泰勒与她对比:“泰勒是传奇,而梦露是神话。”

  1962年8月4日夜,梦露赤身裸体、不明不白地死于洛杉矶住宅,年仅36岁。这位被称为“超级明星”、“好莱坞女神”的伟大的女演员,虽然流传于世的照片大多喜形于色,如花绽放,但她内心凄苦,艺海沉浮,几多挣扎,离开人世之际孓然一身,没有爱、没有家、没有孩子、没有金钱,在欺骗、侮辱和压榨她的社会罗网中香消玉殒。

  她原名诺玛·琼·莫滕森。玛丽莲·梦露是1946年入好莱坞的艺名(玛为百老汇一明星之名,梦是外祖母的姓)。1926年6月1日生于洛杉矶慈善医院,是私生女。自幼遭父遗弃,当电影剪辑的母亲给她一张克拉克·盖博(《乱世佳人》男主演)的照片,她一直以他为父,照片始终带在身上,直到1961年与他合拍《不合时宜的人》。母系有精神病史,外祖父、母,舅父均死于精神病。母亲入精神病院后,小诺玛就出入于孤儿院、收容所,由社会救济处代找愿意领养她的家庭,先后辗转11家,饱尝流离之苦。

  梦露被20世纪福克斯公司录用,正值她第一次婚姻结束(1942—1946)。她40年代初拍摄的一些封面模特照片,引起了公司老板霍华德·休斯的注意,下令寻找她。但各个关口,还须靠她自己去闯。她身无分文,后来回忆道:“我遇上了合适的男人,并给了他们需要的东西。”从一开始,梦露与好莱坞就是一种交易关系。好莱坞从来没有珍惜过她,而她却付出了自己的一切,成了好莱坞的摇钱树。

  梦露演艺事业的转折发生在拍摄第14部影片的1952年。《夜阑人未静》中,她被出借一家小公司饰演一个小角色。影片拍摄期间,小报爆出三年前梦露拍裸体挂历的秘闻。那年,她陷于困境,由于付不出50美元租车费,信贷公司收回了她的庞蒂亚克牌汽车。她绝望地打电话给摄影师汤姆·凯利。由凯利妻子陪同,1949年5月27日,在大幅红色天鹅绒前,梦露拍下了那幅名闻遐迩的侧身裸体照(据说后上《花花公子》创刊号封面)。她得到50美元,取回汽车。两年后挂历印出,谣言四起,妇女组织频频抗议,风波闹大,制片公司一片慌乱。然而,面对媒体梦露却很坦然:“别人告诉我必须否认我拍过……但我宁愿说老实话。”于是,其身世引起了社会的同情。人们争先恐后购票看片,一睹梦露的芳容。福克斯公司抓紧机会,与梦露修改合同,同年之内又让她连上四部影片,大捞一把,梦露也就此声誉鹊起。

  好莱坞下过包装梦露的功夫。1948年,哥伦比亚公司为她做过一次整容:用热蜡加电解法清除过多的毛发,扩大前额,修整鼻子和下巴,矫正突出的牙齿,重要的是,把她原来的浅棕色头发漂染成淡金色。两年后,经纪人约翰尼·海德又出资在贝弗利山庄最高级的美容厅为梦露剔掉鼻尖上一个小肉瘤,提高额际发线,再修下巴和牙齿,使之更加容光焕发。但好莱坞各公司从不给她有深度的角色,他们只把她当作“白痴美人”、“金发肉弹”、“性感艳星”,她的薪金从周75美元到500美元,最多时每部影片仅外加10万美元。对此梦露极为不满,多次提出要改换角色,时常用镇静、安眠等药物来化解拍片的压力,以至几度萌生摆脱好莱坞的去意。

  福克斯公司秘书汉娜注意到,可怜的梦露“有时趴在更衣室的墙上放声大哭,有时呆呆地看着镜子里的自己好几个小时”。从无声电影时代,美国电影界演员、导演就服用兴奋剂、麻醉剂成风。梦露自然不例外,有人听到她和肯尼迪总统谈论过安非他明,她对药品的剂量、副作用了如指掌。经常是服了药,“无精打采”马上变得“神采奕奕”。

  梦露拍片迟到是出名的,在伦敦拍《王子与歌女》有几次让巨星劳伦斯·奥立佛大为光火。但她绝非如有些传媒所渲染的那样蠢笨。一旦进入片场,就十分敬业。她渴望学习,一心想做个好演员,她得过“美国十大影星”称号,获过意大利、法国电影奖,她的笑靥和步态即为好莱坞的品牌,可是她并不满足于拍音乐喜剧、轻松恋爱片。1951年,她自费入洛杉矶大学进修美国史和文学史,一位女教师说她纯真得“像刚刚从修道院里出来”。她喜爱陀思妥耶夫斯基、海明威、阿瑟·密勒的作品,大明星格兰特说她是“一个真诚的人,一个非常可爱的人,她阅读所有刚出版的书籍”。1955年,她拒绝出演《怎样才能非常非常受人欢迎》,到纽约参加李·斯特拉斯伯格的演员讲习所学习,并与摄影家格林合办玛丽莲·梦露制片厂,以制片厂名义与福克斯签约,有权挑选角色和导演。此时,梦露已第二次离婚,她与棒球明星迪马吉奥的婚姻(1954)仅维持9个月,但两人友谊保持终生。梦露把自己的前途抵押在与著名剧作家阿瑟·密勒的第三次婚姻上:“我一辈子都在扮演玛丽莲·梦露,梦露、梦露。我一直都想把一切做好,而结果我只不过扮演了我自己的影子。这就是我靠近密勒的原因……在我和他成婚时,我心里想的是,有了他我就能摆脱玛丽莲·梦露”。

  男人曾包围着梦露,梦露也利用过男人。按照美国的生活方式、好莱坞的生存法则,梦露有过她自己都不可原谅的失误,她的整个人生甚至就塌陷在这里。据有关传记披露,梦露至少小产4次,人流7次。玩弄、占有她的男人很多,真正爱她的很少。在梦露内心一直企盼真诚之爱。第一次离婚后,1952年10月3日,她曾与志同道合的电影编剧鲍勃·斯莱泽跑到墨西哥结婚,因公司干预,5天后取消婚约。前面提及的俄国人约翰尼·海德,为她离婚却娶她未成,突发心脏病去世,梦露伤心欲绝,吞下30粒宁比泰自尽,被人救起。然而,梦露希冀挽救心灵危机的第三次婚姻(1956—1960)又失败了。可怕的是,60年以后肯尼迪兄弟的魔爪伸向了梦露。尽管梦露是否为肯氏家族所害尚无结论,但肯尼迪兄弟与梦露有染,确实铁证如山。先是总统约翰,接着是被委托去“调停”的司法部长罗伯特,在中央情报局胡佛一再警告下,肯氏兄弟才切断与梦露联系。这时,梦露疲惫、颓唐已极,追寻肯氏兄弟无望,好莱坞又雪上加霜:中止与她的契约,她终于彻底崩溃。

  梦露的埃伦娜第五大道居所,正门旁石墙刻有古老的拉丁铭文:“我已走完我的旅程……”她被认定“自杀”于4日周六,而6日周一就是传说她要召开记者招待会、公布与肯氏兄弟关系的日子。

  她的葬礼,在8月8日——梦露与迪马吉奥相约复婚的时间举行。迪马吉奥主持,24人参加,好莱坞与政界名流一概拒之门外,按梦露遗嘱,遗产(仅有50万美元不动产)的一半赠给表演教师李·斯特拉斯伯格。墓地,每周三次献上两枝玫瑰,迪马吉奥坚持到1982年,之后,鲍勃·斯莱泽继续派人送花。

  短短一生,梦露拍过29部影片。她给予别人的欢乐和幸福远胜于自己所得到的。20世纪福克斯公司总裁达里尔扎纳克承认:“不是谁发现了她,她是凭自己的努力争取到明星的地位的。”劳伦斯·奥立佛说得更为沉痛:“梦露小姐被利用被榨取的程度远非任何人所能相比。”(来源大众电影)

2006-08-21

啊哦。。。Google防守的好哦,嘿嘿

传了个flash到Google page center,却害怕流量限制,不敢使用,- -!
想了下,调过头来打算传到blog里,结果只支持图片。。。
改名为.gif之类都不行。。。会作图片编码检查。。。Google真聪明啊。。。
郁闷,别的都不放心,VC处理Delphi穿过来的Unicode地址却怎么都无法直接显示,真的头大啊。
实在不行就只有直接用Ansi了。。。 (- -!)凸

2006-08-10

印度解封Blogger.com的真相

  我们都知道在上个月印度封杀了包括Google的blogger.com在内的多个大型网站,引起印度全国范围内众多blogger的强烈不满。但更戏剧化的事情发生在3天后,因为印度又解封了上述的网站。为什么?是因为印度有关部门听到了blogger的抱怨和不满?blogger的影响力真的有这么大吗?当然不是。

  根据印度blogger Amit所获知的消息,印度政府不但下令全国几大ISP对这些网站进行解封,还对他们进行了责备甚至向他们发出了述因通知,让他们作出解释。这到底是怎么回事?

  在今天发表的IndiaTimes的 一篇文章里,我们可大概了解解封的真相。原来这些网站之所以得到解封,竟然是因为印度的情报部门说上次的封杀事件对他们调查印度孟买711列车连环爆炸案 造成了极大的不便,因为他们一直在监察包括blogger.com上面的blog在内的网站,而封杀使得案件罪犯也失去了常用的联系方式,大大增加了侦察 的难度。因此印度的ISP们实际上是在破坏印度政府及相关部门的好事。

  现在这些网站在印度不再被封杀,但却暴露出了印度情报部门一直在监视这些网站内容的事实。相信印度的blogger心情一定比较复杂。

看来最近Google在中国一定发生了什么事

上次发了贴以为Blogspot解封了,可才高兴了一下下,又恢复原状。
今天错误的点了一下 Firefox - 书签 - Blog - 在新标签页组中打开,打开了所有我收藏的Blog,当然其中有我的,没想到在关的时候,突然发现,居然Blogspot能访问了,这个高兴啊!
Google中国一定做了点什么,不然不可能短时间内出现这种事,当然这是好事,希望越多越好!

2006-08-03

Blogger解封了???

看到新闻说从8月1号开始解封的.
可官方通告又是这样说的:
=======================
星期二,八月一日,2006年

由于今天晚上早些时候进行了一次配置变更,所以大概有10%对blogspot的请求将不会被成功返回。用户在访问blogspot的时候可能感到速度缓慢或者看到一个服务器错误提示。

如果你遇上这个问题,请刷新你要访问的网页,这是一个不错的解决办法。同时我们也正在努力修复这个问题。

23:24更新:问题已得到解决。
23:56更新:更准确地说,问题已经得到解决,但可以还需要一点时间才能完全生效。
=======================

今天是3号了,怀着试验的心情跑来,居然还可以访问...
天佑啊!!!