[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