2024年4月7日发(作者:)
Windows Media Player控件研究
我的那个定时提醒程序中要用到它,初步使用问题已解决。基本使用步骤如下:
一、往控件箱中添加此控件:
二、往窗体上拖控件
三、=XXXX;()即可。
平常应用就这三步就OK了。但是,我想写个播放器的话,就遇到了一些问题。
在dotnet中使用非基于dotnet的控件,需要做一些额外的事,不过这些事vs
已经帮我们做好了,当我们拖了此控件进窗体时,vs会自动调用 ,
用它根据原有的dll或ocx生成一个用AxHost类包装的新的一组程序集(更为精
确的描述见msdn),于是根据 生成两个文件:
、。这两个文件中包含了转化后的
类。 包装后的控件继承自。
这是第一个问题,控件怎么使用呢?如果是拖控件,很简单,无论如何都能有效
的使用。但是,如果手工new创建控件的实例呢?那就不一定了。
我做过种种实验,获得如下的结论:
在非可视化类中无法创建有UI的控件的实例,或者是在没有把实例加入到一个
可视化的容器中时。
我实验了下面的代码:
owsMediaPlayer
owsMediaPlayer();
(wmp);
wmp = new
= "约定.mp3";
();
这几行代码不一定能运行。发现,如果这几行代码写在窗体的构造函数中,哪怕
show出来都不能运行,只有写在Load或Load之后的事件中,并且把窗 体
show出来才有运行,否则会抛出一个错误:引发类型为
“+InvalidActiveXStateException”的异
常。网上有些人也遇到这个 问题,其实都没有谈到点子上。甚为遗憾。
是不是不show就一定不能运行呢?我拖了个播放器控件放窗体上,在
InitializeComponent后面写了行play的代码,能运行。可见,这中间有蹊跷
啊。我比较了上面的代码跟拖上去生成的代码,有两点不同:
一、拖控件生成的代码为多一对
((rtInitialize)(1)).BeginInit()/En
dInit()
二、拖的控件多了一行:te =
(()
(ect("te")));我查了MSDN,ocxstate是控件
状态。用于持久化控件的状态 的。com组件的状态信息被写在对应窗体的资源
文件中,用记事本打开窗体资源文件就可以看到。在手工创建中,这个ocxstate
是没法赋值的。
我试了加入BeginInit、EndInit,没用,可见问题是出在控件状态问题上。没有
办法了。
发布评论