关于窗体停靠的问题(50分)

  • 主题发起人 主题发起人 kim_fu
  • 开始时间 开始时间
K

kim_fu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的主窗体是一个 MDI 窗口。在窗体左边放一个 Panel.和一个Splitter.另外一个窗体需要<br>停靠在主窗体上。在 Panel里有停靠的代码。主窗体的右边同样设置。<br><br>问题是。窗体在左边停靠后,在主窗口的客户区留下一条边。是Splitter的边。而在右边<br>停靠就没有那条边。我的觉得好象是客户区没刷新。同样的代码在D5下编译就没问题。<br>我该怎么把那条边去掉呢?<br>
 
Splitter的问题,你将他的width设成1吧
 
是啊。是 Splitter 的问题。我将他设置成0都不行。
 
多试试吧
 
怎么试啊? 没有别人遇到这个问题吗?
 
不好意思,没太明白<br>&gt;&gt;窗体在左边停靠后,在主窗口的客户区留下一条边。是Splitter的边<br>你可以试试在这种情况下设Splitter的边的宽为0<br>
 
to biyesheng:<br>&nbsp; 对。就是窗体停靠之后,在主窗体(MDI)上就出现一个竖条,比如 splitter.with = 2;<br>那么,那个竖条的宽度就是2。<br>&nbsp; 但是,我不知道他是怎么产生的。也不知道在什么时候将他的宽度设置为0。<br>我是仿照D6的DEMO里的DOCKING例子做的。
 
那个兰条跟 MDIForm 没关系,是 Splitter 的“影子”,你如果把它 parentcolor =true 就看不到了:)<br>只要你设成别的颜色,而且 splitter 不是界面上最左上角的控件,“影子”就会出现<br>我看了一下 VCL 源码, 应该是个VCL 的 Bug,Splitter 被画了两次,<br>第二次画的时候 Canvas.ClientRect 位置计算不对。<br>我看了一下,应该是 Forms 中的<br>procedure TCustomForm.ClientWndProc(var Message: TMessage); <br><br>过程中消息响应产生了问题。<br>我试着拷贝一个 Forms.pas 到当前目录,把 当前工程 关闭打开一次(确保 Delphi 使用我当前目录的Forms)。<br>然后在 Forms.pas 中注释一些代码,就是<br>procedure TCustomForm.ClientWndProc(var Message: TMessage); <br>中的如下所示代码:<br>{ &nbsp; &nbsp; &nbsp;WM_PAINT:<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DC := TWMPaint(Message).DC;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if DC = 0 then TWMPaint(Message).DC := BeginPaint(ClientHandle, PS);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PaintHandler(TWMPaint(Message));<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; finally<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if DC = 0 then EndPaint(ClientHandle, PS);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>}<br>把这段代码注释后,结果蓝色条带消失<br>我猜测是不是这里响应 WMPaint 造成重复。<br>当然让大家都来改 Forms.pas 显然不是好办法,不知道谁有 D7 的代码,看看这里是不是改过?<br>
 
接受答案了.
 
可以不可以把你停靠的源代码给我们看一看呀?
 
后退
顶部