Bom dia, Paulo.
Acredito que o Quintas deva ter boas cartas na manga sobre trabalhar com Toolbar. Sei que com a GTWVW, já é um processo que exige muitas linhas de programação.
Existe um exemplo na pasta contrib\gtwvw\tests\DEMO.PRG que mostra bem o funcionamento da toolbar com a GTWVW, mas gasta-se um certo tempo para "preparar o terreno" e utilizar.
1. Preparar as imagens que você quer utilizar na toolbar. Você pode usar as que você tem aÃ, ou buscar na internet algum conjunto de Ãcones que satisfaça seu gosto visual. Mas o importante nisso, é que as imagens devem estar no formato BMP, e eu aconselho uma resolução de 72x72, pois aà dá pra você usar no tamanho menor, sem perder qualidade.
2. No inÃcio do módulo, você precisa incluir as #define's que servirão como referência de ação na toolbar, no exemplo DEMO.PRG está assim:
#define IDM_NETCONNECT 401
#define IDM_NETDISCONNECT 402
#define IDM_BACK 403
#define IDM_FORWARD 404
#define IDM_COPY 405
#define IDM_PASTE 406
3. A função que cria a toolbar e acrescenta os botões. Pra isso, usa-se as funções wvw_TbCreate() e wvw_tbAddButton(). Note que no exemplo da DEMO.PRG, a maioria dos botões foram configurados pra utilizar Ãcones padrão, definidos no arquivo include "commctrl.h". Porém, você pode usar os seus BMPs também, observando onde está comentado "using custom bitmaps":
PROCEDURE CreateToolbar( nWinNum )
// for toolbar:
LOCAL nSysBitmap := 1 // como a imagem vai aparecer - 0:não aparece 1:formato pequeno 2:formato grande
LOCAL lDisplayText := .F. // .T. exibe texto no botão, .F. o texto aparece como hint
wvw_tbDestroy( nWinNum ) // limpar o buffer para criar a toolbar
IF Empty( wvw_tbCreate( nWinNum, lDisplayText, , nSysBitmap ) )
lboxmessage( "FAILED create toolbar" )
RETURN
ENDIF
/* system bitmaps use constants in commctrl.h */
/* using system view bitmaps */
wvw_tbAddButton( nWinNum, IDM_NETCONNECT, 9 /*VIEW_NETCONNECT*/, "Connect", 2 )
wvw_tbAddButton( nWinNum, IDM_NETDISCONNECT, 10 /*VIEW_NETDISCONNECT*/, "Dis", 2 )
wvw_tbAddButton( nWinNum ) // separator
/* using system history bitmaps */
wvw_tbAddButton( nWinNum, IDM_BACK, 0 /*HIST_BACK*/, "Back", 3 )
wvw_tbAddButton( nWinNum, IDM_FORWARD, 1 /*HIST_FORWARD*/, "Forward", 3 )
wvw_tbAddButton( nWinNum ) // separator
/* using custom bitmaps */
wvw_tbAddButton( nWinNum, IDM_DEMO_BROWSE, hb_DirBase() + "def2.bmp", "Browse", 0 )
wvw_tbAddButton( nWinNum, IDM_DEMO_GET, hb_DirBase() + "vouch1.bmp", "Get", 0 )
wvw_tbAddButton( nWinNum ) // separator
/* using system standard bitmaps */
wvw_tbAddButton( nWinNum, IDM_COPY, 1 /*STD_COPY*/, "Copy", 1 )
wvw_tbAddButton( nWinNum, IDM_PASTE, 2 /*STD_PASTE*/, "Paste", 1 )
wvw_tbAddButton( nWinNum ) // separator
wvw_tbAddButton( nWinNum, IDM_HELP_INFO, 10 /*STD_PROPERTIES*/, "Info", 1 )
wvw_tbAddButton( nWinNum, IDM_HELP_HELP, 11 /*STD_HELP*/, "Help", 1 )
RETURN
A toolbar da GTWVW não oferece opção de alterar a fonte e o tamanho. Apenas temos como escolher exibir ou não o texto dentro dos botões.
4. Precisa de uma função que faz a leitura dos eventos, aguardando o usuário clicar em alguma opção da toolbar. Na DEMO.PRG, a função "nAfterInkey()" faz esse papel. Essa função não existe pronta na GTWVW, tem que ser incluÃda no seu programa, conforme o exemplo.
STATIC FUNCTION nAfterInkey( nKey )
// check if nkey is:
// (1) menu command, or
// (2) mouse button action
LOCAL bAction
LOCAL nKeyStd := hb_keyStd( nKey )
IF nKey == WVW_DEFAULT_MENUKEYEVENT
// MenuKeyEvent
RETURN nMenuChecker( wvw_GetLastMenuEvent() )
// was: ELSEIF AScan( { K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE }, nKeyStd ) > 0
ELSEIF AScan( { K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE, K_MMLEFTDOWN, K_LDBLCLK }, nKeyStd ) > 0
// MouseEvent
RETURN wvwm_nMouseChecker( nkey )
ELSEIF ( bAction := SetKey( nKey ) ) != NIL .OR. ;
( bAction := SetKey( nKeyStd ) ) != NIL
Eval( bAction, ProcName(), ProcLine(), ReadVar() )
RETURN 0
ENDIF
RETURN nKey
5. Enfim, depois de "ler" os eventos, é necessário direcionar o evento para o comando, procedure ou função desejada. No exemplo, a função que faz isso é a "nMenuChecker()". Na DEMO.PRG, essa função faz o direcionamento de tudo, tanto das opções do Menu do sistema, quanto da toolbar.
STATIC FUNCTION nMenuChecker( nMenuEvent )
LOCAL nkey := 0
xDisableMenus( 0, 4 )
// xDisableToolbar( 0 )
SWITCH nMenuEvent
CASE IDM_DEMO_GET
// lboxmessage( "Demo GET" )
Demo_Get()
EXIT
CASE IDM_DEMO_BROWSE
// lboxmessage( "Demo BROWSE" )
Demo_Browse()
EXIT
CASE IDM_DEMO_CONSOLE
// lboxmessage( "Demo CONSOLE" )
Demo_Console()
EXIT
#if 0
CASE IDM_DEMO_COLOR
// lboxmessage( "Demo COLOR" )
Demo_Color()
EXIT
#endif
CASE IDM_DEMO_EXIT
// lboxmessage( "should EXIT!" )
nkey := K_ESC
EXIT
CASE IDM_WINDOW_SPACING_INCREASE
wvw_SetLineSpacing( , wvw_SetLineSpacing() + 2 )
EXIT
CASE IDM_WINDOW_SPACING_DECREASE
wvw_SetLineSpacing( , wvw_SetLineSpacing() - 2 )
EXIT
CASE IDM_WINDOW_SPACING_DEFAULT
wvw_SetDefLineSpacing( wvw_SetLineSpacing() )
EXIT
CASE IDM_TOOLBAR_ENABLE
xEnableToolbar( 0 )
EXIT
CASE IDM_TOOLBAR_DISABLE
xDisableToolbar( 0 )
EXIT
CASE IDM_TOOLBAR_RESET
CreateToolbar( 0 )
EXIT
CASE IDM_TOOLBAR_DELETE
wvw_tbDestroy( 0 )
EXIT
CASE IDM_HELP_HELP
xHelp()
EXIT
CASE IDM_HELP_INFO
xDebugInfo()
EXIT
OTHERWISE
lboxmessage( "Sorry, unrecognized menu option: " + hb_ntos( nMenuEvent ) )
ENDSWITCH
// xEnableToolbar( 0 )
xEnableMenus( 0, 4 )
RETURN nkey
Bom... se você pegar esses trechos de códigos que postei aqui e jogar num PRG, não vai funcionar. Pois vão faltar diversas variáveis criadas para que a estrutura funcione. Mas quis apenas resumir os passos para se trabalhar com uma toolbar na GTWVW, apontando no exemplo DEMO.PRG o que faz a Toolbar funcionar. Caso você venha a utilizar 2 toolbar's no seu programa, por exemplo: uma toolbar na tela principal e outra toolbar para as telas de cadastro, você terá que criar 2 estruturas dessas pra trabalhar em janelas diferentes... porém, aquela toolbar criada para as telas de cadastro pode ser a mesma para todos os cadastros.
Espero ter ajudado, pelo menos a entender um pouquinho, como funcionaria na GTWVW.