关于MDI Client 滚动条的问题(90分)

  • 主题发起人 主题发起人 黄耀彰
  • 开始时间 开始时间

黄耀彰

Unregistered / Unconfirmed
GUEST, unregistred user!
关于MDI Client 滚动条的问题: ^_^
我用 Delphi 5做了一个MDI 应用程序,设计时用了两个窗体,一个作为MDI主窗体,另一个作为 MDI 子窗体。
在运行时,当把MDI 子窗体移动到超出 MDI Client 的边界时,总是出现水平滚动条或垂直滚动条,我想删掉它,不知应该怎么做?
下面的做法我已经试过:
我曾经多次阅读过关于MDI 部分的VCL 源代码,发现了TCustomForm 类有一个 ClientHandle 只读属性(It also exists in the Delphi5’s help),这其实是一个MDI Client 的窗口句柄,于是,我马上创建一个新的应用程序,用ClientHandle 作为GetWindowLong 和SetWindowLong API 函数的第一个参数调用,改变MDI Client 的窗口风格,把它的滚动条删掉,但没有效,并且,发现这对滚动条根本不属于MDI Client 窗口风格的一部分(即,没有设置SC_VSCROLL和 SC_HSCROLL ),这时,我开始怀疑它是否是用VCL来创建的,而且,由VCL自己来管理。如果真的是那样,就难搞了。
  是否我的思路不对,还是另有什么好方法,有请大虾多多指教.
Thank you !
 
告诉你一个非常简单的方法:
将Forms.Pas拷贝到你的工程文件的目录,并用Project菜单中的Add to Project....
将Forms.Pas加到你的工程文件中。改写procedure TCustomForm.CreateWnd;

FClientHandle := Windows.CreateWindowEx(WS_EX_CLIENTEDGE, 'MDICLIENT',
nil, WS_CHILD or WS_VISIBLE or WS_GROUP or WS_TABSTOP or
WS_CLIPCHILDREN or WS_HSCROLL or WS_VSCROLL or WS_CLIPSIBLINGS or
MDIS_ALLCHILDSTYLES, 0, 0, ClientWidth, ClientHeight, Handle, 0,
HInstance, @ClientCreateStruct);
改为就搞定:
FClientHandle := Windows.CreateWindowEx(WS_EX_CLIENTEDGE, 'MDICLIENT',
nil, WS_CHILD or WS_VISIBLE or WS_GROUP or WS_TABSTOP or
WS_CLIPCHILDREN or WS_CLIPSIBLINGS or
MDIS_ALLCHILDSTYLES, 0, 0, ClientWidth, ClientHeight, Handle, 0,
HInstance, @ClientCreateStruct);
 

我发现沈前卫是维一的高手!
 
沈前卫是高手!


 
哎,你们说得太夸张了,我只是初学者....
 
初学者有这水平? 哪怕是看的也行呀。
是你太夸张了。呵呵。
 
To SuperMMX:
其实我没编写几个程序,很多问题是边学边答。不是初学者是什么.呵呵..... {B-)
 
一个可收入经典的问题解答结束了 。
谢谢沈前卫的回答。分全给你。
你的回答不仅帮我解决了困绕多时的问题,
也给大家一个启发,要多研究VCL源码!
再次谢谢!
黄耀彰
 
后退
顶部