一个创建自画caption bar的教程,有个bug。 ( 积分: 50 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
在网络上找到一个比较全面的自己画caption bar的教程:
http://www.mindspring.com/~cityzoo/ttlbar1.html
源代码可以从这个地方下载:
http://www.filesearching.com/cgi-bin/s?t=n&l=en&q=ftp.risp.ru/.3/language/delphi
里面有一个liltitle.zip,这就是源代码。

因为源代码是delphi 3的,
我用delphi 7,所以下载下来后有两个地方需要修改;运行的时候无法编译过去,在编译不过去的地方稍微改动一下,很简单的改动,对大家应当不难,可以说很简单;
就比如说里面的:TForm1.WMNCHitTest事件无法编译,就出现在ptinrect里面的第二个参数message.pos,所以就先定义一个Tpoint的变量pt,pt.X:=amessage.Pos.x;
pt.Y:=amessage.Pos.y;然后把message.pos都改为pt;
还有一个地方TForm1.WMNCLButtonDown事件里面的那些sendmessage函数的最后一个参数longint(pt)都改为Tmessage(Message).LParam;
还有TForm1.WMNCHitTest事件里面的Message.Result = HTNOWHERE改动为Message.Result = windows.HTNOWHERE,因为HTNOWHERE在comctls里面也有定义,会引起冲突,所以加个windows。

这样就可以运行这个窗体了;

是不是有点土??不够文章把自画窗体的过程说得很清楚了,你也可以改动其中一些地方达到自己想要的效果;

可是这个程序有个问题,我一直无法解决啊,大家帮我看看:
往窗体随便扔几个控件,运行,然后你随意地一直乱点窗口的client区,然后按住鼠标不懂,托到caption bar区,然后释放,或者resize窗口,直到出现滚动栏【因为你放置了控件,所以窗口小到一定程度就会出现滚动栏了】,反正就是随意的操作,特别就是点击窗口的client区,然后按住鼠标,移动鼠标到caption bar区,然后释放,来他个N次,运气好的时候就会出现如下的bug:
窗口好像死掉了,按caption bar的任何一个地方都不响应事件了。

不知道为什么??弄了很长事件都不知道为什么??
 
这些东西一般都很旧,里面的技术对我来说都没什么新意,这个用不了就下另一个,
效果最好的是wordcap,当年很多共享软件在用,网上很多地方都写有下载,但实际
可能下载不了,因为这种远古的东西,一般都在远古的网站上下载,而这些网站,
通常辉煌一时,现在都城了埃及皇帝,老兄碰碰运气吧。
 
kinneng,
你说的也对。
但是问题的关键是我说的这个,它不是一个控件,而是一个教程,按照这个教程的框架,你可以根据你的需要自己画你想要的标题栏,想怎么画就怎么画,而不像那些控件只能画固定的几种,外观也只能固定的几种。

这几天我又研究了一下,这个教程,问题的实质在于窗口的滚动栏,如果设置窗口的滚动兰为不可见,autoscroll=false,则就不会有问题;可是如果不这样的法,则有滚动栏的情况下,即使窗口重新resize到滚动兰消失,问题还是存在。
有可能跟重新调整窗口大小情况下,在出现滚动栏的时候,怎么重新计算client区的大下、范围有关,我跟踪了一下hittest的消息,有时候明明在标题栏的点击,可是hittest的结果却是htclient,要么就是htscroll,所以窗口肯定不会有什么反应了。

我看比如Xp style和buisinessskinform这些控件,他们也是没有滚动栏;
 
后退
顶部