我发现OnDraw是从OnDrawAdvanced调用来的,
而OnDrawAdvanced是从OnPaint来的, 
然而OnDraw的参数里ATL_DRAWINFO的成员并没有保留PAINTSTRUCT里的很有用的rcPaint。我想通过修改ATL_DRAWINFO结构体来添加这个成员不知道可不可以?我试着向ATL_DRAWINFO结构添加了成员,还真的编译过去了,数据也是对的,我不理解的是我的程序设置是静态引用ATL类库,那么我修改源码这个类库也会重新编译吗。MFC的好像是不可以这样的?

解决方案 »

  1.   

    应该可以的。静态是指代码编译后link进应用程序中,修改当然会重新编译。
    MFC的不行,估计是预编译头造成的。取消预编译头,应该也能生效。
      

  2.   

    虽然理论上可以更改,但不见得有用,甚至可能出错。看样子你是在制作ActiveX控件,要注意控件可能是有窗口的,也可能是无窗口的,两种方式下你的OnDraw都会被调用,但来源不一样,有窗口控件的来源是WM_PAINT消息,有PAINTSTRUCT结构,无窗口控件是容器直接调用控件的OnDraw方法来绘制,没有PAINTSTRUCT结构,所以为了通用,控件应该使用标准接口方法来获取自身的位置和大小,通常是容器调用 IOleInPlaceObject::SetRect来设置的(接口和方法名称可能有点出入,忘了,自己查下MSDN),此时要记下这个矩形。
      

  3.   

    事实是现在修改的代码确实起作用了,那个矩形是正确的,我想如果不是能过WM_PAINT来绘制的时候那个矩形可以取整个控件的区域,这个问题倒不大,我现在很不确信的是我确实可以修改ATL代码吗?这会有什么不好的结果呢?ATL本身是设计为可以修改的吗?他们类库不是先编译好的,是和我的代码一起生成的吗?我对ATL还是正学习一级的。
      

  4.   

    官方肯定不希望任何人修改,不过按照我的理解,修改也是问题不大的,即使你的项目以动态库的方式来使用ATL(需要附带ATL.DLL),多数情况下也不会出问题,因为ATL.DLL仅仅提供一些内部接口,大部分代码还是直接编译到你的项目中了。如果项目编译选项里选择“静态链接ATL”或者“不使用ATL”,肯定没有任何问题。这点跟MFC不同,动态链接MFC的话不能修改任何MFC代码。
      

  5.   

    有道理,想想改了后,要是重装了VC岂不是还要再改一遍。
    不过个人觉得像ATL_DRAWINFO结构里还上那个刷新用的RECT不是很好吗?为什么没有加呢?
      

  6.   

    编译选项里选择“静态链接ATL”或者“不使用ATL”,问题完全解决
      

  7.   

    atl 可以修改,但是,尽量不要修改,因为不能预知修改后对以后的项目有什么影响.
    atl 修改是否生效 要看你的工程是否使用静态/动态库,如果是动态,你的修改是不能影响atl.dll的,就无效
    如果是静态,可以影响编译进你的代码里的atl 的源代码,就生效了总之就是 静态的时候,修改会编译进你的程序里,就会生效
    动态的时候,不会影响已经编译好的atl.dll,就不会生效