很可能你的鼠标消息就没有发送到这个CWND的派生类中。

解决方案 »

  1.   

    如果有多个类处理ID_DOUBLESTART消息的话,那么只有一个处理被调用.
      

  2.   

    对。MFC的消息处理的类(比如App、Frame、View、Doc等),这其中有先后顺序之分的。
      

  3.   

    在CDialog的派生类里就可以  
    为什么在CWnd的派生类里就不行 
    这两个我是分开单独试的
    是第个不行我才在第一个里面试的
      

  4.   

    #pragma once
    #include "Tetris.h"
    #define BRIGHTBORDER RGB(0,204,204)
    #define DARKBORDER RGB(0,153,153)
    #define WHITE RGB(255,255,255)
    #define BLACK RGB(0,0,0)
    #define MaxX 814
    #define MaxY 491// BlockBoardclass BlockBoard : public CWnd
    {
    DECLARE_DYNAMIC(BlockBoard)public:
    BlockBoard();
    virtual ~BlockBoard();
    bool Create(RECT &rect, CWnd *pParentWnd, UINT nID);
    protected:
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnDoublestart();
    afx_msg void OnPaint();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    DECLARE_MESSAGE_MAP()
    private:
    void Draw3dBorder(LPRECT lpRect,int nWidth,COLORREF clrTopLeft,COLORREF clrBottomRight,bool nFlag);
    CDC* m_pMemDC;
    CDC* m_pTempDC;
    CBitmap* m_pBitmap;
    CBitmap* m_pbmpBlock;
    CBitmap* m_pbmpNumber;
    CBitmap* m_pbmpGameBg;
    CBitmap* m_pbmpNextBg;
    CBrush* m_pbruGameBg;
    CBrush* m_pbruNextBg;
    CTetris m_Tetris;
    public:
    afx_msg void OnSinglestart();
    afx_msg void OnExit();
    };
      

  5.   

    这是cpp里面的IMPLEMENT_DYNAMIC(BlockBoard, CWnd)
    BEGIN_MESSAGE_MAP(BlockBoard, CWnd)
    ON_WM_PAINT()
    ON_WM_CREATE()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    ON_COMMAND(ID_DOUBLESTART, OnDoublestart)
    // ON_UPDATE_COMMAND_UI(ID_DOUBLESTART, OnUpdateDoublestart)
    ON_COMMAND(ID_SINGLESTART, OnSinglestart)
    ON_COMMAND(ID_EXIT, OnExit)
    END_MESSAGE_MAP()
      

  6.   

    CWnd是不是不相应这样的消息?我也不太清楚,相互学习.
      

  7.   

    CWnd 不能直接响应menus, toolbar buttons, and accelerator keys产生的消息,这种消息称为Command messages ,Command messages 在MFC应用程序框架下这类消息只能被Command Targets接收到,比如MDI frame window 、Document frame window 、View、Document、Dialog box这些对象。如果要将Command messages发送到CWnd对象,可以这样试试,首先在上述的Command Targets对象中处理Command messages,然后在此消息的处理中向目标CWnd发送消息,这样间接就可以让CWnd接收到消息了。
    比如你的程序中  afx_msg void OnSinglestart()消息函数应该在放在MDI frame window 或者Dialog box 中,然后在此次消息函数中调用SendMessage(hwnd,msg,wParam,lParam),不知道我说清楚了没有?
        
      

  8.   

    谢谢 savage5000(野人)
    我试试
      

  9.   

    为什么CWnd不能响应Command messages
      

  10.   

    这是MFC应用程序框架决定的。command message是比较特殊的一种消息,它主要是通过用户点击菜单、工具按钮而成产生的,它并不知道这个消息要发送到何处,所以MS制订一套此类消息传送的机制,那就是先发送到MDI main frame 然后是MDI child frame,接下来是view ,再到Document,如果消息在上述的对象中没有相应的消息映射,那么消息就返回CWinApp,消息发送到此结束。对于一般的Cwnd 尤其是自定义的派生类是接受不到这种消息的,当然就不会有响应了。
      

  11.   

    可是既然不能响应
    为什么又有添加command消息响应的地方呢
    我是在属性栏的事件里添加的
    并不是我自己手工加的
    难道是vc.net的bug?
      

  12.   

    这是一个CWnd的继承类
    用来在dialog里面画图
    我把它注了册
    而且绘图一切正常
    就是不能响应command消息
    其它的消息都能响应