#define AFTER_DRAW_TOPLEFT WM_USER+100struct NMTOPLEFT_DRAW: public NMHDR {
CRect rect;
CDC* pDC;
};class A: public CDialog
{
afx_msg void OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes );
}BEGIN_MESSAGE_MAP(A, CDialog)
//{{AFX_MSG_MAP(COptionDlg)
//}}AFX_MSG_MAP
ON_NOTIFY(AFTER_DRAW_TOPLEFT, IDC_STATIC_CHART,OnAfterDrawTopLeft)
END_MESSAGE_MAP()error C2440: “static_cast” : 无法从“void (__thiscall A::* )(NMSQUARE *,LRESULT *)”转换为“void (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”
        在匹配目标类型的范围内没有具有该名称的函数,大家帮我分析分析,结构的继承在.NET下是没有问题的!事例如下:
#pragma once
#include <iostream>
using namespace std;
struct AA
{
int a;
int b;
};
class father
{
public:
father(void);
~father(void); void SetFather(){cout<<"This is father!"<<endl;}
};
#pragma once
#include "father.h"
struct BB :public AA
{
int c;
};
class ezi :
public father
{
public:
ezi(void);
~ezi(void);
};
#pragma once
#include "father.h"
class Test
{
public:
Test(void);
~Test(void);
void SetFa(father *ms){ms->SetFather();}
void SetStruct(AA *sd){cout<<"this is sdfsf!"<<endl;}
};
#include "stdafx.h"
#include "Test.h"
#include "ezi.h"
int _tmain(int argc, _TCHAR* argv[])
{
ezi m_ezi;
Test m_test;
BB S;
m_test.SetFa(&m_ezi);
m_test.SetStruct(&S);
getchar();
return 0;
}
正常运行!问题可能出在static_cast<>()类型转换这里!但是我还是不能解决……

解决方案 »

  1.   

    OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes )
    改成OnAfterDrawTopLeft ( NMHDR * nminfo, LRESULT* pRes )
      

  2.   

    如果修改了,就会失去我的本意了呀!在OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes )中的NMTOPLEFT_DRAW比NMHDR 多两个成员,而在afx_msg void OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes )中我要使用那两个成员来完成一定的操作,有没有其他办法??
      

  3.   

    同一楼 
    在OnAfterDrawTopLeft 函数体内,将NMHDR* 再转化成NMTOPLEFT_DRAW*但是你程序发送消息的时候要用NMTOPLEFT_DRAW*
      

  4.   

    这是一个解决办法,但是有没有不用改变OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes )而在ON_NOTIFY(AFTER_DRAW_TOPLEFT, IDC_STATIC_CHART,OnAfterDrawTopLeft)中修改的办法呢?这样就可以吸收点知识哦!我曾经试着强行转换但是都以失败告终,例如ON_NOTIFY(AFTER_DRAW_TOPLEFT, IDC_STATIC_CHART,static_cast<void (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)>(OnAfterDrawTopLeft))还有ON_NOTIFY(AFTER_DRAW_TOPLEFT, IDC_STATIC_CHART,static_cast<void (__thiscall A::* )(NMHDR *,LRESULT *)>(OnAfterDrawTopLeft))
      

  5.   

    afx_msg void OnAfterDrawTopLeft
    ->
    afx_msg LRESULT OnAfterDrawTopLeft
      

  6.   

    蒋……那样好象是行不同的,#define ON_NOTIFY(wNotifyCode, id, memberFxn) \
    { WM_NOTIFY, (WORD)(int)wNotifyCode, (WORD)id, (WORD)id, AfxSigNotify_v, \
    (AFX_PMSG) \
    (static_cast< void (AFX_MSG_CALL CCmdTarget::*)(NMHDR*, LRESULT*) > \
    (memberFxn)) },返回值为VOID哦!如果改为LRESULT ,typedef LONG_PTR            LRESULT;会报错的哦……
      

  7.   

    一楼的强!! 学习..要是是dynamic_cast 就好了.
      

  8.   

    4楼:在OnAfterDrawTopLeft 函数体内,将NMHDR* 再转化成NMTOPLEFT_DRAW*但是你程序发送消息的时候要用NMTOPLEFT_DRAW*这样会丢失部分数据的,因为在向函数传数据时传的是NMTOPLEFT_DRAW*,而在函数体内要将NMHDR转化为NMTOPLEFT_DRAW,我试了试,丢数据了哦……不是合理的解决方法哦……
      

  9.   

    不会丢失的,请确保NMTOPLEFT_DRAW*是NMTOPLEFT_DRAW对象的指针,否则以假乱真可不对
      

  10.   

    1.afx_msg void OnAfterDrawTopLeft ( NMTOPLEFT_DRAW* nminfo, LRESULT* pRes );
    =>
    afx_msg void OnAfterDrawTopLeft ( NMHDR  nminfo, LRESULT* pRes );2.需要在类的定义中写上DECLARE_MESSAGE_MAP
      

  11.   

    Sorry:
    afx_msg void OnAfterDrawTopLeft ( NMHDR  nminfo, LRESULT* pRes );
    =>
    afx_msg void OnAfterDrawTopLeft ( LPNMHDR  nminfo, LRESULT* pRes );