Subject: 问一下难题,写过控件的人应该不难吧,如图 [Print This Page]
Author:
niaoge Time: 2007-7-23 16:33 Subject: 问一下难题,写过控件的人应该不难吧,如图
希望有人解答,或者那位朋友见过类似达到这个功能的控件,把控件名报一下,我好参照代码,十分谢谢
我急需要用上面的功能改造dxNavBar,改了5天了,现在就差这个功能,如图
[ 本帖最后由 niaoge 于 2007-7-23 16:58 编辑 ]
Image Attachment:
Q4Panel.gif (2007-7-23 16:33, 16.4 K) / Download count 415
http://bbs.cnpack.org/attachment.php?aid=333
Image Attachment:
D4NavBar.gif (2007-7-23 16:58, 16.59 K) / Download count 427
http://bbs.cnpack.org/attachment.php?aid=334
Author:
Passion Time: 2007-7-23 23:29
如果是直接在底部继承自CustomPanel的Canvas上画,那么上面的蓝色是会被Panel2覆盖的。
可以考虑里头放一个Panel,自身画成蓝色,align top,bringtofront,盖在Panel2上,大概可以。
Author:
niaoge Time: 2007-7-24 07:01
谢谢,我也考虑先加一个Panel,就是改好的代码怕改回去,真的不行就只能这样加Panel,
我也试了另一种方法,继承TCustomPanel的GetclientRect,得到的clientRect将Top加大,发现内部的Create的Panel可以不覆盖蓝色的部分,但是如下面的图左边的dxNavBar1Group1Control实际上也是一个Panel,但是当一出现上下滚动条时(滚动条工作方式是offsetRect(aRect,dx,dy)),还是会覆盖蓝色的部分,很怪
Author:
shenloqi Time: 2007-7-24 16:02
设置客户区大小
Author:
niaoge Time: 2007-7-24 18:19
原帖由 shenloqi 于 2007-7-24 16:02 发表
设置客户区大小
怎么设啊?
从TCustomControl只继承了一个GetClientRect没有SetClientRect,
从现在加了一TCustomControl代替那种蓝色的区域,但是当有触发MouseMove,MouseDown,MouseUp事件时候会闪动
Author:
shenloqi Time: 2007-7-25 10:39
我做了一个简单的例子,效果见附件,代码如下:
procedure TPanel.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
with Message.CalcSize_Params^ do
begin
rgrc[0].Top := rgrc[0].Top + 20;
end;
end;
procedure TPanel.WMNCPaint(var Message: TMessage);
var
OldDC: HDC;
DC: HDC;
begin
OldDC := Canvas.Handle;
DC := GetWindowDC(Handle);
try
Canvas.Handle := DC;
Canvas.Rectangle(Rect(0, 0, ClientWidth, 20));
Canvas.TextRect(Rect(0, 0, ClientWidth, 20), 2, 4, 'This is Caption');
finally
Canvas.Handle := OldDC;
ReleaseDC(Handle, DC);
end;
end;
Image Attachment:
[设计和运行效果]
剪贴板01.jpg (2007-7-25 10:39, 21.16 K) / Download count 450
http://bbs.cnpack.org/attachment.php?aid=337
Author:
shenloqi Time: 2007-7-25 10:43
在上面的图中上面的是运行的效果,下面的是设计时候的效果。我不知道这个是不是楼主所需要的效果,我为了偷懒,没有写一个自己的控件,而是简单的替代了TPanel,不然这个控件在设计的时候应该也和运行时一样有一个标题栏,而且标题栏是不能放东西的。
Author:
Passion Time: 2007-7-25 11:26
关键就是处理NCCALCSIZE和NCPAINT两个消息。
一个消息重新计算客户区,
一个消息在非客户区上画。
Author:
niaoge Time: 2007-7-25 16:25
试试看,我现在是加了一个TCustomControl,很闪,也不快
Author:
niaoge Time: 2007-7-25 17:02
应该就是了,不过我要重新改一下代码,二位太强大了,向二位学习,
经验证确实如上所述,不过自画(用Tcanvas画的)的按钮没办法触发,找不到原位置Rect,因为Rect top都是负值,我正在想办法,处理方法也可能类似
[ 本帖最后由 niaoge 于 2007-7-25 18:02 编辑 ]
Author:
niaoge Time: 2007-7-25 18:56
自画(用Tcanvas画的)的按钮没办法触发,鼠标在蓝色的区域没有WMMouseMove等消息
Author:
niaoge Time: 2007-7-25 22:31
原帖由 niaoge 于 2007-7-25 18:56 发表
自画(用Tcanvas画的)的按钮没办法触发,鼠标在蓝色的区域没有WMMouseMove等消息
已找到,使用 WMNCHitTest(var Message: TWMNCHitTest)
Author:
Passion Time: 2007-7-25 22:46
CnWizards中的窗体置顶与折叠扩展专家使用了我们扩展后的mxCaptionButtons,
它的代码对标题栏按钮的开发挺有帮助。
在cnwizards\Source\ThirdParty下面。
Author:
niaoge Time: 2007-7-26 00:30
原帖由 Passion 于 2007-7-25 22:46 发表
CnWizards中的窗体置顶与折叠扩展专家使用了我们扩展后的mxCaptionButtons,
它的代码对标题栏按钮的开发挺有帮助。
在cnwizards\Source\ThirdParty下面。
谢谢,根据上面二位提示,我做好了,总结一下,
WMNCCalcSize:设置工作区
WMNCPaint:工作区外Paint 不过我没有用到这个,其实只要在Paint过程内用GetWindowsDc就可以,因为dxNav-Bar有很多计算得出rect ,直接写在WMNCPaint 会重复很多代码(仅对dxNav-Bar而言),
WMNCHitTest:用于截获鼠标信息,当在控件内那个非工作区上(蓝色部分),把Message.result设置成HTCLIENT这样可以处罚MouseMove,MouseUp,MouseDown事件
继承WndProc: 处理从任务栏还原时 判断 Message.Msg=WM_NCPAINT时用 invalidate,让控件重画,不然从任务栏还原时,工作区外不会重画,
谢谢上面二位大家和给本贴给予关注的同仁们
有空多看看cw的代码,cw代码对我提高很多,
结贴
Author:
Passion Time: 2007-8-30 16:15
沈兄的代码简练好懂,不过忽然想到一个问题。如果这个form有个主菜单,那么它会不会受影响?
Author:
shenloqi Time: 2007-8-31 16:15
应该没有问题的,菜单部分本来就不属于客户区的。
Welcome to CnPack Forum (http://bbs.cnpack.org/) |
Powered by Discuz! 5.0.0 |