不好意思,又要来麻烦大家了 :P我自己写了一个类,目的是在一个子窗口中,画出一个图标,并且封装对这个图标的右键单击的处理,可是对象能够画出来,可是鼠标点击的消息怎么都收不到,不知为何。是不是发给父窗体了?我是一点都不知道啊,请指教。以下是我的源代码:class CGraphIcon:public CStatic
{
//DECLARE_DYNCREATE(CGraphIcon) //这一句也有些问题,不过可以以后讨论,它不是重点
public:
CGraphIcon(){pWnd=this->GetParent();};
CGraphIcon(UINT nIconResourceID,const CRect &rect,CWnd *parent,UINT nID):CStatic()
{
CStatic::Create("",SS_ICON,rect,parent,nID);
SetIcon(AfxGetApp()->LoadIcon(nIconResourceID));
ShowWindow(SW_SHOWNORMAL);
pWnd=parent;
pWnd->MessageBox("Constructor Paint!!!!");
};
private:
CWnd *pWnd;
~CGraphIcon(){};
protected:
//{{AFX_MSG(CGraphIcon)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnDoClick();
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()//*/
};////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GraphIcon.h"
BEGIN_MESSAGE_MAP(CGraphIcon, CWnd)
//{{AFX_MSG_MAP(CGraphIcon)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(ID_ICON,OnDoClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CGraphIcon::OnDoClick()
{
pWnd->MessageBox("You Clicked Me!!!!");
}
void CGraphIcon::OnLButtonDown(UINT nFlags, CPoint point)
{
pWnd->MessageBox("You Clicked Me!!!!");
CWnd::OnLButtonDown(nFlags, point);
MessageBox("You Clicked Me!!!!");
}
void CGraphIcon::OnPaint()
{
CPaintDC dc(this);
MessageBox("nPaint!!!!");
pWnd->MessageBox("Paint!!!!");
}

解决方案 »

  1.   

    试验证明,WM_PAINT消息可以正确处理(看来这个消息比较牛),但是BN_CLICKED就不行了,请大家帮帮忙啊,能不能实现对右键点击的响应呢?实在不行的话,用左键也可以的。谢谢大家了。
      

  2.   

    你的代码是可以实现你要求的功能的,只不过在使用这个类定义变量后,要注意与它相关联的那个static control必须要有SS_NOTIFY风格,否则BN_CLICKED是不会被传递的.
      

  3.   

    to Zark(金陵五月) :我在Create函数中,指定风格为SS_ICON|SS_NOTIFY之后,使用重载的OnLButtonDown(UINT nFlags, CPoint point)函数可以响应鼠标操作,不过已经能满足我的要求了,只是不明白为何无法使用BN_CLICKED呢?我的控件ID肯定是没错的了。//DECLARE_DYNCREATE(CGraphIcon) //这一句也有些问题,每次当我改动了头文件,重新编译的时候,它就要出错,信息如下:error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CGraphIcon::GetRuntimeClass(void)const " (?GetRuntimeClass@CGraphIcon@@UBEPAUCRuntimeClass@@XZ)
    Debug/bt.exe : fatal error LNK1120: 1 unresolved externals那个GetRuntimeClass(void)需要手动重载,写它的实现吗?我觉得不用吧。
      

  4.   

    给你看看我的完整的头文件吧:
    ////////CGraphIcon.h////////////////////
    #include <afxwin.h>
    #ifndef _GRAPHICON_H_
    #define _GRAPHICON_H_
    #define ID_ICON 109
    class CGraphIcon:public CStatic

    DECLARE_DYNCREATE(CGraphIcon)//问题好像就是这里引起的
    public:
    CGraphIcon(){pWnd=this->GetParent();};
    CGraphIcon(UINT nIconResourceID,const CRect &rect,CWnd *parent,UINT nID):CStatic()

    CStatic::Create("",SS_ICON|SS_NOTIFY,rect,parent,nID);
    SetIcon(AfxGetApp()->LoadIcon(nIconResourceID));
    ShowWindow(SW_SHOWNORMAL);
    pWnd=parent;
    pWnd->MessageBox("Constructor Paint!!!!");
    };
    private:
    CWnd *pWnd;
    ~CGraphIcon(){};
    protected:
    //{{AFX_MSG(CGraphIcon)
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnDoClick();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

    };
    #endif我是否写的不规范,而造成了如上的错误?请指点一下。谢谢了!
      

  5.   

    你的代码是手工生成的?如果你对MFC的总体架构不是十分熟悉的话.你不要用手工法生成自己的类,你会被MFC小组的天才们绕糊涂的.一般来说你不需要DECLARE_DYNCREATE(CGraphIcon),除非你想要使用CRunTimeClass带来的好处,而用你的类将被建在堆上.常规地做法:1.使用class wizard 生成一个新类CMyStatic,以CStatic为父类.
    2.使用class wizard 添加BN_CLICKED的处理程序.
    3.使用class wizard 在对话框上为那个static control加变量,使用control,并使之为CMyStatic.这样它就可以响应BN_CLICKED.再说一遍,写MFC的那么天才们认为,如果你要使用MFC,请踩着他们的脚印走,否则踩着地雷与他们无关.
      

  6.   

    好经典,看楼上的帖子有一种看《深入浅出MFC》的感觉(我目前还没有看完)。谢谢你们!吃个饭,回来结帖 :P