zoukankan      html  css  js  c++  java
  • MFC listctrl NMCLICK消息 错误 无法从"NMHDR*"转换为"NMITEMACTIVATE"

    http://blog.csdn.net/liufei_learning/article/details/5959669

    VC 2008 LIST CONTROL的BUG

        随着.NET平台的推出,微软的IDE越来越傻瓜化,编程的门槛越来越低。VS2003还没学会,马上就出了VS2005,一转眼现在己是VS2008当道。而对于MFC程序员来说,似乎受到了冷落,自VC6.0到现在,MFC几乎没有更新,因此很多程序员还在坚守经典的VC6.0

        我这个菜鸟程序员也跟着从VC6.0VS2005,到现在的VS2008。虽说VS2008身材臃肿,比VC6.0慢了不少,但其强大的编辑功能还是让我爱不释手,这次的主角就是VS 2008

        我用得最多的就是在VS2008下用C++编程,这两天为了赶一个项目,忙得昏天喑地。处理LIST控件的NM_DBCLIK消息应该是每个程序员都会的事情,我的处理函数如下:

        void CDlgTg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)

       {

     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);

     ...    //这里省略我的代码

     *pResult = 0;

        }

        一编译,竞然报错:

        error C2440: "reinterpret_cast":无法从"NMHDR*"转换为"NMITEMACTIVATE"

        这可不是我的代码,这是大名鼎鼎的微软给我自动生成的。由于忙了很久,头脑有点乱(归根到底还是自己太菜_:) ),百思不得其解,VS2008可是Microsoft的拳头产品,对最新C++标准支持是最好的。

        休息几分钟,再来看,终于明白。pNMHDR是一个指针,reinterpret_castNMHDR *强制转换成NMITEMACTIVATE,应该说这种这种转换在任何时候都行不通。对指针稍微了解的人都知道,其本意是想转换成NMITEMACTIVATE*, 这一下豁然开朗,其实就是少了一个字符。把代码改成:

         void CDlgTg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)

       {

     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);

     ...    //这里省略我的代码

     *pResult = 0;

        }

        顺利通过。

        后来测试了一下,NM_CLICK消息也有这样的问题。由此猜想可能处理其他通用控件消息的时候也会有这样的问题(待证实)

        到此问题顺利解决,只是不知道是我机器的问题,还是Microsoft的问题。如果Microsoft的问题,心中不免暗自得意,原来Microsoft的程序员也有粗心的时候(原来大公司的程序员也不是那么神秘...)VS2008傻爪化的功能提高效率的同时,也埋下了隐患。我们这些还在用C++的古董程序员在出现问题的时候还是不要过于依赖IDE

  • 相关阅读:
    0421 & SX2016
    HDU3948 & 回文树模板
    BZOJ 2152 & 点分治
    HDU5618 & CDQ分治
    CC countari & 分块+FFT
    ECF R9(632E) & FFT
    ECF R9(632E) & DP
    BZOJ的两道osu概率DP easy与osu
    BZOJ3197 & 组合乱搞
    转载 Rational Rose 的配置和破解
  • 原文地址:https://www.cnblogs.com/vipwtl/p/5690513.html
Copyright © 2011-2022 走看看