Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пункт меню.

10K
11 июня 2007 года
nuhop
50 / / 24.03.2007
Как можно деактивировать пункт меню после нажатия на него?
Для обработки этого пункта меню есть функция MyTestDlg::OnStart(). В MSDN предлагают так:

 
Код:
CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED);


Если вставить этот кусок в функцию, то программа падает. Как правильно этот кусок интегрировать в функцию?
320
11 июня 2007 года
m_Valery
1.0K / / 08.01.2007
1.Создаешь меню в ресурсах.
2.Добавляешь переменную в класс диалога CMenu menu;
3.В ф-ии OnInitDialog пишешь
 
Код:
...
             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);
}

Для того,чтобы проверить деактивирован ли пункт меню я поставил MessageBox.Нажимаешь на кнопку меню,появляется MessageBox,а потом
все,сколько не нажимай MessageBox непоявится.Если закоментируешь
эту строчку
 
Код:
...menu.EnableMenuItem(ID_FILE_ONSTART, MF_BYCOMMAND | MF_DISABLED);
...

MessageBox будет появляться при каждом выборе этого пункта меню.
10K
12 июня 2007 года
nuhop
50 / / 24.03.2007
Круто. Как всегда помогло. Спасибо.
А как то же самое делается для приложений типа Document?
10K
13 июня 2007 года
nuhop
50 / / 24.03.2007
Добавил переменную класс в диалога CMenu menu и немного видоизменил код.

Код:
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()


У меня появляется в иконке в 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;
}


При нажатии пункта меню 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);
}


Вызовом этой функции все и заканчивается. Почему?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог