none
CListCtrl的自绘与CommonControl的版本问题 RRS feed

  • 问题


  • 我们的产品使用VC6.0开发,由MFC的CListCtrl类派生出一个新的类,在主界面上自绘了一个文件列表,该文件列表包括缩略图、详表等显示方式,不同显示方式之间可以来回切换。

    说明:
    我们引入了CommonControl_6.0,将程序界面上的所有控件都改为XP风格,而引入CommonControl_6.0后,我们自绘的这个CListCtrl的使用就存在问题了。
    问题:
    1、【显示方式为缩略图】
            用鼠标框选文件时,若鼠标按下时的那个点是在项与项之间的间隙,那么间隙前面的那一项就被选中,处于可拖动状态,而无法产生鼠标选框,导致不能实现拖选。
            我们的自绘中,对每项的位置有自己的计算方式,当鼠标点在间隙时,我们认为它没有点中任何一项,故,取消所有选中状态后,调用基类CListCtrl自带的OnLButtonDown(),交由其处理。但CListCtrl::OnLButtonDown()中依然认为这个点的位置处于前面那项所在的区域,于是引起了这个问题。
     删除对CommonControl_6.0的引入,就不存在这个问题了,而似乎也没有办法能够让程度中只有这一个控件不用CommonControl_6.0,所以,不如如何处理。
     或者我们在自绘之后,如何让基类CListCtrl也能知道我们自绘的每项的区域?这个CommonControl_6.0的BUG吗?还是我们没有找到更好的处理方法?
     若将这一系列的处理都自己来实现的话,要考虑的东西太多,根本做不到MFC控件本身那么周全,我曾尝试过,但太过复杂,写了三天,最终还是放弃了。
    2、【显示方式为详表】
     与上述问题相关。用鼠标框选文件时,若鼠标按下时的那个点在最后一列的右侧,即,空白处,则XP下可正常框选,而WIN7和WIN8下却会被认为是选中了那个点的左边与之对应的那一项,无法实现框选。
    我了解到VC6.0和WIN7不是完全的兼容,且由VC6.0编写的程序无法使用WIN7的风格,不晓得这是不是就是这个问题的原因。如果这样的话,是不是就没有办法?而如果不是这样的话,又是为什么呢?

    这个问题困扰了很久,希望能在这里找到答案,真心地谢谢大家。

    2013年5月7日 6:27

答案

  • 谢谢你的回复,迁移至高版本VS肯定是可以解决这个问题的,但问题是我们AP的开发已有10多年了,代码已超过300万行,整体迁移至高版本不太可能。
    2013年5月15日 3:17

全部回复

  • 顶。

    有试过迁移高版本的vs吗?


    Reply, then visible.

    2013年5月8日 9:32
  • 谢谢你的回复,迁移至高版本VS肯定是可以解决这个问题的,但问题是我们AP的开发已有10多年了,代码已超过300万行,整体迁移至高版本不太可能。
    2013年5月15日 3:17
  • 谢谢你的回复,迁移至高版本VS肯定是可以解决这个问题的,但问题是我们AP的开发已有10多年了,代码已超过300万行,整体迁移至高版本不太可能。
    2013年5月15日 3:18