像标准的控件一样,在资源编辑器,自己编写的ActiveX需要加载资源中已经导入的图标,图片等资源,通过设置ActiveX的属性指定这些资源的ID然后怎么加载?
比如说编写的ActiveX有一项属性为Image,属性设置时怎么能自动列出当前的所有图片资源ID(resource.h 中定义),供选择。
设置好后AcitveX怎样从容纳它的窗口所在模块通过资源ID来加载设置的资源(这个是关键问题)? 

解决方案 »

  1.   

    顺便问一下怎么动态的禁用某项属性?即在vs2005中编辑控件属性时,某项属性设置为只读状态?不要告诉我说用SetNotSupported();
    这个好像无效;
      

  2.   

    加载我不清楚,但是可不可以在html中设置其属性呢
      

  3.   

    属性和方法都是静态的(idl描述的),不能动态禁用,但是在某些状态下可以忽略属性的调用,或者返回一个错误值。读取ax自身的资源的方法在所有DLL中都是通用的,都是通过FindResource/LockResource/SizeOfResource等标准套路完成,关键是要得到自身模块句柄用于FindResource,在ATL3.0中是通过_Module.GetResourceHandle()获取,在ATL高版本是通过_AtlBaseModule.GetResourceHandle()获取,在MFC中通过AfxGetResourceHandle()获取,如果直接用API编程,需要在DllMain的参数中保存HINSTANCE句柄
      

  4.   

    你说的我都知道,但是_Module.GetResourceHandle()和_AtlBaseModule.GetResourceHandle()以及AfxGetResourceHandle…在ActiveX中取得的
    都是ActiveX自己本身的资源句柄,而不是加载它所在模块的资源句柄!!!!所以不能并不能解决我说的问题.
      

  5.   

    我问的是AcitveX怎样从容纳它的窗口的所在模块通过资源ID来加载设置的资源!
      

  6.   

    呵呵,还真没看明白你的原意。从控件的IOleObject开始这样获取容器窗口所在的模块句柄
    IOleObject::GetClientSite --> IOleClientSite
    IOleClientSite::QueryInterface --> IOleInPlaceSite
    IOleInPlaceSite::GetWindow --> HWND
    GetWindowModuleFileName --> moduleFile
    GetModuleHandle(moduleFile) --> HMODULE
      

  7.   

    你可以让容器来设置资源DLL句柄啊
    容器中所在的模块未必有你所需要的资源的,你所需要的资源可能在卫星DLL里面
      

  8.   

    加载需要的句柄按jameshooo 说的找到了,那么怎么翻译资源的ID?
    比如容器中定义的一个bmp的图片资源IDB_BMP1怎么翻译为resource.h 中对应的数值映射?即把IDB_BMP1转换为resource.h定义的对应数值?
    还有编辑属性时怎么设置让其只能选择容器中某种资源,就像那个picture control 在属性中type设置为bitmap后image属性就只能选择资源中已经加载的图片资源id号了,这个怎么在activex控件中实现?
      

  9.   

    只要包含了容器工程中的resource.h就能直接使用IDB_BMP1,比如FindResource(hMod, MAKEINTRESOURCE(IDB_BMP1), RT_BITMAP),或者LoadImage。如果没有这个头文件就直接使用宏对应的数值,比如MAKEINTRESOURCE(234)。资源ID都是2字节的整数,用宏和数字是等效的。如果某个属性的取值影响其它属性的选择,可以自己在属性窗口中控制,不能什么都指望组件来完成
      

  10.   

    容器工程中的resource.h在控件中肯定事没有办法包含的,而且为了使控件更趋近与普通的控件,才想让控件的属性设置容器资源时采取resource.h中定义的值