首页 > 其他分享 >delphi TscSplitView控件学习笔记(2)

delphi TscSplitView控件学习笔记(2)

时间:2022-11-03 09:25:08浏览次数:43  
标签:11 控件 入门 19 delphi 02 TscSplitView 2022

效果图:

  

设计图:

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

相关文章