2011-04-30 16:21 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/gtwvg/gtwvg.c
  * contrib/gtwvg/gtwvg.h
    + Implemented: GTWVT like fullScreen functionality.
This commit is contained in:
Pritpal Bedi
2011-04-30 23:25:15 +00:00
parent 2026b1a28b
commit 6521c7c3ac
3 changed files with 201 additions and 15 deletions

View File

@@ -16,6 +16,11 @@
The license applies to all entries newer than 2009-04-28.
*/
2011-04-30 16:21 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/gtwvg/gtwvg.c
* contrib/gtwvg/gtwvg.h
+ Implemented: GTWVT like fullScreen functionality.
2011-05-01 01:04 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* src/rtl/tpopuphb.prg
! non-c53 mode fix

View File

@@ -154,6 +154,7 @@ static void hb_wvt_gtSaveGuiState( PHB_GTWVT pWVT );
static void hb_wvt_gtRestGuiState( PHB_GTWVT pWVT, LPRECT rect );
static void hb_wvt_gtLoadGuiData( void );
static void hb_wvt_gtReleaseGuiData( void );
static HB_BOOL hb_gt_wvt_FullScreen( PHB_GT pGT );
static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
@@ -410,6 +411,11 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow )
pWVT->bMaximized = HB_FALSE;
pWVT->bBeingMarked = HB_FALSE;
pWVT->bBeginMarked = HB_FALSE;
pWVT->bFullScreen = HB_FALSE;
pWVT->bAltEnter = HB_FALSE;
pWVT->MarginTop = 0;
pWVT->MarginLeft = 0;
pWVT->pszSelectCopy = hb_strdup( "Mark and Copy" );
pWVT->bSelectCopy = HB_TRUE;
@@ -890,7 +896,13 @@ static HB_BOOL hb_gt_wvt_FitSize( PHB_GTWVT pWVT )
top = ( top < 0 ? 0 : top );
}
SetWindowPos( pWVT->hWnd, NULL, left, top, width, height, SWP_NOZORDER );
if( ! pWVT->bFullScreen )
SetWindowPos( pWVT->hWnd, NULL, left, top, width, height, SWP_NOZORDER );
else
{
pWVT->MarginLeft = ( wi.right - wi.left - width ) / 2;
pWVT->MarginTop = ( wi.bottom - wi.top - height ) / 2;
}
if( pWVT->CaretExist && !pWVT->CaretHidden )
hb_gt_wvt_UpdateCaret( pWVT );
@@ -900,7 +912,10 @@ static HB_BOOL hb_gt_wvt_FitSize( PHB_GTWVT pWVT )
width = ( ( int ) ( pWVT->PTEXTSIZE.x * pWVT->COLS ) ) + borderWidth;
height = ( ( int ) ( pWVT->PTEXTSIZE.y * pWVT->ROWS ) ) + borderHeight;
SetWindowPos( pWVT->hWnd, NULL, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE );
if( ! pWVT->bFullScreen )
SetWindowPos( pWVT->hWnd, NULL, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE );
if( width > maxWidth || height > maxHeight )
hb_gt_wvt_FitRows( pWVT );
}
HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS );
@@ -960,6 +975,9 @@ static void hb_gt_wvt_Maximize( PHB_GTWVT pWVT )
SetWindowLongPtr( pWVT->hWnd, GWL_STYLE, _WVT_WS_MAXED );
SetWindowPos( pWVT->hWnd, NULL, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DEFERERASE );
ShowWindow( pWVT->hWnd, SW_HIDE );
ShowWindow( pWVT->hWnd, SW_NORMAL );
}
static void hb_gt_wvt_ResetWindowSize( PHB_GTWVT pWVT )
@@ -1143,6 +1161,29 @@ static RECT hb_gt_wvt_GetColRowFromXYRect( PHB_GTWVT pWVT, RECT xy )
{
RECT colrow;
if( pWVT->bFullScreen )
{
if( xy.left >= pWVT->MarginLeft )
xy.left = xy.left - pWVT->MarginLeft;
else
xy.left = 0;
if( xy.right >= pWVT->MarginLeft )
xy.right = xy.right - pWVT->MarginLeft;
else
xy.right = 0;
if( xy.top >= pWVT->MarginTop )
xy.top = xy.top - pWVT->MarginTop;
else
xy.top = 0;
if( xy.bottom >= pWVT->MarginTop )
xy.bottom = xy.bottom - pWVT->MarginTop;
else
xy.bottom = 0;
}
colrow.left = xy.left / pWVT->PTEXTSIZE.x;
colrow.top = xy.top / pWVT->PTEXTSIZE.y;
colrow.right = xy.right / pWVT->PTEXTSIZE.x -
@@ -1422,6 +1463,14 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam,
switch( wParam )
{
case VK_RETURN:
/* in WM_CHAR i was unable to read Alt key state */
if( bAlt && pWVT->bAltEnter )
{
hb_gt_wvt_FullScreen( pWVT->pGT );
pWVT->IgnoreWM_SYSCHAR = HB_TRUE;
}
break;
case VK_LEFT:
hb_gt_wvt_TranslateKey( pWVT, K_LEFT , K_SH_LEFT , K_ALT_LEFT , K_CTRL_LEFT );
break;
@@ -1826,6 +1875,12 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT, RECT updateRect )
BeginPaint( pWVT->hWnd, &ps );
hdc = pWVT->hGuiDC;
/* for sure there is a better method for repainting not used screen area
* ExcludeClipRect()?
*/
if( pWVT->bFullScreen )
FillRect( hdc, &updateRect, CreateSolidBrush( pWVT->COLORS[ 0 ] ) );
#if defined( UNICODE )
SelectObject( hdc, pWVT->hFont );
hostCDP = pWVT->hostCDP ? pWVT->hostCDP : hb_vmCDP();
@@ -2130,6 +2185,8 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara
SetWindowLongPtr( pWVT->hWnd, GWL_STYLE, _WVT_WS_DEF );
SetWindowPos( pWVT->hWnd, NULL, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DEFERERASE );
ShowWindow( pWVT->hWnd, SW_HIDE );
ShowWindow( pWVT->hWnd, SW_NORMAL );
}
pWVT->bResizing = HB_TRUE;
return 0;
@@ -2621,6 +2678,12 @@ static HB_BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT )
}
}
if( pWVT->bFullScreen )
{
pWVT->bFullScreen = HB_FALSE;
hb_gt_wvt_FullScreen( pWVT->pGT );
}
/* Show | Update Window */
hb_gt_wvt_ShowWindow( pWVT );
@@ -2636,6 +2699,92 @@ static HB_BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT )
return HB_TRUE;
}
static HB_BOOL hb_gt_wvt_FullScreen( PHB_GT pGT )
{
PHB_GTWVT pWVT;
RECT rt;
DWORD dwStyle;
DWORD dwExtendedStyle;
#ifdef MONITOR_DEFAULTTONEAREST
HMONITOR mon;
MONITORINFO mi;
typedef HMONITOR ( WINAPI * P_MFW )( HWND, DWORD );
typedef BOOL ( WINAPI * P_GMI )( HMONITOR, LPMONITORINFO );
P_MFW pMonitorFromWindow;
P_GMI pGetMonitorInfo;
#endif
pWVT = HB_GTWVT_GET( pGT );
dwStyle = GetWindowLongPtr( pWVT->hWnd, GWL_STYLE );
dwExtendedStyle = GetWindowLongPtr( pWVT->hWnd, GWL_EXSTYLE );
if( pWVT->bFullScreen )
{
dwStyle |= WS_CAPTION | WS_BORDER;
dwExtendedStyle |= WS_EX_TOPMOST;
if( pWVT->bResizable )
dwStyle |= WS_THICKFRAME;
pWVT->MarginLeft = 0;
pWVT->MarginTop = 0;
pWVT->bFullScreen = HB_FALSE;
}
else
{
dwStyle &= ~( WS_CAPTION | WS_BORDER | WS_THICKFRAME );
dwExtendedStyle &= ~WS_EX_TOPMOST;
pWVT->bMaximized = HB_FALSE;
pWVT->bFullScreen = HB_TRUE;
}
SetWindowLongPtr( pWVT->hWnd, GWL_STYLE, dwStyle );
SetWindowLongPtr( pWVT->hWnd, GWL_EXSTYLE, dwExtendedStyle );
if( ! pWVT->bFullScreen )
{
ShowWindow( pWVT->hWnd, SW_MAXIMIZE );
hb_gt_wvt_Maximize( pWVT );
return HB_FALSE;
}
rt.left = 0;
rt.top = 0;
rt.right = 0;
rt.bottom = 0;
#ifdef MONITOR_DEFAULTTONEAREST
pMonitorFromWindow = ( P_MFW ) GetProcAddress( GetModuleHandle( TEXT( "user32.dll" ) ),
"MonitorFromWindow" );
pGetMonitorInfo = ( P_GMI ) GetProcAddress( GetModuleHandle( TEXT( "user32.dll" ) ),
"GetMonitorInfo" );
if( pMonitorFromWindow && pGetMonitorInfo )
{
mon = pMonitorFromWindow( pWVT->hWnd, MONITOR_DEFAULTTONEAREST );
mi.cbSize = sizeof( mi );
pGetMonitorInfo( mon, &mi );
rt = mi.rcMonitor;
}
else
GetClientRect( GetDesktopWindow(), &rt );
#else
GetClientRect( GetDesktopWindow(), &rt );
#endif
SetWindowPos( pWVT->hWnd, HWND_TOP, rt.left, rt.top,
rt.right - rt.left,
rt.bottom - rt.top,
SWP_FRAMECHANGED );
hb_gt_wvt_FitSizeRows( pWVT );
return HB_TRUE;
}
/* ********************************************************************** */
/*
* GT Specific Functions
@@ -2703,22 +2852,30 @@ static HB_BOOL hb_gt_wvt_SetMode( PHB_GT pGT, int iRow, int iCol )
{
if( pWVT->hWnd ) /* Is the window already open */
{
HFONT hFont = hb_gt_wvt_GetFont( pWVT->fontFace, pWVT->fontHeight, pWVT->fontWidth,
pWVT->fontWeight, pWVT->fontQuality, pWVT->CodePage );
if( hFont )
if( pWVT->bResizable && ! pWVT->bFullScreen )
{
/*
* make sure that the mode selected along with the current
* font settings will fit in the window
*/
if( hb_gt_wvt_ValidWindowSize( pWVT->hWnd, iRow, iCol, hFont, pWVT->fontWidth ) )
{
fResult = hb_gt_wvt_InitWindow( pWVT, iRow, iCol );
}
DeleteObject( hFont );
fResult = hb_gt_wvt_InitWindow( pWVT, iRow, iCol );
HB_GTSELF_REFRESH( pGT );
}
else
{
HFONT hFont = hb_gt_wvt_GetFont( pWVT->fontFace, pWVT->fontHeight, pWVT->fontWidth,
pWVT->fontWeight, pWVT->fontQuality, pWVT->CodePage );
if( hFont )
{
/*
* make sure that the mode selected along with the current
* font settings will fit in the window
*/
if( hb_gt_wvt_ValidWindowSize( pWVT->hWnd, iRow, iCol, hFont, pWVT->fontWidth ) )
{
fResult = hb_gt_wvt_InitWindow( pWVT, iRow, iCol );
}
DeleteObject( hFont );
HB_GTSELF_REFRESH( pGT );
}
}
}
else
{
@@ -2852,6 +3009,26 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
switch( iType )
{
case HB_GTI_ISFULLSCREEN:
pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bFullScreen );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_LOGICAL )
{
if( hb_itemGetL( pInfo->pNewVal ) != pWVT->bFullScreen )
{
if( pWVT->hWnd )
hb_gt_wvt_FullScreen( pGT );
else
pWVT->bFullScreen = hb_itemGetL( pInfo->pNewVal );
}
}
break;
case HB_GTI_ALTENTER:
pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bAltEnter );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_LOGICAL )
pWVT->bAltEnter = hb_itemGetL( pInfo->pNewVal );
break;
case HB_GTI_ISSCREENPOS:
case HB_GTI_KBDSUPPORT:
case HB_GTI_ISGRAPHIC:

View File

@@ -395,6 +395,10 @@ typedef struct
HB_BOOL bSelectCopy;
char * pszSelectCopy;
HB_BOOL bClosable;
HB_BOOL bFullScreen;
HB_BOOL bAltEnter; /* Can use Alt+Enter to enter full screen mode */
int MarginTop;
int MarginLeft;
int ResizeMode; /* Sets the resizing mode either to FONT or ROWS */
RECT sRectNew;