首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • ATL或MFC实现ActiveX某个属性怎么设置为资源中资源ID并加载? [已结贴,结贴人:abesky]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:10:49 楼主
    像标准的控件一样,在资源编辑器,自己编写的ActiveX需要加载资源中已经导入的图标,图片等资源,通过设置ActiveX的属性指定这些资源的ID然后怎么加载?
    比如说编写的ActiveX有一项属性为Image,属性设置时怎么能自动列出当前的所有图片资源ID(resource.h 中定义),供选择。
    设置好后AcitveX怎样从容纳它的窗口所在模块通过资源ID来加载设置的资源(这个是关键问题)?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:17:021楼 得分:0
    顺便问一下怎么动态的禁用某项属性?即在vs2005中编辑控件属性时,某项属性设置为只读状态?不要告诉我说用SetNotSupported();
    这个好像无效;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:40:132楼 得分:0
    加载我不清楚,但是可不可以在html中设置其属性呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:16:343楼 得分:95
    属性和方法都是静态的(idl描述的),不能动态禁用,但是在某些状态下可以忽略属性的调用,或者返回一个错误值。

    读取ax自身的资源的方法在所有DLL中都是通用的,都是通过FindResource/LockResource/SizeOfResource等标准套路完成,关键是要得到自身模块句柄用于FindResource,在ATL3.0中是通过_Module.GetResourceHandle()获取,在ATL高版本是通过_AtlBaseModule.GetResourceHandle()获取,在MFC中通过AfxGetResourceHandle()获取,如果直接用API编程,需要在DllMain的参数中保存HINSTANCE句柄
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:01:314楼 得分:0
    引用 3 楼 jameshooo 的回复:
    属性和方法都是静态的(idl描述的),不能动态禁用,但是在某些状态下可以忽略属性的调用,或者返回一个错误值。

    读取ax自身的资源的方法在所有DLL中都是通用的,都是通过FindResource/LockResource/SizeOfResource等标准套路完成,关键是要得到自身模块句柄用于FindResource,在ATL3.0中是通过_Module.GetResourceHandle()获取,在ATL高版本是通过_AtlBaseModule.GetResourceHandle()获取,在MFC中通过AfxGetResourceHandle…

    你说的我都知道,但是_Module.GetResourceHandle()和_AtlBaseModule.GetResourceHandle()以及AfxGetResourceHandle…在ActiveX中取得的
    都是ActiveX自己本身的资源句柄,而不是加载它所在模块的资源句柄!!!!所以不能并不能解决我说的问题.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:03:375楼 得分:0
    我问的是AcitveX怎样从容纳它的窗口的所在模块通过资源ID来加载设置的资源!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:23:266楼 得分:0
    呵呵,还真没看明白你的原意。从控件的IOleObject开始这样获取容器窗口所在的模块句柄
    IOleObject::GetClientSite --> IOleClientSite
    IOleClientSite::QueryInterface --> IOleInPlaceSite
    IOleInPlaceSite::GetWindow --> HWND
    GetWindowModuleFileName --> moduleFile
    GetModuleHandle(moduleFile) --> HMODULE
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:24:137楼 得分:5
    你可以让容器来设置资源DLL句柄啊
    容器中所在的模块未必有你所需要的资源的,你所需要的资源可能在卫星DLL里面
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:59:138楼 得分:0
    加载需要的句柄按jameshooo 说的找到了,那么怎么翻译资源的ID?
    比如容器中定义的一个bmp的图片资源IDB_BMP1怎么翻译为resource.h 中对应的数值映射?即把IDB_BMP1转换为resource.h定义的对应数值?
    还有编辑属性时怎么设置让其只能选择容器中某种资源,就像那个picture control 在属性中type设置为bitmap后image属性就只能选择资源中已经加载的图片资源id号了,这个怎么在activex控件中实现?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 20:21:239楼 得分:0
    只要包含了容器工程中的resource.h就能直接使用IDB_BMP1,比如FindResource(hMod, MAKEINTRESOURCE(IDB_BMP1), RT_BITMAP),或者LoadImage。如果没有这个头文件就直接使用宏对应的数值,比如MAKEINTRESOURCE(234)。资源ID都是2字节的整数,用宏和数字是等效的。

    如果某个属性的取值影响其它属性的选择,可以自己在属性窗口中控制,不能什么都指望组件来完成
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 21:10:1110楼 得分:0
    容器工程中的resource.h在控件中肯定事没有办法包含的,而且为了使控件更趋近与普通的控件,才想让控件的属性设置容器资源时采取resource.h中定义的值
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved