/*
	Esta biblioteca resuelve el problema de los controles CEdit multilínea,
	en los que al pulsar CTRL+TAB se inserta un tabulador en vez de pasar
	al siguiente control en la ventana.

	Sólo debe agregar un miembro de tipo hookctrltab a su clase de ventana principal,
	y pasarle al constructor del primero la dirección del objeto ventana (this).

	Ej.

	class CMainWin: public CFrameWnd	{
		hookctrltab hct;
	public:
		CMainWin(): hct(this)
			{
			}
	};


	Ariel Medina

	Nota: Active RTTI en su compilador.
*/

#ifndef __HOOKCTRLTAB_H
	#define __HOOKCTRLTAB_H

#include <typeinfo>
#include <Afxwin.h>
#include <winuser.h>

namespace amv	{

// Función para tratar los mensajes del teclado
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

// Clase que implementa el funcionamiento de gancho de teclado
class hookctrltab	{
public:
	static CFrameWnd *pw;
	static HHOOK hhk;
	hookctrltab(CFrameWnd *p)
		{
		if(!pw)
			pw=p;

		if(!hhk)
			{
			hhk=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,AfxGetInstanceHandle(),GetCurrentThreadId());
			if(!hhk)
				AfxMessageBox("No se creó el gancho de teclado");
			}
		}
	~hookctrltab()
		{
		if(hhk)
			UnhookWindowsHookEx(hhk);
		}
};

// Variables estáticas de la clase hookctrltab
HHOOK hookctrltab::hhk=0; // Manejador de gancho
CFrameWnd *hookctrltab::pw=0; // Apuntador a la ventana de la aplicación que usa el gancho

// Función para tratar los mensajes del teclado (CTRL+TAB)
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if(code==HC_ACTION)
	{
	if(wParam==VK_TAB && (GetAsyncKeyState(VK_CONTROL) & 0x8000))
		{
		CEdit *pedt=0;
		CWnd *pcw=hookctrltab::pw->GetFocus();
		if(pcw && (pedt=dynamic_cast<CEdit *>(pcw)))
			{
			hookctrltab::pw->GetNextDlgTabItem(pcw)->SetFocus();
			return 1;
			}
		}
	}

return CallNextHookEx(hookctrltab::hhk,code,wParam,lParam);
}

}

#endif