一个有意思的问题:如何让打开文件对话框(TOpenDialog)Dock在Form里面?(200分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
我尝试了Windows.SetParent(OpenDialog.Handle, Form1.Handle)
结果失败!
 
应该不行
 
呵呵,其实OpenDialog.Handle并不是指向OpenDialog这个窗体的句柄:
你可以看看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=612791
我试了一下:
新建一个窗体,加一个OpenDialog,一个Button
设OpenDialog1.Title = "打开一个文件",然后响应它的OnShow
事件,和Button的OnClick事件:

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
var
aHandle : HWND;
begin
aHandle := FindWindow(nil,'打开一个文件');
if aHandle <> 0 then
Windows.SetParent(aHandle, Form1.Handle)
end;

测试通过。只是SetParent不太好用,位置不好处理的说。
你还是找找Dock的API吧。
 
根据杜宝的方法,我做了一些修改,但是还是没有通过,主窗口会失去焦点。

procedure TForm1.OpenDialog1Show(Sender: TObject);
var
aHandle : HWND;
astyle: integer;
begin
aHandle := FindWindow(nil, '打开一个文件');
if aHandle <> 0 then
begin
astyle := getwindowlong(ahandle, GWL_STYLE);
astyle := astyle and not ws_caption and WS_CHILD and not WS_DLGFRAME and not WS_SIZEBOX and not WS_POPUPWINDOW;
setwindowlong(ahandle, gwl_style, $56000000); //style 根据 tpanel的样式读出(from spy++)
setwindowlong(ahandle, gwl_exstyle, $00010000);
movewindow(ahandle, 0, 0, 400, 300, false);
Windows.SetParent(aHandle, Handle);
end;
end;
 
应该可以做到,我用apispy看了看,
好像是又创建了一个TCustomDockForm,
只是用dialog试验了一会儿没有成功。
[:(]
 
理论上说是不行的,
因为Windows没有提供Dock的API函数。
而且Delphi中的Dock是Borland自己用代码实现的,
而OpenDialog是Windows的API,所以两者不能互通消息,
也就不能相互停靠。
 
为什么要Dock?
是不是要实现扩充?
这些对话框资源是可以扩充的,LMD的源码看看就知道了。
 
TOpenDialog 是一个模态窗口,能这样做吗?
 
应该截取窗口创建消息,在创建 TOpenDialog 时设置Perant window
 
如何截取,如何设置?
 
你想超到什么效果?是不是要改成非模态,如果不改成非模态,好象没什么意义。
 
不是摸太,也不是非摸态,我想把它改成像放在Form中的一个Panel一样。
难度肯定是有的,不过我看到过某个软件中就这样做出来了。
 

Similar threads

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