怎样取消一个弹出式菜单
我有一个应用程序不显示窗口(建立窗口时使用了SW_HIDE参数),它只在任务条显示一个图标,我是这样做的:
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = 1;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = AfxGetApp()->LoadIcon( IDI_ICON1 );
lstrcpyn(tnid.szTip, "Giroimag Image Mail Exchange", strlen("Giroimag Image Mail Exchange")+1);
Shell_NotifyIcon(NIM_ADD, &tnid);
当我点击任务条时,程序会显示一个弹出菜单:
CMenu m_Menu;
m_Menu.CreatePopupMenu();
m_Menu.AppendMenu( MF_STRING, IDM_ABOUT, "Op&1" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_CONFIG, "Op&2" );
m_Menu.AppendMenu( MF_STRING, IDM_STATUS, ""Op&3" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_SEND, "Op&4" );
m_Menu.AppendMenu( MF_STRING, IDM_RECEIVE, "Op&5" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_CLOSE, "Op&6" );
POINT p;
GetCursorPos( & p );
m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
到这为止,程序运行很正常,问题在于如果我不选择任何菜单该怎样取消它?我以为按ESC或者在菜单外面点击就可以取消,但事实并不是这样。我也试过用WIN32API中的TrackPopupMenuEx函数但没有用,到底我该怎么做?
1)最简单的方法在消息映象中加"Cancel Menu"命令即可。
2)尽管你的主窗口不可见,但在你可以在调用m_Menu.TrackPopupMenu();时将其置为最前。
3)在你弹出菜单之前,设置你的窗口为最前窗口,调用下面的代码,问题就会迎刃而解。
POINT p;
GetCursorPos( & p );
// Increase the thread priority by invoking SetForegroundWindow.
SetForegroundWindow();
m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
4)调用TrackPopupMenu()之前,你必须先调用SetForegroundWindow( m_hWnd ),然后调用PostMessage( m_hWnd, WM_NULL, 0, 0 ):
POINT point;
GetCursorPos( &point );
SetForegroundWindow( m_hWnd );
TrackPopupMenu( hPopup,
TPM_RIGHTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x,
point.y,
0,
m_hWnd, 0 );
PostMessage( m_hWnd, WM_NULL, 0, 0 );
我有一个应用程序不显示窗口(建立窗口时使用了SW_HIDE参数),它只在任务条显示一个图标,我是这样做的:
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = 1;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = AfxGetApp()->LoadIcon( IDI_ICON1 );
lstrcpyn(tnid.szTip, "Giroimag Image Mail Exchange", strlen("Giroimag Image Mail Exchange")+1);
Shell_NotifyIcon(NIM_ADD, &tnid);
当我点击任务条时,程序会显示一个弹出菜单:
CMenu m_Menu;
m_Menu.CreatePopupMenu();
m_Menu.AppendMenu( MF_STRING, IDM_ABOUT, "Op&1" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_CONFIG, "Op&2" );
m_Menu.AppendMenu( MF_STRING, IDM_STATUS, ""Op&3" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_SEND, "Op&4" );
m_Menu.AppendMenu( MF_STRING, IDM_RECEIVE, "Op&5" );
m_Menu.AppendMenu( MF_SEPARATOR, 0 );
m_Menu.AppendMenu( MF_STRING, IDM_CLOSE, "Op&6" );
POINT p;
GetCursorPos( & p );
m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
到这为止,程序运行很正常,问题在于如果我不选择任何菜单该怎样取消它?我以为按ESC或者在菜单外面点击就可以取消,但事实并不是这样。我也试过用WIN32API中的TrackPopupMenuEx函数但没有用,到底我该怎么做?
1)最简单的方法在消息映象中加"Cancel Menu"命令即可。
2)尽管你的主窗口不可见,但在你可以在调用m_Menu.TrackPopupMenu();时将其置为最前。
3)在你弹出菜单之前,设置你的窗口为最前窗口,调用下面的代码,问题就会迎刃而解。
POINT p;
GetCursorPos( & p );
// Increase the thread priority by invoking SetForegroundWindow.
SetForegroundWindow();
m_Menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this );
4)调用TrackPopupMenu()之前,你必须先调用SetForegroundWindow( m_hWnd ),然后调用PostMessage( m_hWnd, WM_NULL, 0, 0 ):
POINT point;
GetCursorPos( &point );
SetForegroundWindow( m_hWnd );
TrackPopupMenu( hPopup,
TPM_RIGHTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x,
point.y,
0,
m_hWnd, 0 );
PostMessage( m_hWnd, WM_NULL, 0, 0 );
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货