关于D6自带的窗口停靠例程的问题!!(166分)

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

kim_fu

Unregistered / Unconfirmed
GUEST, unregistred user!
打开D6下的Demos/Docking 这个例子。<br>设置主窗口的 FormStyle = fsMDIForm,Color = clAppWorkSpace;<br>设置 VSplitter 的 Color = clBlue;<br>添加一个窗体,设置新窗体的 FormStyle = fsMDIChild;<br>运行程序,新添加的子窗口自动显示。然后单击工具条上的 While.弹出一个窗口<br>将弹出窗口停靠到主窗口左边,发现主窗口的客户区出现一个兰色的竖条。<br>其宽度和 VSplitter 的宽度一样。<br>最大化子窗口,再最小化,发现那个兰色的竖条变长了。<br><br>我的问题是我该怎么去掉这个竖条呢?我用了很多方法都不行。各位在做MDI窗口<br>停靠的时候有没有遇到这个问题呢?<br>我的环境是 20000 Server + D6.<br><br>同样的程序在 D5,D7(刚装的) 下就没问题。是不是D6的问题呢?<br><br>帮忙啊。急啊。我所有的分全送上。
 
up 嫌分少?
 
我以前也遇到过这种问题<br>把Position属性改一下试试,我忘了改成什么值了,先试试吧
 
to xuzhudi:<br>&nbsp; &nbsp;我把主窗口的所有 Position 都试了。还是不行啊。
 
难道大富翁上就没人能回答我的问题吗?<br><br>还是我的问题不值得回答呢?<br><br>我都有点心恢意冷了。<br><br>我现在还有 15个问题,共843分,没人回答。唉!
 
up!!!!!!!!!!!!!!!!!!!!!!
 
up???????????????
 
抓个图吧我试了 没看到你说的问题哦 d6
 
在我的的D6中没有出现类似的情况,我想这个情况可能与那个VSplitter有关,把它先<br>删除看看运行的效果如何?是否还会有那样的情况,以此来判断是否与这个VSplitter<br>有关。
 
我这里也有这种情况,而且我还看到新出来的 Form 根本没有被 Dock 上去<br>我估计 D6 不允许 MDIChildForm 被 Dock(猜的)<br>而那个多余的 蓝条 是因为主窗体为 MDIForm 的原因<br>
 
to beta:<br><br>对。你说的对。是因为主窗体是MDIForm的原因<br><br>如果主窗体不是MDIFrom的话就不会有问题了。<br><br>而且是 VSplitter 他没有刷新好。在程序定义的停靠过程中加上<br>Application.ProcessMessage 停靠就不会出现竖条。但是自窗体出现后还是会出现<br>竖条的。
 
那个兰条跟 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>
 
to 轻松虎:<br>&nbsp; &nbsp;你的方法我试了。那个兰条确实没有了。<br>不过新问题又出现了。<br>我原来是在MDI主窗口上贴了一幅图。<br>在 OnPaint 事件了使用 Canvas.Draw(0,0,bkBitmap);<br>来画背景图片。<br>可是如果把上边你说的那些代码注释掉背景就不画了。<br>我把D7的那部分代码弄过来。问题变成了每次主窗口被遮住的部分重画的部分<br>和原来的图象对应的那部分没对上。图象变成一块一块的了。<br>怎么解决啊。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部