写了6,7年的vc程序,碰到这么一个非常古怪的有关问题(关于托盘+debug,release),请高手解答
写了6,7年的vc程序,碰到这么一个非常古怪的问题(关于托盘+debug,release),请高手解答
单文档SDI程序,关于托盘,debug,release。
在MainFrame.h中定义:
#define WM_ICONMESSAGE WM_USER+13
class CMainFrame : public CFrameWnd
{
......
//}}AFX_MSG
afx_msg void OnIconMessage(WPARAM wParam,LPARAM lParam);
afx_msg void OnIconOpen(WPARAM wParam,LPARAM lParam);
afx_msg void OnIconExit(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
HMENU m_menuIcon;
}
在MainFrame.cpp中
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
NOTIFYICONDATA nid;
nid.uID=ID_NID;
nid.cbSize=sizeof(nid);
nid.hIcon=LoadIcon(AfxGetApp()-> m_hInstance,MAKEINTRESOURCE(IDR_MAINFRAME));
nid.hWnd=m_hWnd;
nid.uCallbackMessage=WM_ICONMESSAGE;
nid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
strcpy(nid.szTip, "远程机房空调集中监控 ");
Shell_NotifyIcon(NIM_ADD,&nid);
m_menuIcon=CreatePopupMenu();
AppendMenu(m_menuIcon,0,IDM_ICON_OPEN, "打开窗口 ");
AppendMenu(m_menuIcon,0,IDM_ICON_EXIT, "退出程序 ");
}
重载
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==WM_SYSCOMMAND)
{
if(wParam==SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
return 0;
}
}
return CFrameWnd::WindowProc(message, wParam, lParam);
}
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
.......................
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ICONMESSAGE,OnIconMessage)
ON_COMMAND(IDM_ICON_OPEN,OnIconOpen)
ON_COMMAND(IDM_ICON_EXIT,OnIconExit)
END_MESSAGE_MAP()
void CMainFrame::OnIconMessage(WPARAM wParam,LPARAM lParam)
{
switch(lParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOW);
return;
case WM_RBUTTONUP:
POINT pt;
::SetActiveWindow(m_hWnd);
GetCursorPos(&pt);
TrackPopupMenu(m_menuIcon,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);
return;
}
}
void CMainFrame::OnIconOpen(WPARAM wParam,LPARAM lParam)
{
ShowWindow(SW_SHOW);
}
void CMainFrame::OnIconExit(WPARAM wParam,LPARAM lParam)
{
OnClose();
}
问题现象如下:
1.在debug模式下一切正常.
2.在release模式下:一旦托盘菜单弹出,点击任一个都会报访问内存错误,或该程序遇到问题需要关闭.即使把ShowWindow(SW_SHOW)和OnClose();这两句注释掉也一样。
急求高手释疑,不甚感激!!!!
------解决方案--------------------
老大 OnIconExit 是 ON_COMMAND包起来的呀,无参吧
ON_MESSAGE 才需要WPARAM wParam,LPARAM lParam吧
单文档SDI程序,关于托盘,debug,release。
在MainFrame.h中定义:
#define WM_ICONMESSAGE WM_USER+13
class CMainFrame : public CFrameWnd
{
......
//}}AFX_MSG
afx_msg void OnIconMessage(WPARAM wParam,LPARAM lParam);
afx_msg void OnIconOpen(WPARAM wParam,LPARAM lParam);
afx_msg void OnIconExit(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
HMENU m_menuIcon;
}
在MainFrame.cpp中
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
NOTIFYICONDATA nid;
nid.uID=ID_NID;
nid.cbSize=sizeof(nid);
nid.hIcon=LoadIcon(AfxGetApp()-> m_hInstance,MAKEINTRESOURCE(IDR_MAINFRAME));
nid.hWnd=m_hWnd;
nid.uCallbackMessage=WM_ICONMESSAGE;
nid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
strcpy(nid.szTip, "远程机房空调集中监控 ");
Shell_NotifyIcon(NIM_ADD,&nid);
m_menuIcon=CreatePopupMenu();
AppendMenu(m_menuIcon,0,IDM_ICON_OPEN, "打开窗口 ");
AppendMenu(m_menuIcon,0,IDM_ICON_EXIT, "退出程序 ");
}
重载
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==WM_SYSCOMMAND)
{
if(wParam==SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
return 0;
}
}
return CFrameWnd::WindowProc(message, wParam, lParam);
}
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
.......................
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ICONMESSAGE,OnIconMessage)
ON_COMMAND(IDM_ICON_OPEN,OnIconOpen)
ON_COMMAND(IDM_ICON_EXIT,OnIconExit)
END_MESSAGE_MAP()
void CMainFrame::OnIconMessage(WPARAM wParam,LPARAM lParam)
{
switch(lParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOW);
return;
case WM_RBUTTONUP:
POINT pt;
::SetActiveWindow(m_hWnd);
GetCursorPos(&pt);
TrackPopupMenu(m_menuIcon,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);
return;
}
}
void CMainFrame::OnIconOpen(WPARAM wParam,LPARAM lParam)
{
ShowWindow(SW_SHOW);
}
void CMainFrame::OnIconExit(WPARAM wParam,LPARAM lParam)
{
OnClose();
}
问题现象如下:
1.在debug模式下一切正常.
2.在release模式下:一旦托盘菜单弹出,点击任一个都会报访问内存错误,或该程序遇到问题需要关闭.即使把ShowWindow(SW_SHOW)和OnClose();这两句注释掉也一样。
急求高手释疑,不甚感激!!!!
------解决方案--------------------
老大 OnIconExit 是 ON_COMMAND包起来的呀,无参吧
ON_MESSAGE 才需要WPARAM wParam,LPARAM lParam吧