Se produce un error de aserción o algunas teclas no funcionan como se esperaba al mostrar el objeto de cuadro de diálogo ATL como un cuadro de diálogo no modal

Seleccione idioma Seleccione idioma
Id. de artículo: 216503 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

El cuadro de diálogo Asistente para objetos ATL proporciona una opción para crear un objeto de cuadro de diálogo ATL. Sin embargo, se encuentran los siguientes problemas al mostrar el objeto de cuadro de diálogo ATL como un cuadro de diálogo no modal desde un proyecto de exe ATL:
  • Hace clic en Aceptar o en Cancelar , un error de aserción.
  • La tecla TAB o acelerador no funciona como se esperaba.

Causa

El código generado por el Asistente ATL está diseñado para mostrar el cuadro de diálogo como un cuadro de diálogo modal.

Solución

Agregar o modifique el código siguiente al proyecto ATL .exe para mostrar el cuadro de diálogo ATL como cuadro de diálogo no modal:
  1. La llamada EndDialog() en ambos las funciones OnOK() y OnCancel() causar errores de aserción. Llame a DestroyWindow() en su lugar para el cuadro de diálogo no modal.
    LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
    {
       DestroyWindow();
       PostQuitMessage(0); // OPTIONAL - call this to terminate the app.
       return 0;
    }
    
    LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
    {
       DestroyWindow();
       PostQuitMessage(0); // OPTIONAL - call this to terminate the app.
       return 0;
    }
    						
  2. Modifique el bucle GetMessage() en la función _tWinMain() manera IsDialogMessage() se llama para un cuadro de diálogo no modal. Este método se encarga de claves de la ficha y el acelerador de problema de procesamiento.
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
       if ((gModelessDlg) && 
          (!::IsDialogMessage(gModelessDlg->m_hWnd,&msg)))
          DispatchMessage(&msg);
    }
    						
    TranslateMessage() Nota no es necesario en el GetMessage() bucle.

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

  1. Utilice al Asistente para COM de ATL para generar un proyecto ATL .exe.
  2. Cree una clase de cuadro de diálogo denominada CMyDialog:

    Visual C++ 6.0
    1. En el menú Insertar , haga clic en Nuevo objeto ATL para insertar un objeto de cuadro de diálogo de la categoría de varios del cuadro de diálogo Asistente para objetos ATL.
    2. La clase de cuadro de diálogo CMyDialog nombre.
    Visual C++ .NET
    1. En el menú proyecto , haga clic en Agregar clase .
    2. En el cuadro de diálogo Agregar clase , seleccione el Cuadro de diálogo ATL en plantillas y, a continuación, haga clic en Abrir .
    3. En el Asistente de cuadro de diálogo ATL, nombre el cuadro de diálogo clase CMyDialog y, a continuación, haga clic en Finalizar .
  3. Agregue el código siguiente al archivo que contiene la función _tWinMain() para mostrar CMyDialog como un cuadro de diálogo no modal.
    // Include the header file for CMyDialog and declare a global variable of 
    // CMyDialog type.
    #include "mydialog.h" 
    CMyDialog* gMainDialog = NULL;
    
    extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
       HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
    {
       // ... other stuff
    
       // Show the CMyDialog as a modeless dialog box.
       gMainDialog = new CMyDialog;
       gMainDialog->Create(GetDesktopWindow());
       gMainDialog->ShowWindow(SW_SHOW);
    
       MSG msg;
       while (GetMessage(&msg, 0, 0, 0))
          DispatchMessage(&msg);
    
    
       // ... other stuff
    
       // Destroy the C++ object for the modeless dialog box.
       if (gMainDialog)
          delete gMainDialog;  
    
       // ... other stuff
    }
    						

Referencias

(c) Microsoft Corporation 1999, Reservados todos los derechos. Contribuciones por Yeong Kah TAM, Microsoft Corporation.

Propiedades

Id. de artículo: 216503 - Última revisión: lunes, 03 de octubre de 2005 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft ActiveX Template Library 3.0 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft ActiveX Template Library 2.1 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbtshoot kbatlwc kbdlg kbprb KB216503 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 216503

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com