为什么Cmenu的按钮不能点?class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
//MessageBox("My MFC Window","CFrame constructor",MB_OK);
m_notify.cbSize=sizeof NOTIFYICONDATA;  
m_notify.hWnd=this->m_hWnd;    
m_notify.uID=IDR_MAINFRAME;  
m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  
strcpy(m_notify.szTip,"client");  
m_notify.uCallbackMessage=WM_USER_NOTIFYICON;  
m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //OK,下面就是托盘产生了.   
Shell_NotifyIcon(NIM_ADD,&m_notify); 
} LRESULT  sample::OnNotifyMsg(WPARAM wparam,LPARAM lparam)  
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为     
{  
if(wparam != IDR_MAINFRAME)     
    return 1;     
switch(lparam)     
{     
case  WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”     
{       
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint);                    // 得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();                    // 声明一个弹出式菜单
menu.AppendMenu(MF_STRING|MF_ENABLED,WM_DESTROY, "关闭");
SetForegroundWindow();
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
RBDown = 1;
//HMENU hmenu = menu.Detach();
//menu.DestroyMenu();
delete lpoint;   
}     
break;
}      
return 0;
} BOOL sample::DestroyWindow()  
{   // TODO: Add your specialized code here and/or call the base class   
// 在托盘区删除图标   
Shell_NotifyIcon(NIM_DELETE, &m_notify);
return CFrameWnd::DestroyWindow();  
} LRESULT sample::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)   
{  
    // TODO: Add your specialized code here and/or call the base class  
    switch(message) //判断消息类型  
    {   
case WM_USER_NOTIFYICON:   
        //如果是用户定义的消息
        break;   
    case WM_SYSCOMMAND:   
        //如果是系统消息  
        if(wParam==SC_CLOSE)  
        {  
            ::Shell_NotifyIcon(NIM_DELETE,&m_notify); //关闭时删除系统托盘图标  
        }  
        break;  
    }  
    return CFrameWnd::WindowProc(message, wParam, lParam);  
}   DECLARE_MESSAGE_MAP();
private:  
NOTIFYICONDATA m_notify;
int RBDown;
};BEGIN_MESSAGE_MAP(sample,CFrameWnd)
//这个宏是一个带参数的宏,填写两个参数,一个子类,一个父类
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_DESTROY()
    ON_MESSAGE(WM_USER_NOTIFYICON,OnNotifyMsg)
END_MESSAGE_MAP()//结束宏

解决方案 »

  1.   

    就是说CMenu 中也有一些消息需要实现
      

  2.   

    我实现了ONCOMMOND,但是灰色的按钮点不下去,消息发不出来。。我试了一下只有 menu.AppendMenu(MF_STRING|MF_ENABLED,0, "关闭");的时候按钮是可以点的
    menu.AppendMenu(MF_STRING|MF_ENABLED,其他数值, "关闭");的时候按钮就是灰色的
      

  3.   

    试了一下只有 menu.AppendMenu(MF_STRING|MF_ENABLED,0, "关闭");的时候按钮是可以点的.
    menu.AppendMenu(MF_STRING|MF_ENABLED,其他数值, "关闭");的时候按钮就是灰色的.各位大神这是为什么啊?
      

  4.   

    WM_DESTROY换个ID,比如:
    #define ID_POPCLOSE 3550
    menu.AppendMenu(MF_STRING|MF_ENABLED,ID_POPCLOSE, "关闭");然后
    WM_COMMAND(ID_POPCLOSE,OnPopClose)void sample::OnPopClose()
    {
     ........
    }