归档 – 8月, 2013

上帝以为自己是谁-纪念库布里克诞辰80周年(转)

        仅凭西方诞生了库布里克,以及西方文化界对库布里克的推崇这一点,我们就可以断言,那里的文化系统、传统和体统,统统比我们这边高明和先进。差距至少有半个世纪。当然,这种对比唯一的意义仅在于说,目前中国文化的现状,还没到理解库布里克的程度,因为我们还不知道如何看待斯皮尔伯格呢。         所以我们只能把他放在西方的那个系统去说——在那边,那些拥有最一般鉴赏力的人,比如美国电影界里有眼光的资本家和大牌演员,他们对库布里克的评 ...阅读更多

2 Comments 2013-08-30

透明皮肤控件设计系列(八):完结篇

我们的透明皮肤控件设计系列到此告一段落了,想进一步学习的朋友,可以找一些当前流行的DirectUI的资料来看看。 所谓DirectUI,意思是直接画的,例如QQ之类,除了窗口外,全部控件都是画出来的,没有单独的句柄。DirectUI的好处在于没有句柄外,因为全部控件都是画在一张画布上面,所以闪烁的机会更加少。实际上,Delphi本身所有从TGraphicControl继承下来的控件也是无句柄的,例如TLabel。另外有一个控件包叫DXScene(应该就是FireMonkey的前身)也是基于DirectUI的,除了全部控件都是画的外,它还是基于3D坐标系的,而且是直接在显存里面显示的: 1、原始 ...阅读更多

16 Comments 2013-08-18

透明皮肤控件设计系列(七):界面设计中的一些算法和技巧

除了第二讲里面的平均颜色之外,实际上一个真正成熟的界面涉及的东西还是很多的。 一、九宫格算法 例如按钮,假如说,图片使用拉伸方式的话,按钮变大后会很难看,这种情况下一般使用九宫格算法。 所谓九宫格算法,就是把图片分成1~9个区域,针对不同区域作不同处理: A---------B---------C--------D |                |                 |               | |1不变     | 2只变宽 |  3不变 | E------LtPt-----RTPt--------F |                |               ...阅读更多

2 Comments 2013-08-18

卑劣的街头,肮脏的聚会(转)

卑劣的街头,又一部韩国黑社会电影。但我更喜欢它的英文名《A Dirty Carnival》。 从名字就可以看出导演对黑社会的一种态度,但是影片却远没有那么简单。当在夜总会中烂醉如泥的检察官揪着柄斗的耳朵说:“败类、寄生虫”的时候,谁才是真正的败类、寄生虫?也许答案远没有黑社会是败类、检察官是寄生虫那么简单。 柄斗为了全家人的生活加入了黑社会,但这个在小说电影中被描绘得纸醉金迷、平步青云的地方,却让他痛苦不已——入会几年了一无所有,家人还住在小小的旧房子中,自己的手下则在租来的房子中过着吃不饱穿不暖的日子。仅仅到这里就可以明白导演的良苦用心:不用去看那些其他的黑社会电影了,他们误导了你们,那并不 ...阅读更多

一条评论 2013-08-14

透明皮肤控件设计系列(六):滚动条处理

滚动条对于界面来说也是非常重要的。修改系统默认滚动条一般有三种方法: 一、覆盖法 覆盖法顾名思义就是创建一个跟滚动条大小一样的控件,覆盖在原来的滚动条上面,当有消息的时候,直接“漏”下去给原来真正的滚动条: [sourcecode language="delphi"] procedure TWinScroll.WMNCHitTest(var Msg: TWMNCHitTest); begin Msg.Result := HTTRANSPARENT; end; [/sourcecode] 优点:不用自己计算变化范围。 缺点:大小无法改变。例如比系统原来的滚动条小的化,就盖不住原来的了。 二、控件 ...阅读更多

9 Comments 2013-08-14

TCP程序设计系列(一)

很多Delphi的使用者依赖控件,比如说,Indy系列。也有很多使用Winsock API的,但是或多或少都有着一些小问题,这是因为对Winsock不了解造成的。 笔者几年前曾经设计过一个完整的TCP协议栈,其中协议栈是纯粹用Delphi写的,驱动部分则是用C挂接到网卡驱动前,鉴于最近“Carberp 木马源码”已经公开,所以打算提提这方面的东西。 我们的讲座将以WinpCap作为底层收发数据部分,应用层则使用Delphi。例如,我们熟悉的两个WinSock函数: function htons(hostshort: Word): Word; begin Result := ((hostshor ...阅读更多

13 Comments 2013-08-12

透明皮肤控件设计系列(五):透明控件

现在我们有了透明窗口,那么所有控件也应该是透明的。 控件透明,原理其实很简单,就是把父控件的图像复制到自己上面即可。例如,常用的方法是给父控件发送背景重画的消息,同时把自己的DC传递过去: SendMessage(Parent.Handle, WM_ERASEBKGND, DC, 0); TCtrl(Parent).PaintControls(DC, nil); 这种方法对于非自己设计的皮肤窗口也有效,但缺点是会因为父窗口重画造成闪烁。 现在因为透明窗口也是我们自己制作的,所以方法就简单多了:根据自己的坐标位置,直接从图片拷贝即可。以CheckBox为例,代码段如下: Buffer := TB ...阅读更多

11 Comments 2013-08-11

透明皮肤控件设计系列(四):皮肤窗口完结篇

经过上面的几篇文章的介绍,相信大家已经会自己做一个透明皮肤窗口了,但是要记住,上文因为是基础教程,所以很多细节仍然是需要处理的,例如: 1、为了加快速度,实际上可以先用MakeBmp函数制作好皮肤图片,平均颜色就是取图片右下角的一个点即可。例如QQ的皮肤包就是这么干的。 2、如果实在想运行时计算,那么可以先将图片缩小,再计算平均颜色。这样一来,循环的次数就减少了,而效果是一样的。 3、为了美观,边框可以画个线条上去,这样一来立体感就强很多:   另外,还要其它一些细节,例如 Caption,如果平均颜色是黑色,那么字体应该自动换成白色。我在这里偷了个懒,直接使用了Blur算法,根据字 ...阅读更多

12 Comments 2013-08-11

透明皮肤控件设计系列(三):皮肤窗口进阶篇

前文的窗口如果最大化,你会发现它把任务栏也覆盖了,原因是我们窗口的 BorderStyle 设置成了 bsNone,所以要处理一下WM_GETMINMAXINFO消息: procedure TForm1.WMGETMINMAXINFO(var Message: TMessage); var Rect: TRect; begin SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0); with PMINMAXINFO(Message.LParam)^ do begin //ptReserved: TPoint;//保留不用 ptMaxSize.X ...阅读更多

12 Comments 2013-08-07

透明皮肤控件设计系列(二):皮肤窗口初级篇

Windows将窗口分为客户区和非客户区,例如对于标准的Windows窗口,标题栏和边框都属于非客户区,又称为NC区。对于客户区的绘制,应用程序会收到WM_PAINT消息,而非客户区,对应的消息是WM_NCPAINT。要实现皮肤窗口,需要三个步骤: 第一步:定义非客户区的大小。 要自定义非客户区的大小,程序就要响应WM_NCCALCSIZE消息。假设我们的标题高度为60(像素,下同),边框为10,那么对应的代码应该类似这样: const xTitleHeight: Integer = 50; //标题栏的高度 xFramWidth: Integer = 10; //左、右、下边框的厚度 pro ...阅读更多

12 Comments 2013-08-05


日历

2013年 8月
 1234
567891011
12131415161718
19202122232425
262728293031  

归档

分类目录