效果图:
设计图:
scSplitView设置:
opened:false;
openedwidth:150;(按你自己需求)
compactwidth:35;(确保只能看到图标即可)
设计技巧: compactwidth先设置成全尺寸,等全部设计完成后,再调成合理值.
需要用到两个事件.一个是onMouseEnter,一个是onMouseLeave
procedure TForm1.scSplitView1MouseEnter(Sender: TObject); begin if scSplitView1.Opened then Exit; scSplitView1.Opened := True; Label1.Visible := True; Label2.Visible := True; end; procedure TForm1.scSplitView1MouseLeave(Sender: TObject); var P: TPoint; R: TRect; begin GetWindowRect(scSplitView1.Handle, R); GetCursorPos(P); if PtInRect(R, P) then exit else begin //这里要先隐藏文字,不然会看到字体向左移动 Label1.Visible := False; Label2.Visible := False; scSplitView1.Opened := False; end; end;
遇到的坑:
当鼠标移动到scSplitView控件内的其他对象时,会被认为离开了scSplitView区域,进而触发onMouseLeave事件
解决方案:
检查鼠标坐标是否在指定区域内.
我最开始使用的是
R:= scSplitView1.BoundsRect ;
用来获取scSplitView控件的区域,却一直得不到预想的效果,后来经过猫哥指点,使用
GetWindowRect(scSplitView1.Handle, R);
两者数据对比如下.
很明显的看出Rect数据的不同,难怪效果不理想.后来我们的大神平原君给我解释了Bound,Client,Window三个概念的定义,我才彻底醒悟过来:
天天写bug 2022-11-02 18:48:26
天天写bug 2022-11-02 18:48:37
这个BoundsRect 是不是应该这么理解 ? 天天写bug 2022-11-02 19:13:25 我是想判断鼠标有没有在指定区域内,但是一直没能得到预想的效果 delphi入门爱好者 2022-11-02 19:47:27 错了 天天写bug 2022-11-02 19:49:13 想做一个温柔的人 错了 @delphi入门爱好者 我已经知道错了,但还是没理解 ..我刚刚是用GetWindowRect(scSplitView1.Handle, R);拿 到的数据 做的对比 ,发现数据根本不一样 delphi入门爱好者 2022-11-02 19:49:36
delphi入门爱好者 2022-11-02 19:49:42
红色的是bound delphi入门爱好者 2022-11-02 19:49:48 黄色的是clinet delphi入门爱好者 2022-11-02 19:50:11 window 就是整个程序
天天写bug 2022-11-02 19:51:47
client是操作区,Bound是带工具栏,window是包含标题栏,是这样吗? delphi入门爱好者 2022-11-02 19:52:21 bound边框那一段 天天写bug 2022-11-02 19:53:58 就是不带标题栏和底下状态栏吗? delphi入门爱好者 2022-11-02 19:54:20 那个用windowreact取 delphi入门爱好者 2022-11-02 19:54:47 window 总高 100,border区域未知,但是可以这样算 delphi入门爱好者 2022-11-02 19:55:04 window- clinet= border*2 delphi入门爱好者 2022-11-02 19:55:23 因为border上下都有 所以是*2 delphi入门爱好者 2022-11-02 19:55:31 这样解释清晰吗?
天天写bug 2022-11-02 19:56:23 大佬,那bound能不能再讲一点? delphi入门爱好者 2022-11-02 19:56:40 bound就是边框区域 天天写bug 2022-11-02 19:56:54 就是线啊?! delphi入门爱好者 2022-11-02 19:57:06 border 也是可以有宽度的啊 delphi入门爱好者 2022-11-02 19:57:34 天天写bug 2022-11-02 19:57:40 那这个怎么解释呢?
delphi入门爱好者 2022-11-02 19:57:42
这个border是不是有宽度 delphi入门爱好者 2022-11-02 19:58:03 r.left delphi入门爱好者 2022-11-02 19:58:14 是r相对于他父亲的 距离 delphi入门爱好者 2022-11-02 19:58:24 r如果是顶层窗口,父亲就是屏幕了 天天写bug 2022-11-02 19:59:07 好的,这回是彻底司了,谢谢@delphi入门爱好者 天天写bug 2022-11-02 19:59:16 悟了 delphi入门爱好者 2022-11-02 19:59:42
delphi入门爱好者 2022-11-02 19:59:54 假设这几个是父子窗口 delphi入门爱好者 2022-11-02 20:00:03 最外面是screen, delphi入门爱好者 2022-11-02 20:00:29 然后是 1级,2级, 然后每个窗口的left都是他距离自己父亲来算的 delphi入门爱好者 2022-11-02 20:01:16 我没找到浏览器bound 模型 delphi入门爱好者 2022-11-02 20:01:22 讲究看这个小图吧 delphi入门爱好者 2022-11-02 20:01:38 不想看也没关系。。这个是美化的时候可以参考的 天天写bug 2022-11-02 20:01:46 厉害,这回明白了,非常感谢
标签:11,控件,入门,19,delphi,02,TscSplitView,2022 From: https://www.cnblogs.com/yoooos/p/16853289.html