Una de las principales carencia es la falta de control sobre la tecla BACK.
Un ejemplo de dialogo con un get donde la tecla back se utiliza para borrar el carácter tras el cursor:
- Code: Select all Expand view RUN
DEFINE DIALOG oDlgPass RESOURCE "DLGPASSWORD" OF oCli:oWnd
REDEFINE GET oGet VAR oCli:cargo ID 102 OF oDlgPass;
// activa teclado Abc
oGet:bGotFocus := {|| SendMessage( oGet:hWnd, EM_SETINPUTMODE, 0, EIM_TEXT ) }
ACTIVATE DIALOG oDlgPass;
ON INIT ( oDlgPass:Setmenu( MenuPassword() ),DlgFullScr( oDlgPass:hwnd ), ;
OverrideKey( oDlgPass:hWnd, VK_TBACK ) );
RETURN .t.
HB_FUNC( OVERRIDEKEY )
{
HWND hMenuBar = (HWND) SHFindMenuBar( (HWND) hb_parnl(1) );
int nKey = hb_parni(2);
LPARAM lp = MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,SHMBOF_NODEFAULT | SHMBOF_NOTIFY );
SendMessage( hMenuBar, SHCMBM_OVERRIDEKEY, nKey, lp );
}
Modificaciones para que esto funcione:
Clase tDialog:
- Code: Select all Expand view RUN
#define VK_TBACK VK_ESCAPE
#define MOD_KEYUP 0x1000
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TDialog
local bStart, lResult
do case
case nMsg == WM_INITDIALOG
return ::Initiate( nWParam, nLParam )
case nMsg == WM_HOTKEY // hotkeys de smartphone
IF nHiWord( nLParam ) == VK_TBACK //.AND. nLoWord( nLParam ) == 0
IF nLoWord( nLParam ) == MOD_KEYUP
SendBackToFocusWindow( WM_HOTKEY, nWparam, nLParam )
return 1
ENDIF
ENDIF
return 1
case nMsg == WM_PAINT
lResult = Super:HandleEvent( nMsg, nWParam, nLParam )
if ::bStart != nil
SysRefresh()
bStart = ::bStart
::bStart = nil
Eval( bStart, Self )
endif
return lResult
endcase
return Super:HandleEvent( nMsg, nWParam, nLParam )
HB_FUNC( SENDBACKTOFOCUSWINDOW )
{
UINT uMsg = hb_parnl(1);
WPARAM wParam = hb_parnl(2);
LPARAM lParam = hb_parnl(3);
SHSendBackToFocusWindow( uMsg, wParam, lParam );
}
La clase TGet el metodo KeyChar():
- Code: Select all Expand view RUN
do case
case nKey == VK_BACK // Already processed at KeyDown
::KeyDown( nKey, nFlags ) // smartphone la procesa aqui
return 0
No se si queda claro. También estoy seguro que debe haber un metodo más elegante de programarlo.
La tecla ENTER (ACTION en smartphone) también tiene una funcionalidad incorrecta, no debe ser utilizada para saltar al siguiente control en el dialogo, sino para activar algunos controles como gets y listbox expandibles.
Espero que pueda ser de utilidad y podais incluirlas para conseguir más compatibilidad con smartphones.
Gracias.