Диалоговое окно Excel COM Add-In прерывает скрипт - PullRequest
1 голос
/ 19 ноября 2009

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

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 Ответ

1 голос
/ 19 ноября 2009

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

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

Удачи MikeD

...