如何禁用ActiveX控件中的功能 ( 积分: 300 )

  • 主题发起人 主题发起人 neural1208
  • 开始时间 开始时间
N

neural1208

Unregistered / Unconfirmed
GUEST, unregistred user!
我手头有一个图像ocx控件,想用它实现对特殊图像格式DWG的预览功能,所以就将该ocx导入放在Form上。但是由于该图像ocx控件提供了大量的功能,比如打印,保存,等等,用户只需要在控件上点击鼠标右键就可以调出一个菜单(ocx控件没有提供函数禁止该菜单)并调用相应的功能,而我的应用程序不希望提供这些功能,所以想请教大家有什么方法可以将ocx提供的的功能禁用。

我想了三种方法,都不太好:
1. 因为只需要预览功能,所以就想在ocx上面放一个透明的控件,这样用户只能看到ocx控件的内容,而无法调用其功能。但是我试了Raize提供的透明Panel控件,结果放在ocx控件上面,运行时ocx控件的内容无法显示。
2. 拦截ocx控件的所有消息,但是不知道怎么做。
3. 将ocx控件隐藏起来,然后将ocx控件窗口的图像用截图的方法截下来,显示在一个Image控件里面。但是这个方法也不知道怎么实现。
 
我手头有一个图像ocx控件,想用它实现对特殊图像格式DWG的预览功能,所以就将该ocx导入放在Form上。但是由于该图像ocx控件提供了大量的功能,比如打印,保存,等等,用户只需要在控件上点击鼠标右键就可以调出一个菜单(ocx控件没有提供函数禁止该菜单)并调用相应的功能,而我的应用程序不希望提供这些功能,所以想请教大家有什么方法可以将ocx提供的的功能禁用。

我想了三种方法,都不太好:
1. 因为只需要预览功能,所以就想在ocx上面放一个透明的控件,这样用户只能看到ocx控件的内容,而无法调用其功能。但是我试了Raize提供的透明Panel控件,结果放在ocx控件上面,运行时ocx控件的内容无法显示。
2. 拦截ocx控件的所有消息,但是不知道怎么做。
3. 将ocx控件隐藏起来,然后将ocx控件窗口的图像用截图的方法截下来,显示在一个Image控件里面。但是这个方法也不知道怎么实现。
 
看看控件是不是有个OnContextPopup事件,有就好办了,在里面加一句Handled := true;就可以禁止右键菜单了,没有的话要比较麻烦了。
 
to jennykiller:

那个ocx控件没有提供OnContextPopup事件啊
 
neural1208,
如果“ocx控件没有提供函数禁止该菜单”,这种情况首先是建议你考虑换用别的控件。
如果确实没得换,那就不防采用下面的变通办法试试:
在你的图像预览页面中设置onLoad事件,例如
<body onLoad=&quot;alert('关闭图像预览');location='about:blank'&quot;>
这样用户一打开这个页面,在看到页面内容的同时就会收到alert消息。在关闭alert消息之前页面是不可操作的,而关闭alert消息之后页面就立即离开了。
这个办法虽然有点偷机取巧,但致少是可以达到你所要的效果的。
 
to younghat:

多谢你给出的方法,不过我的ActiveX是嵌入在程序的Form中的,不是放在HTML页面上的。不知道如何解决呢?
 
看看有源码~~改源码
 
Enabled := False
 
在Form中应该很容易控制吧。
你可以把它放在一个panel上,然后设置panel的Enabled为false,这样该panel上的任何东东都是只读的了。
如果你把Form的Enabled设置为false,那么整个Form都是只读的了。
 
如果只是想提供對DWG的预览,就沒有必要一定要用你的那個OCX吧。我知道有一個DWGTHUMBNAIL.OCX可以在網頁中预览DWG的。你只需要把這個OCX嵌進去就好了。使用也是很簡單的。
 
我在form中放个 flash.ocx控年播放flash,flash总是弹出它的菜单,想要屏蔽flash 弹出的菜单,我用Application.OnMessage,效果还可以。

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG
var Handled: Boolean);
var
FileIndex : integer;
cname: string;
TS: Tstrings;
begin
if Msg.message = WM_RBUTTONDOWN then
begin
popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
//自定的菜单
Handled := True;
end
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage := ApplicationEvents1Message;
end;
 
如果OCX是 IN_PROCESS Com对象,拦截消息的方式是可以。
 
把ACTIVEX FORM 的ENABLE设为false,比较流氓的做法
[:)][:)][:)]
 
如果是显示DWG可以用可以到voloview 控件,它可以作为浏览工具,也不会出现你说的问题了

至于右键菜单,方法很多
http://www.delphibbs.com/delphibbs/dispq.asp?lid=737725

呵呵~~前些天刚碰到以上问题,幸好都解决了

一、屏蔽flash控件的右键菜单
方法1:拦截系统消息
在form上添加一个Application Events控件,然后在其OnMessage事件中输入一下代码:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = WM_RBUTTONDOWN then
begin
//如果去掉下面这行就是屏蔽右键菜单,现在为自定义右键菜单
popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
Handled := True;
end;
end;

方法2:拦截flash控件的右键消息,代码如下:
type
TMyFlash = class(TShockwaveFlash)
public
procedure TWMRBUTTONDOWN(var msg:TMsg)
message WM_RBUTTONDOWN;
end;

procedure TMyFlash.TWMRBUTTONDOWN(var msg:TMsg)

var
P:Tpoint;
begin
if popupmenu<>nil then //加入自己的事件
begin
GetCursorPos(p)
//获得当前鼠标位置
popupmenu.Popup(p.x,p.y)
//弹出菜单
end;
end;

二、flash控件缩放时的问题
解决办法是先让其它控件获得焦点,然后再让flash控件获得焦点,下面是示例代码:
procedure TForm1.FormResize(Sender: TObject)

begin
if flash1.playing=true then
begin
panel1.SetFocus ;
flash1.SetFocus ;
end;
end;
 
题目和内容怎么不一样?
 
后退
顶部