如何去掉MDI主窗体的滚动条?(50分)

L

lzx

Unregistered / Unconfirmed
GUEST, unregistred user!
当MDI子窗体移出主窗体的Client区域时,主窗体会出现
令人讨厌的滚动条,偶想禁止它出现,望大虾告知其实现
的方法。
 
照以下例子使用如下命令
ShowScrollBar(MainForm.handle, SB_BOTH ,false);
 
这种方法好象不行,(我试了一下)
要截获滚动消息.我以前收集了在
论坛中的TIPS顺便贴过来(懒得找)
Message Crack技术,实际上Borland还对不同的消息定义了不同的记录更方便我们处理 如:
procedure WMSize(var SizeMessage: TWMSize); message WM_SIZE;
procedure WMLButtonDblClk (var Msg: TWMLButtonDblClk);message wm_LButtonDblClk;
procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
  部件能收到什么样的消息,最好查Help关于事件说明如下:事件实际上是函数指针,请看例子:这是Delphi定义的标准事件,不带参数(与普通函数不同的是加上 of Object说明是对象属性)
type
TNotifyEvent = procedure (Sender: TObject) of object;带参数的话:
TScrollEvent = procedure (Sender: TObject; Pos:Integer) of object;
                        -》可以加任何参数   
TSomeObject = class (TCustomcontrol)
pirvate:
FOnScroll: TScrollEvent; ....
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
->>处理滚行条垂直滚动消息:
published:
Property OnScroll: TScrollEvent Read FOnScroll Write FOnScroll;使用方法:
procedure TSomeObject.WMVScroll(var Message: TWMVScroll);
var
FIncrement:Integer;
begin
if (Message.ScrollBar = 0) then
begin
with Message do
case ScrollCode of SB_THUMBTRACK:
begin
if Assigned(FOnScroll) then
FOnScroll(Self,Pos);
end; ...
inherited;
end;

delphi中部件能接受任何消息, 包括自定义消息.
只是在消息发布上有点技巧吧, 如果是windows control, 只要给这个部件
的handle postmessage就能接收.
对于没有windows handle的控件, 可以通过perform方法传递消息.
其实所有delphi中消息的处理例程都在winproc中, 只不过入口不同而已.
一般情况下如果消息处理过程返回时将Message.Result设为0, 表示该消息已处理
完毕, 不再往下传递. 所以将Result置为非0可以实现消息的往下传递吧. 如果在
消息处理时不想遗漏其他的处理该消息的过程, 别忘记加上inherited;一句.
当然也可以不加inherited;一句并将Result置0 来达到阻断原来消息句柄的处理
过程. 比如在画透明效果图象过程中常将WM_ERASEBKGND,WM_PAINT阻断.

 
我是知道DELPHI的这种消息处理机制,但是我搞不懂一个MDI主FORM产生
滚动条是发出什么消息,好象不是WM_VSCROLL,还有这个消息的发生主体
是什么,是主FORM还是子FORM?
 
控制MDI窗口行为的可不是delphi而是windows了, 估计还得从MDI父窗口的
CreateWnd的params着手.
 
不知下述方法是否可行:
在MDI父窗口form的定义中加上:
procedure CreateParams( var Params : tCreateParams );override;

implimentation中写如下代码:

procedure TForm1.CreateParams(var Params : tCreateParams ) ;
begin
inherited;
Params.Style:=Params.Style and (not (WS_HSCROLL or WS_VSCROLL));
end;
 
这样搞不行,看了原代码(FORM。PAS),控制滚动条的产生是
FORM的客户区,而不是FORM,所以改变FORM的PARAMS是不行的,
到是可以修改源码,把
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);

中的WS_HSCROLL or WS_VSCROLL去掉即可以,但是有没有不修改源码也能
实现这种效果!
 
override form1.createwnd?
 
>>但是有没有不修改源码也能实现这种效果!

逻辑上讲没有,override createwnd也不行,
因为FClientHandle就是private变量。
 
是不是这个问题没法决解,可不可以通过API函数来去掉滚动条,
(这分不好送出去,是不是分太少啦)
 
学习交流才是我们的真正目的 :)
 
其实改源码也不麻烦,就把Forms.pas
放到自己目录里,Add到project中,
再use一下就行了。

不影响delphi,也不影响别的程序。
 
由于问题的提出者很久无报到(2月),也鉴于问题应该可以解决,故结束此问题。

虽然dwwang说的不多,但对于问题来说比较有效,所以给分较多;其他的朋友也做
出不少贡献,提出不少宝贵的意见,也按份量给一些分数,以资鼓励。

-- by 3h.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部