Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Efectuar una operación cuando un Edit pierde el Foco

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Efectuar una operación cuando un Edit pierde el Foco

Notapor johnny el Mar Ago 09, 2005 7:27 pm

Hola amigos de Latindevelopers

Tengo el siguiente problema:

El caso es que tengo un cuadro de dialogo (CDlgProducto) que sirve para ingresar los datos de un producto como son Codigo, Nombre, Precio, etc.
Lo que quiero es ingresar el codigo en una caja de texto, luego pulsar la tecla Tab para pasar al siguiente control, en el momento que el Edit_Codigo pierde el foco, quiero verificar si dicho codigo ya fue ingresado anteriormente en la base de datos, para ya no seguir ingresando los demas datos del producto.

Lo que he intentado es lo siguiente:

Primero he creado una clase CEnterosEdit derivada de CEdit

Luego he definido el mensaje: #define WM_VERIFICAR (WM_USER + 100)

A la clase CEnterosEdit le adicione el procedimiento subclasificado OnKillFocus( )
Código: Seleccionar todo
void CEnterosEdit::OnKillFocus(CWnd* pNewWnd)
{
   CEdit::OnKillFocus(pNewWnd);
   
   // TODO: Add your message handler code here

   // Enviar el mensaje WM_VERIFICAR a la ventana padre
   int nID_Ctrl = GetDlgCtrlID();

   if(nID_Ctrl == pNewWnd->GetDlgCtrlID() - 1)
   {
      // PostMessage coloca el mensaje y retorna sin esperar a procesarlo
      GetParent()->PostMessage(WM_VERIFICAR, GetDlgCtrlID());
   }
}


En el mapa de mensajes de la clase CDlgProducto he adicionado:
ON_MESSAGE(WM_VERIFICAR, VerificarCodigo)

Y el manipulador del mensaje

Código: Seleccionar todo
long CDlgAdProdCata::VerificarCodigo(UINT WParam, long LParam)
{
   //  Aqui pongo el codigo que verifica si el Codigo ya fue ingresado
   if(WParam == IDC_EDT_COD_PROD)
   {
      UpdateData();
      //…..
   }
   Return 0;
}


El Algoritmo funciona bien cuando estando enfocado el Edit_Codigo se pasa a cualquier control del cuadro de dialogo. Pero falla cuando estando enfocado el Edit_Codigo se pasa a otra aplicación.

Lo que quiero saber es si el puntero pNewWnd de OnKillFocus trae alguna información que indique que se trata de una ventana de otra aplicación. O en todo caso alguna forma de poder resolver dicho problema.

Agradesco desde ya sus respuestas.

Atentamente Johnny
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú

Ya resolvi el problema

Notapor johnny el Vie Ago 12, 2005 12:11 pm

Para saber cuando la nueva ventana no pertenece a la aplicación, hay que obtener el handle del puntero pNewWnd con la función GetSafeHwnd() y verificar si es de tipo ventana.

Modificar el codigo asi:

Código: Seleccionar todo
void CEnterosEdit::OnKillFocus(CWnd* pNewWnd)
{
   CEdit::OnKillFocus(pNewWnd);
   
   // TODO: Add your message handler code here

   // Enviar el mensaje WM_VERIFICAR a la ventana padre
   int nID_Ctrl = GetDlgCtrlID();

   if(::IsWindow(pNewWnd->GetSafeHwnd()))
   {
      TRACE0("La nueva ventana es valida\n");



      if(nID_Ctrl == pNewWnd->GetDlgCtrlID() - 1)
      {
         // PostMessage coloca el mensaje y retorna sin esperar a procesarlo
         GetParent()->PostMessage(WM_VERIFICAR, GetDlgCtrlID());
      }
   }
   else
      TRACE0("La nueva ventana No es valida\n");

   // SendMessage coloca el emnsaje y no retorna hasta que sea procesado
//   GetParent()->SendMessage(WM_VERIFICAR, GetDlgCtrlID());
}


Gracias de todas maneras por leer este Post.

Atentamente Johnny.
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú

Re: Ya resolvi el problema

Notapor latindeveloper el Vie Ago 12, 2005 12:14 pm

Buena! johnny, a muchos le servirá este dato.

Sigue adelante!
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado