2013-09-04 2 views
0

Я добавил элемент в системное меню в приложении на основе набора номера, элемент отображается в меню, но когда я нажимаю на него, ничего не происходит. Вот код:MFC добавление элемента в системное меню

#define IDM_CLIP 17 

BOOL CCalculatorControlDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    CMenu* pSysMenu = GetSystemMenu(FALSE); 
    if (pSysMenu != NULL) 
    { 
     CString strAboutMenu; 
     strAboutMenu.LoadString(IDS_ABOUTBOX); 
     CString strClip; 
     strClip.LoadString(IDS_CLIPBOX); 
     if (!strAboutMenu.IsEmpty()) 
     { 
      pSysMenu->AppendMenu(MF_SEPARATOR); 
      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
      pSysMenu->AppendMenu(MF_STRING, IDM_CLIP, strClip); 
     }  
    } 

    SetIcon(m_hIcon, TRUE);   
    SetIcon(m_hIcon, FALSE);   

    m_Calculator1.SetNumFormat("%0.2f");   

    LOGFONT lf; 
    m_Calculator1.GetResultWndFont(&lf); 
    strcpy(lf.lfFaceName, "Brittanic Bold"); 
    m_Calculator1.SetResultsWndFont(&lf); 

    m_Calculator1.GetButtonFont(&lf); 
    strcpy(lf.lfFaceName, "Tahoma"); 
    m_Calculator1.SetButtonFont(&lf); 

    m_Calculator1.SetResultsWndBkClr(RGB(128,128,128)); 

    m_Calculator1.SetResultsWndTxtClr(RGB(255,255,255)); 

    return FALSE; 
} 

void CCalculatorControlDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
    if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
    { 
     CAboutDlg dlgAbout; 
     dlgAbout.DoModal(); 
    } 
    else if((nID & 0xFFF0) == IDM_CLIP) 
    { 
     m_Calculator1.OnEditCopy(); 
    } 
    else 
    { 
     CDialog::OnSysCommand(nID, lParam); 
    } 
} 

О диалоговом окне добавлено автоматически с помощью фреймворка, и я добавил IDM_CLIP. m_Calculator1.OnEditCopy() - это функция из моего класса CCalculatorCtrl, который копирует текст в буфер обмена. Я также включил файл CCalculatorCtrl.h в свой файл CalculatorControlDlg.cpp, где я редактирую системное меню. Вот метод OnEditCopy, который btw работает с кнопочным управлением ...

Это метод, который я вызываю в классе CCalculatorControlDlg.

void CCalculatorCtrl::OnEditCopy() 
{ 
    if (!OpenClipboard()) 
    { 
     AfxMessageBox(_T("Cannot open the Clipboard")); 
     return; 
    } 
    // Remove the current Clipboard contents 
    if(!EmptyClipboard()) 
    { 
     AfxMessageBox(_T("Cannot empty the Clipboard")); 
     return; 
    } 
    // Get the currently selected data 
    HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64); 
    strcpy_s((char*)hGlob, 64, m_strCurrentEntry); 
    // For the appropriate data formats... 
    if (::SetClipboardData(CF_TEXT, hGlob) == NULL) 
    { 
     CString msg; 
     msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError()); 
     AfxMessageBox(msg); 
     CloseClipboard(); 
     GlobalFree(hGlob); 
     return; 
    } 
    AfxMessageBox(_T("Copy to clipboard successful!")); 
    CloseClipboard(); 
} 

Я надеюсь, что я понятно ... Заранее спасибо.

ответ

2

В методе

void CCalculatorControlDlg::OnSysCommand(UINT nID, LPARAM lParam) 

Линия

else if((nID & 0xFFF0) == IDM_CLIP) 

не могут быть правы, вы маскирования 0x11 (шестнадцатеричный для 17) против 0xfff0. Результат равен 16.

(nID & 0xFFF0) никогда не является значением 17, которое является IDM_CLIP.

Используйте другой идентификатор IDM_CLIP.

2

Это должно быть достаточно очевидно на основе кода, что происходит; помните, что 17 является 0x11

Проблема в том, что когда вы делаете (nID & 0xFFF0) результат 0x0011 & 0xFFF0 который дает: 0x0010.

Таким образом, решение должно исправить IDM_CLIP, чтобы иметь соответствующее значение. Как вы видели, это не может быть ничего. Из MSDN page on CWnd::OnSysCommand говорится: «В сообщениях WM_SYSCOMMAND четыре младших бита параметра nID используются внутри Windows. Когда приложение проверяет значение nID, оно должно объединить значение 0xFFF0 с значением nID с помощью оператора побитового-И для получения правильного результата. "

Это должно быть очевидно на основании того, что выбранное вами значение должно не имеют ни одного из 4-х битов.

+0

Спасибо, я изменил его на 112, и это сработало ... –

Смежные вопросы