2009-11-19 2 views
1

Я написал надстройку Excel COM на C++ для автоматизации Excel с помощью VBA. Он содержит собственный диалог, показывающий некоторые общие сведения о Надстройке. Теперь я создаю кнопку в Excel, которая открывает диалог. Выход из диалогового окна с помощью клавиши escape приводит к сообщению Excel о прерывании сценария, а не просто закрытии диалога. Я мог подавить сообщение прерывания с:Диалоговое окно надстройки Excel COM прерывает сценарий

Application.EnableCancelKey = xlDisabled 

Но это, кажется, не подходит, поскольку сценарий не может быть прервана больше.
Вот пример того, как я использовать VBA, чтобы открыть диалоговое окно:

Private Sub ShowAboutDialog_Click() 
    Dim oComAddIn As COMAddIn 
    Set oComAddIn = Application.COMAddIns.Item("MyComAddIn.Example") 
    oComAddIn.Connect = True 
    Call oComAddIn.Object.ShowAboutDlg 
End Sub 

Я думаю, что проблема находится где-то в обработчике сообщений диалога:

INT_PTR CALLBACK CAboutDialog::AboutDlg(
    HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
    ... 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
     { 
      // Here, the ESCAPE key should also be trapped? 
      EndDialog(hwndDlg, LOWORD(wParam)); 
      return TRUE; 
     } 
    ... 
    } 

    return FALSE; 
} 

диалоговом создается с :

DialogBox(g_hModule, MAKEINTRESOURCE(IDD_ABOUT), hWndParent, (DLGPROC)AboutDlg) 

Большое спасибо!

ответ

1

Диалоги должны возвращать свой статус выхода вызывающей процедуре, а не позволять прекратить выполнение кода. Поэтому я предлагаю вам

  • конвертировать ваши ShowAboutDlg от Sub() к Function()
  • возвращение константы из Enum множества VbMsgBoxResult (избежать жесткого кодирования!)
  • ловушки клавиши ESC в вашем диалоге и возвращать VbCancel (или VbAbort)

Успехов MikeD

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