Maestro, parcialmente resuelto con FW_SetUnicode( .T. ). Solo una función FWSTRING() no funcionó en el MENU:
#include "FiveWin.ch"
EXTERNAL HB_LANG_PT, HB_CODEPAGE_PTISO, HB_CODEPAGE_PT850
#ifNdef __XHARBOUR__ // Somente para HARBOUR, XHARBOUR nao tem isso ainda.
REQUEST HB_CODEPAGE_UTF8
REQUEST HB_CODEPAGE_UTF8EX
#endif
STATIC oWnd, lDummy1 := .f.
function Main()
LOCAL oBar
// FWSetLanguage( 5 ) // German
FWSetLanguage( 4 ) // Portuguese
HB_LANGSELECT( 'PT' )
HB_SETCODEPAGE( "UTF8" )
HB_CDPSELECT( "UTF8EX" )
HB_SETCODEPAGE( "PT850" )
HB_CDPSELECT( "PTISO" )
FW_SetUnicode( .T. ) // Resuelto parcial - MENU problemas.
DEFINE WINDOW oWnd TITLE FWString( "Testing Accented Characters - " ) + ;
FWString( "Attention" ) ;
MENU BuildMenu() MDI
DEFINE BUTTONBAR oBar BUTTONSIZE 75, 70 _3DLOOK TOP OF oWnd 2007
DEFINE BUTTON OF oBar PROMPT FWString( "Add" ) ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\new.bmp" FLAT
DEFINE BUTTON OF oBar PROMPT FWString( "Edit" ) ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\open.bmp" FLAT
DEFINE BUTTON OF oBar PROMPT FWString( "Search" ) ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\floppy.bmp" FLAT
DEFINE BUTTON OF oBar PROMPT FWString( "Delete" ) ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\delete.bmp" FLAT
DEFINE BUTTON OF oBar PROMPT FWString( "Setup" ) ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\open32.bmp" FLAT
DEFINE BUTTON OF oBar PROMPT FWString( "Exit" ) ACTION oWnd:End() ;
FILENAME "..\bitmaps\16x16\exit.bmp" FLAT
SET MESSAGE OF oWnd TO "ButtonBar: " + ;
FWString("Add") + " | " + FWString("Edit") + " | " + ;
FWString("Search") + " | " + FWString("Delete") + " | " + FWString("Setup") + ;
" [GetACP=" + AllTrim( Str( GetACP() ) ) + ;
" HBCDP=" + AllTrim( Str( HbCDP() ) ) + "]" 2007
ACTIVATE WINDOW oWnd MAXIMIZED ;
VALID MsgYesNo( FWString( "Want to end ?" ), FWString( "Attention" ) )
RETURN NIL
function BuildMenu()
LOCAL oMenu
MENU oMenu 2007
MENUITEM FWString( "&Test" ) // ahora funciona
MENU
MENUITEM FWString( "Attention" ) + " - Dialog Test" ACTION TestDlg() ;
FILENAME "..\bitmaps\16x16\info.bmp"
SEPARATOR
MENUITEM "Language &1: English" ACTION ( FWSetLanguage( 1 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\16x16\faces.bmp"
SEPARATOR
MENUITEM "Language &2: Spanish" ACTION ( FWSetLanguage( 2 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\edit.bmp"
SEPARATOR
MENUITEM "Language &3: French" ACTION ( FWSetLanguage( 3 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\16x16\delete.bmp"
SEPARATOR
MENUITEM "Language &4: Portuguese" ACTION ( FWSetLanguage( 4 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\16x16\browse.bmp"
SEPARATOR
MENUITEM "Language &5: German" ACTION ( FWSetLanguage( 5 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\16x16\calc.bmp"
SEPARATOR
MENUITEM "Language &6: Italian" ACTION ( FWSetLanguage( 6 ), oWnd:SetMenu( BuildMenu() ), TestDlg() ) ;
FILENAME "..\bitmaps\16x16\explorer.bmp"
SEPARATOR
MENUITEM "&Exit" ACTION oWnd:End() ;
FILENAME "..\bitmaps\16x16\exit.bmp"
ENDMENU
ENDMENU
RETURN( oMenu )
STATIC FUNCTION TestDlg()
local oDlg, oSay1, oSay2, oBtn1, oBtn2, oBtn3, oBtn4, oChk1, oCbx1
local cAdd, cEdit, cSearch, cDelete, cSetup, cAttention, cPrintErr
local aLangs, nSelLang, cTitle, cAtt, cPr
cAdd := FWString( "Add" )
cEdit := FWString( "Edit" )
cSearch := FWString( "Search" )
cDelete := FWString( "Delete" )
cSetup := FWString( "Setup" )
cAttention := FWString( "Attention" )
cPrintErr := FWString( "Printing Error" )
aLangs := { FWString( "English" ), FWString( "Spanish" ), FWString( "French" ), ;
FWString( "Portuguese" ), FWString( "German" ), FWString( "Italian" ) }
nSelLang := FWSetLanguage()
// ASI, FUNCIONA EN EL BUTTON, NO COMPRENDO ??? jajajaja.
cAtt := cAttention + SPACE( 02 ) // + " Error" // ERROR IN BUTTON: Attention
// ASI, NO FUNCIONA EN EL DIALOGO DE FORMA NINGUNA.
cPr := cPrintErr + SPACE( 02 ) // Erro de impressao... con ~
// no funciona en el titulo del dialogo. ???
cTitle := "FWH: " + cAtt + " - " + cPr
// ? cTitle // Esta correcto, pero no muestra en el dialogo ?
// ? OemToansi( cAttention ) // error
// ? AnsiToOem( cAttention ) // error
// cTitle := "FWH: titulo do dialogo nao esta funcionando"
DEFINE DIALOG oDlg TITLE cAttention + " / " + cPrintErr SIZE 520, 450
//-> TITLE CON ERROR. EN PORTUGUES.
// DEFINE DIALOG oDlg TITLE cTitle SIZE 550, 450 // TRANSPARENT
oDlg:lHelpIcon := .F.
// --- SAY controls ---
@ 0.5, 1 SAY "=== SAY Controls ===" OF oDlg
@ 1.5, 1 SAY "Add: " + cAdd OF oDlg
@ 2.3, 1 SAY "Edit: " + cEdit OF oDlg
@ 3.1, 1 SAY "Search: " + cSearch OF oDlg
@ 3.9, 1 SAY "Delete: " + cDelete OF oDlg
@ 4.7, 1 SAY "Setup: " + cSetup OF oDlg
@ 5.5, 1 SAY oSay1 PROMPT "Attention: " + cAttention OF oDlg
@ 6.3, 1 SAY oSay2 PROMPT "Print Error: " + cPrintErr OF oDlg
// --- BUTTON controls ---
@ 0.5, 16 SAY "=== BUTTON Controls ===" OF oDlg
@ 1.5, 16 BUTTON oBtn1 PROMPT cAdd OF oDlg SIZE 50, 12 ACTION MsgInfo( cAdd )
@ 3.0, 16 BUTTON oBtn2 PROMPT cEdit OF oDlg SIZE 50, 12 ACTION MsgInfo( cEdit )
@ 4.5, 16 BUTTON oBtn3 PROMPT cSearch OF oDlg SIZE 50, 12 ACTION MsgInfo( cSearch )
// --- More buttons with accented text ---
@ 0.5, 26 SAY "=== More Buttons ===" OF oDlg
// AQUI, TAMBIEN MUESTRA cAttention CON ERROR EN PORTUGUES. CON SPACE(02), FUNCIONA.
// @ 1.5, 26 BUTTON cAttention OF oDlg SIZE 50, 12 ACTION MsgInfo( cAttention )
@ 1.5, 26 BUTTON cAtt OF oDlg SIZE 50, 12 ACTION MsgInfo( cAttention )
@ 3.0, 26 BUTTON cPrintErr OF oDlg SIZE 50, 12 ACTION MsgInfo( cPrintErr )
@ 4.5, 26 BUTTON oBtn4 PROMPT cDelete OF oDlg SIZE 50, 12 ACTION MsgInfo( cDelete )
// --- CHECKBOX controls ---
@ 7.5, 1 SAY "=== CHECKBOX ===" OF oDlg
@ 9.5, 1.5 CHECKBOX oChk1 VAR lDummy1 PROMPT cAdd OF oDlg SIZE 50, 12
// --- COMBOBOX control ---
@ 7.5, 16 SAY "=== COMBOBOX ===" OF oDlg
@ 9.5, 16 COMBOBOX oCbx1 VAR nSelLang ITEMS aLangs OF oDlg SIZE 120, 150
// --- Debug info ---
@ 10.5, 1 SAY "=== Debug Info ===" OF oDlg
@ 11.3, 1 SAY 'Add="' + cAdd + '" hex=' + StrToHex( cAdd ) OF oDlg
@ 12.1, 1 SAY 'Attention="' + cAttention + '" hex=' + StrToHex( cAttention ) OF oDlg
@ 12.9, 1 SAY "GetACP()=" + AllTrim( Str( GetACP() ) ) + ;
" GetOEMCP()=" + AllTrim( Str( GetOEMCP() ) ) + ;
" HbCDP=" + AllTrim( Str( HbCDP() ) ) OF oDlg
// Show IsWindowUnicode info after dialog is created
@ 14.2, 1 BUTTON "&Diagnose" OF oDlg SIZE 50, 13 ;
ACTION DiagnoseControls( oDlg, oSay1, oBtn1, oChk1, oCbx1 )
@ 14.2, 15 BUTTON "&Ok" OF oDlg SIZE 45, 13 ACTION oDlg:End()
@ 14.2, 26 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED ;
ON INIT DiagnoseControls( oDlg, oSay1, oBtn1, oChk1, oCbx1 )
return nil
static function DiagnoseControls( oDlg, oSay, oBtn, oChk, oCbx )
local cInfo := ""
cInfo += "Dialog hWnd Unicode: " + cYesNo( IsWindowUnicode( oDlg:hWnd ) ) + CRLF
if oSay != nil
cInfo += "SAY hWnd Unicode: " + cYesNo( IsWindowUnicode( oSay:hWnd ) ) + ;
" lUnicode=" + cYesNo( oSay:lUnicode ) + CRLF
endif
if oBtn != nil
cInfo += "BUTTON hWnd Unicode: " + cYesNo( IsWindowUnicode( oBtn:hWnd ) ) + ;
" lUnicode=" + cYesNo( oBtn:lUnicode ) + CRLF
endif
if oChk != nil
cInfo += "CHECKBOX hWnd Unicode: " + cYesNo( IsWindowUnicode( oChk:hWnd ) ) + ;
" lUnicode=" + cYesNo( oChk:lUnicode ) + CRLF
endif
if oCbx != nil
cInfo += "COMBOBOX hWnd Unicode: " + cYesNo( IsWindowUnicode( oCbx:hWnd ) ) + ;
" lUnicode=" + cYesNo( oCbx:lUnicode ) + CRLF
endif
cInfo += CRLF
cInfo += "GetACP() = " + AllTrim( Str( GetACP() ) ) + CRLF
cInfo += "GetOEMCP() = " + AllTrim( Str( GetOEMCP() ) ) + CRLF
cInfo += "HbCDP() = " + AllTrim( Str( HbCDP() ) ) + CRLF
cInfo += "FW_SetUnicode() = " + cYesNo( FW_SetUnicode() ) + CRLF
cInfo += CRLF
cInfo += "FWString('Add') = " + FWString("Add") + " hex=" + StrToHex( FWString("Add") ) + CRLF
cInfo += "FWString('Attention') = " + FWString("Attention") + " hex=" + StrToHex( FWString("Attention") ) + CRLF
cInfo += "FWString('Printing Err') = " + FWString("Printing Error") + " hex=" + StrToHex( FWString("Printing Error") )
MsgInfo( cInfo, "Diagnostic Info" )
return nil
static function cYesNo( l )
return If( l, "YES", "NO" )
static function StrToHex( cStr )
local n, cHex := ""
for n := 1 to Min( Len( cStr ), 20 )
cHex += PadL( hb_NumToHex( Asc( SubStr( cStr, n, 1 ) ) ), 2, "0" )
if n < Min( Len( cStr ), 20 )
cHex += " "
endif
next
return cHex
// FIN / END
Regards, saludos.