CnPack Forum


 
Subject: 问一下难题,写过控件的人应该不难吧,如图
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-23 16:33  Profile | Blog | P.M. 
问一下难题,写过控件的人应该不难吧,如图

希望有人解答,或者那位朋友见过类似达到这个功能的控件,把控件名报一下,我好参照代码,十分谢谢
我急需要用上面的功能改造dxNavBar,改了5天了,现在就差这个功能,如图

[ 本帖最后由 niaoge 于 2007-7-23 16:58 编辑 ]


Image Attachment: Q4Panel.gif (2007-7-23 16:33, 16.4 K)



Image Attachment: D4NavBar.gif (2007-7-23 16:58, 16.59 K)

Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-23 23:29  Profile | Blog | P.M. 
如果是直接在底部继承自CustomPanel的Canvas上画,那么上面的蓝色是会被Panel2覆盖的。
可以考虑里头放一个Panel,自身画成蓝色,align top,bringtofront,盖在Panel2上,大概可以。
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-24 07:01  Profile | Blog | P.M. 
谢谢,我也考虑先加一个Panel,就是改好的代码怕改回去,真的不行就只能这样加Panel,
我也试了另一种方法,继承TCustomPanel的GetclientRect,得到的clientRect将Top加大,发现内部的Create的Panel可以不覆盖蓝色的部分,但是如下面的图左边的dxNavBar1Group1Control实际上也是一个Panel,但是当一出现上下滚动条时(滚动条工作方式是offsetRect(aRect,dx,dy)),还是会覆盖蓝色的部分,很怪
Top
shenloqi
灌水处处长
Rank: 4



UID 34
Digest Posts 1
Credits 287
Posts 179
点点分 287
Reading Access 10
Registered 2003-3-15
Status Offline
Post at 2007-7-24 16:02  Profile | P.M. 
设置客户区大小
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-24 18:19  Profile | Blog | P.M. 


QUOTE:
原帖由 shenloqi 于 2007-7-24 16:02 发表
设置客户区大小

怎么设啊?
从TCustomControl只继承了一个GetClientRect没有SetClientRect,
从现在加了一TCustomControl代替那种蓝色的区域,但是当有触发MouseMove,MouseDown,MouseUp事件时候会闪动
Top
shenloqi
灌水处处长
Rank: 4



UID 34
Digest Posts 1
Credits 287
Posts 179
点点分 287
Reading Access 10
Registered 2003-3-15
Status Offline
Post at 2007-7-25 10:39  Profile | P.M. 
我做了一个简单的例子,效果见附件,代码如下:

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)

Top
shenloqi
灌水处处长
Rank: 4



UID 34
Digest Posts 1
Credits 287
Posts 179
点点分 287
Reading Access 10
Registered 2003-3-15
Status Offline
Post at 2007-7-25 10:43  Profile | P.M. 
在上面的图中上面的是运行的效果,下面的是设计时候的效果。我不知道这个是不是楼主所需要的效果,我为了偷懒,没有写一个自己的控件,而是简单的替代了TPanel,不然这个控件在设计的时候应该也和运行时一样有一个标题栏,而且标题栏是不能放东西的。
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-25 11:26  Profile | Blog | P.M. 
关键就是处理NCCALCSIZE和NCPAINT两个消息。
一个消息重新计算客户区,
一个消息在非客户区上画。
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-25 16:25  Profile | Blog | P.M. 
试试看,我现在是加了一个TCustomControl,很闪,也不快
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-25 17:02  Profile | Blog | P.M. 
应该就是了,不过我要重新改一下代码,二位太强大了,向二位学习,
经验证确实如上所述,不过自画(用Tcanvas画的)的按钮没办法触发,找不到原位置Rect,因为Rect top都是负值,我正在想办法,处理方法也可能类似

[ 本帖最后由 niaoge 于 2007-7-25 18:02 编辑 ]
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-25 18:56  Profile | Blog | P.M. 
自画(用Tcanvas画的)的按钮没办法触发,鼠标在蓝色的区域没有WMMouseMove等消息
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-25 22:31  Profile | Blog | P.M. 


QUOTE:
原帖由 niaoge 于 2007-7-25 18:56 发表
自画(用Tcanvas画的)的按钮没办法触发,鼠标在蓝色的区域没有WMMouseMove等消息

已找到,使用 WMNCHitTest(var Message: TWMNCHitTest)
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-25 22:46  Profile | Blog | P.M. 
CnWizards中的窗体置顶与折叠扩展专家使用了我们扩展后的mxCaptionButtons,
它的代码对标题栏按钮的开发挺有帮助。

在cnwizards\Source\ThirdParty下面。
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-26 00:30  Profile | Blog | P.M. 


QUOTE:
原帖由 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代码对我提高很多,
结贴
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-8-30 16:15  Profile | Blog | P.M. 
沈兄的代码简练好懂,不过忽然想到一个问题。如果这个form有个主菜单,那么它会不会受影响?
Top
shenloqi
灌水处处长
Rank: 4



UID 34
Digest Posts 1
Credits 287
Posts 179
点点分 287
Reading Access 10
Registered 2003-3-15
Status Offline
Post at 2007-8-31 16:15  Profile | P.M. 
应该没有问题的,菜单部分本来就不属于客户区的。
Top
 




All times are GMT++8, the time now is 2024-11-24 14:50

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.011788 second(s), 9 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP