CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED);
Пункт меню.
Для обработки этого пункта меню есть функция MyTestDlg::OnStart(). В MSDN предлагают так:
Код:
Если вставить этот кусок в функцию, то программа падает. Как правильно этот кусок интегрировать в функцию?
2.Добавляешь переменную в класс диалога CMenu menu;
3.В ф-ии OnInitDialog пишешь
Код:
...
menu.LoadMenuA(IDR_MENU1);
SetMenu(&menu);
DrawMenuBar();
...
menu.LoadMenuA(IDR_MENU1);
SetMenu(&menu);
DrawMenuBar();
...
Загрузили меню.Дальше в обработчике пункта меню пишешь
Код:
void Cимя_диалога::OnStart()
{
// TODO: Add your command handler code here
MessageBox("adasdad");
menu.EnableMenuItem(ID_FILE_ONSTART, MF_BYCOMMAND | MF_DISABLED);
}
{
// TODO: Add your command handler code here
MessageBox("adasdad");
menu.EnableMenuItem(ID_FILE_ONSTART, MF_BYCOMMAND | MF_DISABLED);
}
Для того,чтобы проверить деактивирован ли пункт меню я поставил MessageBox.Нажимаешь на кнопку меню,появляется MessageBox,а потом
все,сколько не нажимай MessageBox непоявится.Если закоментируешь
эту строчку
Код:
...menu.EnableMenuItem(ID_FILE_ONSTART, MF_BYCOMMAND | MF_DISABLED);
...
...
MessageBox будет появляться при каждом выборе этого пункта меню.
А как то же самое делается для приложений типа Document?
Код:
BEGIN_MESSAGE_MAP(CMy3Dlg, CDialog)
//{{AFX_MSG_MAP(CMy3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE ( WM_TRAYNOTIFY, OnTrayNotify )
ON_WM_WINDOWPOSCHANGING()
ON_COMMAND(ID_APP_OPTIONS, OnAppStart)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//{{AFX_MSG_MAP(CMy3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE ( WM_TRAYNOTIFY, OnTrayNotify )
ON_WM_WINDOWPOSCHANGING()
ON_COMMAND(ID_APP_OPTIONS, OnAppStart)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
У меня появляется в иконке в System Tray. Загрузка меню осуществляется в OnTrayNotify(), а не в OnInitDialog():
Код:
LRESULT CMy3Dlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
//Return quickly if its not for this tray icon
if (wParam != nid.uID) return 0L;
CWnd *pTargetWnd = AfxGetMainWnd();
if (!pTargetWnd) return 0L;
if (LOWORD (lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(IDR_POPUP_MENU)) return 0;
SetMenu(&menu);
DrawMenuBar();
pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu) return 0;
// Make chosen menu item the default (bold font)
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
// Display and track the popup menu
CPoint pos;
GetCursorPos(&pos);
pTargetWnd->SetForegroundWindow();
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
pTargetWnd->GetSafeHwnd(), NULL);
pTargetWnd->PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
}
return 1;
}
{
//Return quickly if its not for this tray icon
if (wParam != nid.uID) return 0L;
CWnd *pTargetWnd = AfxGetMainWnd();
if (!pTargetWnd) return 0L;
if (LOWORD (lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(IDR_POPUP_MENU)) return 0;
SetMenu(&menu);
DrawMenuBar();
pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu) return 0;
// Make chosen menu item the default (bold font)
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
// Display and track the popup menu
CPoint pos;
GetCursorPos(&pos);
pTargetWnd->SetForegroundWindow();
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
pTargetWnd->GetSafeHwnd(), NULL);
pTargetWnd->PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
}
return 1;
}
При нажатии пункта меню Start должна обработать функция
Код:
void CMy3Dlg::OnAppStart()
{
// TODO: Add your command handler code here
/* NEED TO GRAY START BUTTON */
menu.EnableMenuItem(ID_APP_OPTIONS , MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
MessageBox("START PRESSED!");
AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL);
}
{
// TODO: Add your command handler code here
/* NEED TO GRAY START BUTTON */
menu.EnableMenuItem(ID_APP_OPTIONS , MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
MessageBox("START PRESSED!");
AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL);
}
Вызовом этой функции все и заканчивается. Почему?