[C con Clase] TABSTOP

Adolfo Cárdenas adocardenas en gmail.com
Jue Jul 10 16:58:16 CEST 2008


El día 8 de julio de 2008 12:53, Diego Mendieta <d_iego en msn.com> escribió:
> como puedo capturar el keyboard focus con una ventana? a lo que me refiero es lo siguiente.
> Estoy tratando de hacer una caja de edicion por mi cuenta, y quiero recibir lo enviado por el teclado, y tambien poder cambiar de caja de texto con tab. Algunas sugerencias?
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>

//HOLA

Para que una ventana normal reconozca la tecla TAB como un cuadro de dialogo,
se usa la función IsDialogMessage(hwnd, &mensaje) dentro del bucle de mensajes.

  while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
  {
    if(!IsDialogMessage(hwnd, &mensaje) )
    {
      TranslateMessage(&mensaje);
      DispatchMessage(&mensaje);
    }
  }

Por otro lado para captar la tecla específica se usa la función
GetAsyncKeyState(VK_TAB).
Esto captaría si se presionó la tecla TAB para luego enviar la
notificación a la ventana con SendMessage.

static int tabsoltada; //Tecla <tab> soltada.

int WINAPI WinMain (HINSTANCE hThisInstance,  HINSTANCE hPrevInstance,
                                LPSTR lpszArgument, int nFunsterStil)
{
  while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
  {
    if(GetAsyncKeyState(VK_TAB) && 0x1000) SendMessage(hwnd,
WM_KEYDOWN, VK_TAB, 0);
    else tabsoltada = 1;

    if(!IsDialogMessage(hwnd, &mensaje))
    {
        if(!TranslateAccelerator(hwnd, hAcelerador, &mensaje))
        TranslateMessage(&mensaje);
        DispatchMessage(&mensaje);
    }
  }
}

//Luego:
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
 // ...
  switch (msg)                  // manipulador del mensaje
  {
    //...
    case WM_KEYDOWN:
       tecla = (int)wParam;
       switch(tecla)
       {
          case VK_TAB:
                //Se puede usar una variable (tabsoltada)
                //para que no haga el proceso varias
                //veces mientras esté presionada <TAB>
            if(tabsoltada)
            {
              if(Control_Edit_1 == GetFocus())
SetFocus(Control_Edit_2);
            }
            tabsoltada = 0;
          break;
//...
}

También se puede captar una tecla en el bucle de mensajes con:

 while (GetMessage (&messages, NULL, 0, 0))
 {
   if(messages.message == WM_KEYDOWN && messages.wParam == VK_RETURN)
   {
      ///...........
   }
   TranslateMessage(&messages);
   DispatchMessage(&messages);
 }

//HASTA LUEGO




Más información sobre la lista de distribución Cconclase