From b22e96d54d77c88d4efaef8e7dbc3b5fc7cf6492 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Tue, 28 Oct 2008 11:53:43 +0000 Subject: [PATCH] 2008-10-28 12:53 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/rtl/gtwvt/gtwvt.h * harbour/source/rtl/gtwvt/gtwvt.c + added support for creating console window after 1-st screen update Please remember that it interacts with inkey() code which does not work until windows is not created. Now it should be quite easy to add support for some initializations before window is created. Probably it will be necessary to change INFO() method and store settings in some pWVT variables if pWVT->hWND is NULL and then use them as parameters for new console window. I'd like to leave this modification to MS-Windows developers. * harbour/contrib/xhb/xhbcopyf.c ! fixed name conflict with hb_fsCopy() --- harbour/ChangeLog | 15 ++ harbour/contrib/xhb/xhbcopyf.c | 6 +- harbour/source/rtl/gtwvt/gtwvt.c | 292 +++++++++++++++++-------------- harbour/source/rtl/gtwvt/gtwvt.h | 2 + 4 files changed, 183 insertions(+), 132 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 307b3845ab..99670b40a7 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,21 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-10-28 12:53 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/gtwvt/gtwvt.h + * harbour/source/rtl/gtwvt/gtwvt.c + + added support for creating console window after 1-st screen update + Please remember that it interacts with inkey() code which does not + work until windows is not created. + Now it should be quite easy to add support for some initializations + before window is created. Probably it will be necessary to change + INFO() method and store settings in some pWVT variables if pWVT->hWND + is NULL and then use them as parameters for new console window. + I'd like to leave this modification to MS-Windows developers. + + * harbour/contrib/xhb/xhbcopyf.c + ! fixed name conflict with hb_fsCopy() + 2008-10-28 12:48 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * contrib/hbcurl/make_b32.bat * contrib/hbcurl/make_vc.bat diff --git a/harbour/contrib/xhb/xhbcopyf.c b/harbour/contrib/xhb/xhbcopyf.c index 3a7dac8845..4b5aa8d880 100644 --- a/harbour/contrib/xhb/xhbcopyf.c +++ b/harbour/contrib/xhb/xhbcopyf.c @@ -63,12 +63,12 @@ #define BUFFER_SIZE 8192 -static BOOL hb_fsCopy( char * szSource, char * szDest, PHB_ITEM pBlock ) +static BOOL hb_copyfile( char * szSource, char * szDest, PHB_ITEM pBlock ) { BOOL bRetVal = FALSE; HB_FHANDLE fhndSource; - HB_TRACE(HB_TR_DEBUG, ("hb_fsCopy(%s, %s)", szSource, szDest)); + HB_TRACE(HB_TR_DEBUG, ("hb_copyfile(%s, %s)", szSource, szDest)); while( ( fhndSource = hb_spOpen( ( BYTE * ) szSource, FO_READ | FO_SHARED | FO_PRIVATE ) ) == FS_ERROR ) { @@ -149,7 +149,7 @@ HB_FUNC( XHB_COPYFILE ) { if( ISCHAR( 1 ) && ISCHAR( 2 ) ) { - if( ! hb_fsCopy( hb_parc( 1 ), hb_parc( 2 ), hb_param( 3, HB_IT_BLOCK ) ) ) + if( ! hb_copyfile( hb_parc( 1 ), hb_parc( 2 ), hb_param( 3, HB_IT_BLOCK ) ) ) hb_retl( FALSE ); } else diff --git a/harbour/source/rtl/gtwvt/gtwvt.c b/harbour/source/rtl/gtwvt/gtwvt.c index 7281513dd3..b063130523 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.c +++ b/harbour/source/rtl/gtwvt/gtwvt.c @@ -13,7 +13,7 @@ * Copyright 2002 Przemyslaw Czerpak * Video subsystem for Win32 compilers * Copyright 1999-2000 Paul Tucker - * Copyright 2002 Przemysław Czerpak + * Copyright 2002 Przemyslaw Czerpak * * Copyright 2006 Przemyslaw Czerpak * Adopted to new GT API @@ -206,15 +206,12 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT ) hb_xfree( pWVT->pszSelectCopy ); if( pWVT->hWnd ) - { DestroyWindow( pWVT->hWnd ); - pWVT->hWnd = NULL; - } hb_xfree( pWVT ); } -static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT ) +static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow ) { PHB_GTWVT pWVT; OSVERSIONINFO osvi; @@ -232,6 +229,9 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT ) return NULL; } + pWVT->hInstance = ( HINSTANCE ) hInstance; + pWVT->iCmdShow = iCmdShow; + pWVT->ROWS = WVT_DEFAULT_ROWS; pWVT->COLS = WVT_DEFAULT_COLS; @@ -291,6 +291,19 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT ) pWVT->ResizeMode = HB_GTI_RESIZEMODE_FONT; +#ifndef HB_CDP_SUPPORT_OFF + pWVT->hostCDP = hb_vmCDP(); +#if defined(UNICODE) + pWVT->inCDP = hb_vmCDP(); +#else + { + int i; + for( i = 0; i < 256; ++i ) + pWVT->chrTransTbl[ i ] = pWVT->keyTransTbl[ i ] = ( BYTE ) i; + } +#endif +#endif + return pWVT; } @@ -1464,7 +1477,7 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara if( pWVT ) switch( message ) { case WM_CREATE: - return hb_gt_wvt_InitWindow( pWVT, WVT_DEFAULT_ROWS, WVT_DEFAULT_COLS ); + return hb_gt_wvt_InitWindow( pWVT, pWVT->ROWS, pWVT->COLS ); case WM_PAINT: { @@ -1683,12 +1696,41 @@ static HWND hb_gt_wvt_CreateWindow( HINSTANCE hInstance, int iCmdShow ) ShowWindow( hWnd, iCmdShow ); UpdateWindow( hWnd ); } - else - hb_errInternal( 10001, "Failed to create WVT window", NULL, NULL ); return hWnd; } +static BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT ) +{ + if( !pWVT->hWnd ) + { + pWVT->hWnd = hb_gt_wvt_CreateWindow( pWVT->hInstance, pWVT->iCmdShow ); + if( !pWVT->hWnd ) + hb_errInternal( 10001, "Failed to create WVT window", NULL, NULL ); + + hb_gt_wvt_InitWindow( pWVT, pWVT->ROWS, pWVT->COLS ); + + /* Set default window title */ + { + PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGV()[ 0 ] ); + hb_gt_wvt_SetWindowTitle( pWVT->hWnd, pFileName->szName ); + hb_xfree( pFileName ); + } + + /* Create "Mark" prompt in SysMenu to allow console type copy operation */ + { + HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); + if( hSysMenu ) + { + LPTSTR buffer = HB_TCHAR_CONVTO( pWVT->pszSelectCopy ); + AppendMenu( hSysMenu, MF_STRING, SYS_EV_MARK, buffer ); + HB_TCHAR_FREE( buffer ); + } + } + } + + return TRUE; +} /* ********************************************************************** */ /* @@ -1709,53 +1751,18 @@ static void hb_gt_wvt_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil hb_errInternal( 10001, "It's not a GUI program", NULL, NULL ); } - pWVT = hb_gt_wvt_New( pGT ); + pWVT = hb_gt_wvt_New( pGT, ( HINSTANCE ) hInstance, iCmdShow ); if( !pWVT ) hb_errInternal( 10001, "Maximum number of WVT windows reached, cannot create another one", NULL, NULL ); HB_GTLOCAL( pGT ) = ( void * ) pWVT; - pWVT->hInstance = ( HINSTANCE ) hInstance; - pWVT->hWnd = hb_gt_wvt_CreateWindow( ( HINSTANCE ) hInstance, iCmdShow ); - if( !pWVT->hWnd ) - return; - - hb_gt_wvt_InitWindow( pWVT, WVT_DEFAULT_ROWS, WVT_DEFAULT_COLS ); - -#ifndef HB_CDP_SUPPORT_OFF - pWVT->hostCDP = hb_vmCDP(); -#if defined(UNICODE) - pWVT->inCDP = hb_vmCDP(); -#else - { - int i; - for( i = 0; i < 256; ++i ) - pWVT->chrTransTbl[ i ] = pWVT->keyTransTbl[ i ] = ( BYTE ) i; - } -#endif -#endif - - /* Set default window title */ - { - PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGV()[ 0 ] ); - hb_gt_wvt_SetWindowTitle( pWVT->hWnd, pFileName->szName ); - hb_xfree( pFileName ); - } - - /* Create "Mark" prompt in SysMenu to allow console type copy operation */ - { - HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); - if( hSysMenu ) - { - LPTSTR buffer = HB_TCHAR_CONVTO( pWVT->pszSelectCopy ); - AppendMenu( hSysMenu, MF_STRING, SYS_EV_MARK, buffer ); - HB_TCHAR_FREE( buffer ); - } - } /* SUPER GT initialization */ HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_RESIZE( pGT, pWVT->ROWS, pWVT->COLS ); - HB_GTSELF_EXPOSEAREA( pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); + HB_GTSELF_SEMICOLD( pGT ); + + /* hb_gt_wvt_CreateConsoleWindow( pWVT ); */ } /* ********************************************************************** */ @@ -1808,6 +1815,7 @@ static BOOL hb_gt_wvt_SetMode( PHB_GT pGT, int iRow, int iCol ) else { hb_gt_wvt_SetWindowSize( pWVT, iRow, iCol ); + HB_GTSELF_SEMICOLD( pGT ); } } @@ -1842,7 +1850,9 @@ static int hb_gt_wvt_ReadKey( PHB_GT pGT, int iEventMask ) pWVT = HB_GTWVT_GET( pGT ); - hb_gt_wvt_ProcessMessages(); + if( pWVT->hWnd ) /* Is the window already open */ + hb_gt_wvt_ProcessMessages(); + fKey = hb_gt_wvt_GetCharFromInputQueue( pWVT, &c ); return fKey ? c : 0; @@ -2126,30 +2136,33 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) break; } case HB_GTI_WINTITLE: - { - char * szTitle = NULL; - if( hb_gt_wvt_GetWindowTitle( pWVT->hWnd, &szTitle ) ) - pInfo->pResult = hb_itemPutCPtr2( pInfo->pResult, szTitle ); - else - pInfo->pResult = hb_itemPutC( pInfo->pResult, NULL ); - if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) - hb_gt_wvt_SetWindowTitle( pWVT->hWnd, hb_itemGetCPtr( pInfo->pNewVal ) ); + if( pWVT->hWnd ) + { + char * szTitle = NULL; + if( hb_gt_wvt_GetWindowTitle( pWVT->hWnd, &szTitle ) ) + pInfo->pResult = hb_itemPutCPtr2( pInfo->pResult, szTitle ); + else + pInfo->pResult = hb_itemPutC( pInfo->pResult, NULL ); + if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) + hb_gt_wvt_SetWindowTitle( pWVT->hWnd, hb_itemGetCPtr( pInfo->pNewVal ) ); + } break; - } + case HB_GTI_CODEPAGE: pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->CodePage ); iVal = hb_itemGetNI( pInfo->pNewVal ); if( iVal > 0 && iVal != pWVT->CodePage ) { pWVT->CodePage = iVal; - hb_gt_wvt_ResetWindowSize( pWVT ); + if( pWVT->hWnd ) + hb_gt_wvt_ResetWindowSize( pWVT ); } break; case HB_GTI_ICONFILE: { HICON hIcon = 0; - if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) + if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) && pWVT->hWnd ) { LPTSTR lpImage = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, lpImage, @@ -2168,24 +2181,27 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) case HB_GTI_ICONRES: { HICON hIcon = 0; - if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) + if( pWVT->hWnd ) { - LPTSTR lpIcon = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); - hIcon = LoadIcon( pWVT->hInstance, lpIcon ); - HB_TCHAR_FREE( lpIcon ); + if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) + { + LPTSTR lpIcon = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); + hIcon = LoadIcon( pWVT->hInstance, lpIcon ); + HB_TCHAR_FREE( lpIcon ); + } + else if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) + { + hIcon = LoadIcon( pWVT->hInstance, + MAKEINTRESOURCE( ( HB_LONG ) + hb_itemGetNInt( pInfo->pNewVal ) ) ); + } + if( hIcon ) + { + SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon ); /* Set Title Bar Icon */ + SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) hIcon ); /* Set Task List Icon */ + } + pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) hIcon ); } - else if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) - { - hIcon = LoadIcon( pWVT->hInstance, - MAKEINTRESOURCE( ( HB_LONG ) - hb_itemGetNInt( pInfo->pNewVal ) ) ); - } - if( hIcon ) - { - SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon ); /* Set Title Bar Icon */ - SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) hIcon ); /* Set Task List Icon */ - } - pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) hIcon ); break; } case HB_GTI_VIEWMAXWIDTH: @@ -2258,44 +2274,41 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) } break; } - case HB_GTI_RESIZABLE: - { pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bResizable ); if( pInfo->pNewVal ) { BOOL bNewValue = hb_itemGetL( pInfo->pNewVal ); if( bNewValue != pWVT->bResizable ) { -#if (defined(_MSC_VER) && (_MSC_VER <= 1200 || defined(HB_WINCE)) || defined(__DMC__)) && !defined(HB_ARCH_64BIT) - LONG style; -#else - LONG_PTR style; -#endif - pWVT->bResizable = bNewValue; - - if( pWVT->bResizable ) - style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_THICKFRAME; - else - style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_BORDER; + if( pWVT->hWnd ) + { +#if (defined(_MSC_VER) && (_MSC_VER <= 1200 || defined(HB_WINCE)) || defined(__DMC__)) && !defined(HB_ARCH_64BIT) + LONG style; +#else + LONG_PTR style; +#endif + if( pWVT->bResizable ) + style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_THICKFRAME; + else + style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_BORDER; #if (defined(_MSC_VER) && (_MSC_VER <= 1200 || defined(HB_WINCE)) || defined(__DMC__)) && !defined(HB_ARCH_64BIT) - SetWindowLong( pWVT->hWnd, GWL_STYLE, style ); + SetWindowLong( pWVT->hWnd, GWL_STYLE, style ); #else - SetWindowLongPtr( pWVT->hWnd, GWL_STYLE, style ); + SetWindowLongPtr( pWVT->hWnd, GWL_STYLE, style ); #endif - - SetWindowPos( pWVT->hWnd, NULL, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DEFERERASE ); - ShowWindow( pWVT->hWnd, SW_HIDE ); - ShowWindow( pWVT->hWnd, SW_NORMAL ); + SetWindowPos( pWVT->hWnd, NULL, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DEFERERASE ); + ShowWindow( pWVT->hWnd, SW_HIDE ); + ShowWindow( pWVT->hWnd, SW_NORMAL ); + } } } break; - } + case HB_GTI_SELECTCOPY: - { pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bSelectCopy ); if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) @@ -2304,8 +2317,8 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) if( hb_itemGetCLen( pInfo->pNewVal ) ) { - HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); - if( hSysMenu ) + HMENU hSysMenu = pWVT->hWnd ? GetSystemMenu( pWVT->hWnd, FALSE ) : NULL; + if( hSysMenu || !pWVT->hWnd ) { if( pWVT->pszSelectCopy ) hb_xfree( pWVT->pszSelectCopy ); @@ -2313,6 +2326,7 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) pWVT->bSelectCopy = TRUE; #if !defined(HB_WINCE) /* WinCE does not support ModifyMenu */ + if( hSysMenu ) { LPTSTR buffer; buffer = HB_TCHAR_CONVTO( pWVT->pszSelectCopy ); @@ -2328,36 +2342,44 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) BOOL bNewValue = hb_itemGetL( pInfo->pNewVal ); if( bNewValue != pWVT->bSelectCopy ) { - HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); - if( hSysMenu ) + if( pWVT->hWnd ) { - EnableMenuItem( hSysMenu, SYS_EV_MARK, MF_BYCOMMAND | ( bNewValue ? MF_ENABLED : MF_GRAYED ) ); - pWVT->bSelectCopy = bNewValue; + HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); + if( hSysMenu ) + { + EnableMenuItem( hSysMenu, SYS_EV_MARK, MF_BYCOMMAND | ( bNewValue ? MF_ENABLED : MF_GRAYED ) ); + pWVT->bSelectCopy = bNewValue; + } } + else + pWVT->bSelectCopy = bNewValue; } } break; - } + case HB_GTI_CLOSABLE: - { pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bClosable ); if( pInfo->pNewVal ) { BOOL bNewValue = hb_itemGetL( pInfo->pNewVal ); if( bNewValue != pWVT->bClosable ) { - HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); - if( hSysMenu ) + if( pWVT->hWnd ) { - EnableMenuItem( hSysMenu, SC_CLOSE, MF_BYCOMMAND | ( bNewValue ? MF_ENABLED : MF_GRAYED ) ); - pWVT->bClosable = bNewValue; + HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE ); + if( hSysMenu ) + { + EnableMenuItem( hSysMenu, SC_CLOSE, MF_BYCOMMAND | ( bNewValue ? MF_ENABLED : MF_GRAYED ) ); + pWVT->bClosable = bNewValue; + } } + else + pWVT->bClosable = bNewValue; } } break; - } + case HB_GTI_PALETTE: - { if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) { int iIndex = hb_itemGetNI( pInfo->pNewVal ); @@ -2370,7 +2392,8 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) { pWVT->COLORS[ iIndex - 1 ] = hb_itemGetNL( pInfo->pNewVal2 ); - HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); + if( pWVT->hWnd ) + HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); } } } @@ -2392,25 +2415,25 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) for( i = 0; i < 16; i++ ) pWVT->COLORS[ i ] = hb_arrayGetNL( pInfo->pNewVal, i + 1 ); - HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); + if( pWVT->hWnd ) + HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); } } } break; - } + case HB_GTI_RESIZEMODE: - { pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->ResizeMode ); if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) { pWVT->ResizeMode = hb_itemGetNI( pInfo->pNewVal ); } break; - } + case HB_GTI_SETPOS_XY: case HB_GTI_SETPOS_ROWCOL: - { - if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) && ( hb_itemType( pInfo->pNewVal2 ) & HB_IT_NUMERIC ) ) + if( pWVT->hWnd && ( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) && + ( hb_itemType( pInfo->pNewVal2 ) & HB_IT_NUMERIC ) ) { int x, y; RECT rect = { 0,0,0,0 }; @@ -2431,7 +2454,7 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) SWP_NOSIZE + SWP_NOZORDER ) ); } break; - } + default: return HB_GTSUPER_INFO( pGT, iType, pInfo ); } @@ -2612,17 +2635,22 @@ static void hb_gt_wvt_Redraw( PHB_GT pGT, int iRow, int iCol, int iSize ) HB_TRACE( HB_TR_DEBUG, ( "hb_gt_wvt_Redraw(%p,%d,%d,%d)", pGT, iRow, iCol, iSize ) ); pWVT = HB_GTWVT_GET( pGT ); - if( pWVT && pWVT->hWnd ) + if( pWVT ) { - RECT rect; + if( pWVT->hWnd ) + { + RECT rect; - rect.top = rect.bottom = ( SHORT ) iRow; - rect.left = ( SHORT ) iCol; - rect.right = ( SHORT ) ( iCol + iSize - 1 ); + rect.top = rect.bottom = ( SHORT ) iRow; + rect.left = ( SHORT ) iCol; + rect.right = ( SHORT ) ( iCol + iSize - 1 ); - rect = hb_gt_wvt_GetXYFromColRowRect( pWVT, rect ); + rect = hb_gt_wvt_GetXYFromColRowRect( pWVT, rect ); - InvalidateRect( pWVT->hWnd, &rect, FALSE ); + InvalidateRect( pWVT->hWnd, &rect, FALSE ); + } + else + pWVT->fInit = TRUE; } } @@ -2637,10 +2665,16 @@ static void hb_gt_wvt_Refresh( PHB_GT pGT ) HB_GTSUPER_REFRESH( pGT ); pWVT = HB_GTWVT_GET( pGT ); - if( pWVT && pWVT->hWnd ) + if( pWVT ) { - SendNotifyMessage( pWVT->hWnd, WM_MY_UPDATE_CARET, 0, 0 ); - hb_gt_wvt_ProcessMessages(); + if( !pWVT->hWnd && pWVT->fInit ) + hb_gt_wvt_CreateConsoleWindow( pWVT ); + + if( pWVT->hWnd ) + { + SendNotifyMessage( pWVT->hWnd, WM_MY_UPDATE_CARET, 0, 0 ); + hb_gt_wvt_ProcessMessages(); + } } } diff --git a/harbour/source/rtl/gtwvt/gtwvt.h b/harbour/source/rtl/gtwvt/gtwvt.h index ecd78040a4..fc512a2128 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.h +++ b/harbour/source/rtl/gtwvt/gtwvt.h @@ -117,6 +117,7 @@ typedef struct int iHandle; /* window number */ HINSTANCE hInstance; /* parent window instance */ + int iCmdShow; USHORT ROWS; /* number of displayable rows in window */ USHORT COLS; /* number of displayable columns in window */ @@ -146,6 +147,7 @@ typedef struct HFONT hFont; /* current font handle */ HWND hWnd; /* the window handle */ + BOOL fInit; /* logical variable indicating that window should be open */ PHB_CODEPAGE hostCDP; /* Host/HVM CodePage for unicode output translations */ PHB_CODEPAGE inCDP; /* Host/HVM CodePage for unicode input translations */