ATL源码可以修改吗?

北京的雾霾天 2010-04-28 11:48:24
我发现OnDraw是从OnDrawAdvanced调用来的,
而OnDrawAdvanced是从OnPaint来的,
然而OnDraw的参数里ATL_DRAWINFO的成员并没有保留PAINTSTRUCT里的很有用的rcPaint。我想通过修改ATL_DRAWINFO结构体来添加这个成员不知道可不可以?

我试着向ATL_DRAWINFO结构添加了成员,还真的编译过去了,数据也是对的,我不理解的是我的程序设置是静态引用ATL类库,那么我修改源码这个类库也会重新编译吗。MFC的好像是不可以这样的?
...全文
141 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgzwiz 2010-04-29
应该可以的。静态是指代码编译后link进应用程序中,修改当然会重新编译。
MFC的不行,估计是预编译头造成的。取消预编译头,应该也能生效。
回复
向立天 2010-04-29
[Quote=引用 7 楼 hbxtlhx 的回复:]
有道理,想想改了后,要是重装了VC岂不是还要再改一遍。
不过个人觉得像ATL_DRAWINFO结构里还上那个刷新用的RECT不是很好吗?为什么没有加呢?
[/Quote]

什么东西都不是完美的
而且总是要不断发展的么
回复
visualassist4680 2010-04-29
atl 可以修改,但是,尽量不要修改,因为不能预知修改后对以后的项目有什么影响.
atl 修改是否生效 要看你的工程是否使用静态/动态库,如果是动态,你的修改是不能影响atl.dll的,就无效
如果是静态,可以影响编译进你的代码里的atl 的源代码,就生效了

总之就是 静态的时候,修改会编译进你的程序里,就会生效
动态的时候,不会影响已经编译好的atl.dll,就不会生效
回复
尹成 2010-04-29
编译选项里选择“静态链接ATL”或者“不使用ATL”,问题完全解决
回复
有道理,想想改了后,要是重装了VC岂不是还要再改一遍。
不过个人觉得像ATL_DRAWINFO结构里还上那个刷新用的RECT不是很好吗?为什么没有加呢?
回复
向立天 2010-04-29
我觉得还是不要去改吧
最好还是通过自己办法处理
这样虽然有限制
但其实可控性更好一些
回复
jameshooo 2010-04-29
官方肯定不希望任何人修改,不过按照我的理解,修改也是问题不大的,即使你的项目以动态库的方式来使用ATL(需要附带ATL.DLL),多数情况下也不会出问题,因为ATL.DLL仅仅提供一些内部接口,大部分代码还是直接编译到你的项目中了。如果项目编译选项里选择“静态链接ATL”或者“不使用ATL”,肯定没有任何问题。这点跟MFC不同,动态链接MFC的话不能修改任何MFC代码。
回复
WaistCoat10 2010-04-29
你可以改,但不建议这么做。

你可以把你要改的内容单独拿出来改个名字这样比较好。
回复
事实是现在修改的代码确实起作用了,那个矩形是正确的,我想如果不是能过WM_PAINT来绘制的时候那个矩形可以取整个控件的区域,这个问题倒不大,我现在很不确信的是我确实可以修改ATL代码吗?这会有什么不好的结果呢?ATL本身是设计为可以修改的吗?他们类库不是先编译好的,是和我的代码一起生成的吗?我对ATL还是正学习一级的。
回复
jameshooo 2010-04-29
虽然理论上可以更改,但不见得有用,甚至可能出错。

看样子你是在制作ActiveX控件,要注意控件可能是有窗口的,也可能是无窗口的,两种方式下你的OnDraw都会被调用,但来源不一样,有窗口控件的来源是WM_PAINT消息,有PAINTSTRUCT结构,无窗口控件是容器直接调用控件的OnDraw方法来绘制,没有PAINTSTRUCT结构,所以为了通用,控件应该使用标准接口方法来获取自身的位置和大小,通常是容器调用 IOleInPlaceObject::SetRect来设置的(接口和方法名称可能有点出入,忘了,自己查下MSDN),此时要记下这个矩形。
回复
发动态
发帖子
ATL
创建于2007-09-28

3207

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
社区公告
暂无公告