Files
harbour-core/contrib/gtwvw/wvwutils.c
Viktor Szakats 8340825fd5 2017-09-13 21:33 UTC Viktor Szakats (vszakats users.noreply.github.com)
* bin/check.hb
  * contrib/gtwvw/*
    * sync some text with the 3.4 fork
2017-09-13 21:34:26 +00:00

2532 lines
73 KiB
C

/*
* Video subsystem for Windows using GUI windows instead of Console
* with multiple windows support
* Copyright 2004 Budyanto Dj. <budyanto@centrin.net.id>
* GTWVW draw functions
* GTWVW is initially created based on:
* =Id: gtwvt.c,v 1.60 2004-01-26 08:14:07 vouchcac Exp =
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file LICENSE.txt. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "hbgtwvw.h"
HB_FUNC( WVW_YESCLOSE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
HMENU hMenu = GetSystemMenu( pWindowData->hWnd, FALSE );
if( hMenu )
{
AppendMenu( hMenu, SC_CLOSE, MF_BYCOMMAND, "" );
DrawMenuBar( pWindowData->hWnd );
}
}
HB_FUNC( WIN_SENDMESSAGE )
{
char * cText = NULL;
if( HB_ISBYREF( 4 ) )
{
cText = ( char * ) hb_xgrab( hb_parcsiz( 4 ) );
hb_xmemcpy( cText, hb_parcx( 4 ), hb_parcsiz( 4 ) );
}
hb_retnl( ( ULONG ) SendMessage( ( HWND ) HB_PARHANDLE( 1 ),
( UINT ) hb_parni( 2 ),
( HB_ISNIL( 3 ) ? 0 : ( WPARAM ) hb_parnl( 3 ) ),
( HB_ISNIL( 4 ) ? 0 : ( HB_ISBYREF( 4 ) ? ( LPARAM ) ( LPSTR ) cText :
( HB_ISCHAR( 4 ) ? ( LPARAM ) ( LPSTR ) hb_parcx( 4 ) :
( LPARAM ) hb_parnl( 4 ) ) ) ) )
);
if( HB_ISBYREF( 4 ) )
{
hb_storclen( cText, hb_parcsiz( 4 ), 4 );
hb_xfree( cText );
}
}
HB_FUNC( WIN_SENDDLGITEMMESSAGE )
{
char * cText;
PHB_ITEM pText = hb_param( 5, HB_IT_STRING );
if( pText )
{
cText = ( char * ) hb_xgrab( hb_itemGetCLen( pText ) + 1 );
hb_xmemcpy( cText, hb_itemGetCPtr( pText ), hb_itemGetCLen( pText ) + 1 );
}
else
cText = NULL;
hb_retnl( ( LONG ) SendDlgItemMessage( ( HWND ) HB_PARHANDLE( 1 ),
( int ) hb_parni( 2 ),
( UINT ) hb_parni( 3 ),
( HB_ISNIL( 4 ) ? 0 : ( WPARAM ) hb_parnl( 4 ) ),
( cText ? ( LPARAM ) cText : ( LPARAM ) hb_parnl( 5 ) )
)
);
if( pText )
hb_storclen( cText, hb_itemGetCLen( pText ), 5 );
if( cText )
hb_xfree( cText );
}
/*
*
* win_SetTimer( hWnd, nIdentifier, nTimeOut )
*/
HB_FUNC( WIN_SETTIMER )
{
hb_retl( SetTimer( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ), hb_parni( 3 ), NULL ) );
}
HB_FUNC( WIN_SETFOCUS )
{
SetFocus( ( HWND ) HB_PARHANDLE( 1 ) );
}
HB_FUNC( WIN_SETTEXTCOLOR )
{
hb_retnl( ( ULONG ) SetTextColor( ( HDC ) HB_PARHANDLE( 1 ), ( COLORREF ) hb_parnl( 2 ) ) );
}
HB_FUNC( WIN_SETBKCOLOR )
{
hb_retnl( ( ULONG ) SetBkColor( ( HDC ) HB_PARHANDLE( 1 ), ( COLORREF ) hb_parnl( 2 ) ) );
}
HB_FUNC( WVW_SETBKMODE )
{
hb_retni( ( int ) SetBkMode( ( HDC ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ) );
}
HB_FUNC( WIN_GETSTOCKOBJECT )
{
hb_retnl( ( ULONG ) GetStockObject( hb_parnl( 1 ) ) );
}
HB_FUNC( WIN_DELETEOBJECT )
{
hb_retl( DeleteObject( ( HGDIOBJ ) HB_PARHANDLE( 1 ) ) );
}
HB_FUNC( WIN_SELECTOBJECT )
{
hb_retnl( ( ULONG ) SelectObject( ( HDC ) HB_PARHANDLE( 1 ), ( HGDIOBJ ) HB_PARHANDLE( 2 ) ) );
}
HB_FUNC( WIN_MULDIV )
{
hb_retni( MulDiv( hb_parni( 1 ), hb_parni( 2 ), hb_parni( 3 ) ) );
}
HB_FUNC( WIN_GETDIALOGBASEUNITS )
{
hb_retnl( ( LONG ) GetDialogBaseUnits() );
}
HB_FUNC( WIN_SETDLGITEMTEXT )
{
SetDlgItemText( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ), hb_parc( 3 ) );
}
HB_FUNC( WIN_GETDLGITEMTEXT )
{
USHORT iLen = ( USHORT ) SendMessage( ( HWND ) GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ), ( UINT ) WM_GETTEXTLENGTH, ( WPARAM ) 0, ( LPARAM ) 0 ) + 1;
char * cText = ( char * ) hb_xgrab( iLen + 1 );
GetDlgItemText( ( HWND ) HB_PARHANDLE( 1 ),
hb_parni( 2 ),
( LPTSTR ) cText,
iLen
);
hb_retc( cText );
hb_xfree( cText );
}
HB_FUNC( WIN_CHECKDLGBUTTON )
{
hb_retl( CheckDlgButton( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ),
HB_ISNUM( 3 ) ? hb_parni( 3 ) : ( UINT ) hb_parl( 3 ) ) );
}
HB_FUNC( WIN_ISDLGBUTTONCHECKED )
{
hb_retni( IsDlgButtonChecked( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ) );
}
HB_FUNC( WIN_CHECKRADIOBUTTON )
{
hb_retl( CheckRadioButton( ( HWND ) HB_PARHANDLE( 1 ),
hb_parni( 2 ),
hb_parni( 3 ),
hb_parni( 4 )
) );
}
HB_FUNC( WIN_GETDLGITEM )
{
hb_retnl( ( ULONG ) GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ) );
}
HB_FUNC( WIN_MESSAGEBOX )
{
hb_retni( MessageBox( ( HWND ) HB_PARHANDLE( 1 ), hb_parcx( 2 ), hb_parcx( 3 ), HB_ISNIL( 4 ) ? MB_OK : hb_parni( 4 ) ) );
}
HB_FUNC( WIN_INVALIDATERECT )
{
InvalidateRect( ( HWND ) HB_PARHANDLE( 1 ), NULL, TRUE );
}
/*
*
* win_LoadIcon( ncIcon )
*/
HB_FUNC( WIN_LOADICON )
{
HICON hIcon;
if( HB_ISNUM( 1 ) )
hIcon = LoadIcon( hb_getWvwData()->hInstance, MAKEINTRESOURCE( hb_parni( 1 ) ) );
else
hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, hb_parc( 1 ), IMAGE_ICON, 0, 0, LR_LOADFROMFILE );
hb_retnl( ( ULONG ) hIcon );
}
/*
*
* win_LoadImage( ncImage, nSource ) -> hImage
* nSource == 0 ResourceIdByNumber
* nSource == 0 ResourceIdByName
* nSource == 0 ImageFromDiskFile
*/
HB_FUNC( WIN_LOADIMAGE )
{
HBITMAP hImage = NULL;
int iSource = hb_parni( 2 );
switch( iSource )
{
case 0:
hImage = LoadBitmap( hb_getWvwData()->hInstance, MAKEINTRESOURCE( hb_parni( 1 ) ) );
break;
case 1:
hImage = LoadBitmap( hb_getWvwData()->hInstance, hb_parc( 1 ) );
break;
case 2:
hImage = ( HBITMAP ) LoadImage( ( HINSTANCE ) NULL, hb_parc( 1 ), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
break;
}
hb_retnl( ( ULONG ) hImage );
}
HB_FUNC( WIN_GETCLIENTRECT )
{
RECT rc = { 0 };
PHB_ITEM info = hb_itemArrayNew( 4 );
GetClientRect( ( HWND ) HB_PARHANDLE( 1 ), &rc );
hb_arraySetNI( info, 1, rc.left );
hb_arraySetNI( info, 2, rc.top );
hb_arraySetNI( info, 3, rc.right );
hb_arraySetNI( info, 4, rc.bottom );
hb_itemReturnRelease( info );
}
/*
*
* Win_DrawImage( hdc, nLeft, nTop, nWidth, nHeight, cImage ) in Pixels
*/
/* sorry, not supported in GTWVW
HB_FUNC( WIN_DRAWIMAGE )
{
hb_retl( hb_wvt_DrawImage( ( HDC ) hb_parni( 1 ), hb_parni( 2 ), hb_parni( 3 ),
hb_parni( 4 ), hb_parni( 5 ), hb_parc( 6 ) ) );
}
*/
HB_FUNC( WIN_GETDC )
{
HB_RETHANDLE( GetDC( ( HWND ) HB_PARHANDLE( 1 ) ) );
}
HB_FUNC( WIN_RELEASEDC )
{
hb_retl( ReleaseDC( ( HWND ) HB_PARHANDLE( 1 ), ( HDC ) HB_PARHANDLE( 2 ) ) );
}
HB_FUNC( WVW_RECTANGLE )
{
Rectangle( ( HDC ) HB_PARHANDLE( 1 ), hb_parni( 2 ), hb_parni( 3 ), hb_parni( 4 ), hb_parni( 5 ) );
}
HB_FUNC( WIN_CREATEBRUSH )
{
LOGBRUSH lb = { 0 };
lb.lbStyle = hb_parni( 1 );
lb.lbColor = HB_ISNIL( 2 ) ? RGB( 0, 0, 0 ) : ( COLORREF ) hb_parnl( 2 );
lb.lbHatch = HB_ISNIL( 3 ) ? 0 : hb_parni( 3 );
hb_retnl( ( ULONG ) CreateBrushIndirect( &lb ) );
}
/*
*
* win_DrawText( hDC, cText, aRect, nFormat )
*/
HB_FUNC( WIN_DRAWTEXT )
{
RECT rc = { 0 };
rc.left = hb_parvni( 3, 1 );
rc.top = hb_parvni( 3, 2 );
rc.right = hb_parvni( 3, 3 );
rc.bottom = hb_parvni( 3, 4 );
hb_retl( DrawText( ( HDC ) HB_PARHANDLE( 1 ), hb_parc( 2 ), strlen( hb_parc( 2 ) ), &rc, hb_parni( 4 ) ) );
}
/* Adiciones a GtWVW desarrolladas por SOLUCIONES PERCEPTIVAS... */
HB_FUNC( WVW_GBCREATE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
int iOffTop, iOffLeft, iOffBottom, iOffRight;
/* int iStyle; */
UINT uiPBid;
USHORT usTop = ( USHORT ) hb_parni( 2 ),
usLeft = ( USHORT ) hb_parni( 3 ),
usBottom = ( USHORT ) hb_parni( 4 ),
usRight = ( USHORT ) hb_parni( 5 );
LPCTSTR lpszCaption = HB_ISCHAR( 6 ) ? hb_parcx( 6 ) : NULL;
char * szBitmap = HB_ISCHAR( 7 ) ? ( char * ) hb_parcx( 7 ) : NULL;
UINT uiBitmap = HB_ISNUM( 7 ) ? ( UINT ) hb_parni( 7 ) : 0;
double dStretch = ! HB_ISNIL( 10 ) ? hb_parnd( 10 ) : 1;
BOOL bMap3Dcolors = HB_ISLOG( 11 ) ? ( BOOL ) hb_parl( 11 ) : FALSE;
iOffTop = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 1 ) : -1;
iOffLeft = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 2 ) : -1;
iOffBottom = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 3 ) : +1;
iOffRight = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 4 ) : +1;
uiPBid = ButtonCreate( usWinNum, usTop, usLeft, usBottom, usRight, lpszCaption,
szBitmap, uiBitmap, hb_param( 8, HB_IT_BLOCK ),
iOffTop, iOffLeft, iOffBottom, iOffRight,
dStretch, bMap3Dcolors,
BS_TEXT | BS_GROUPBOX | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE );
hb_retnl( ( LONG ) uiPBid );
}
/* BS_TEXT | BS_GROUPBOX | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE
BS_GROUPBOX | WS_GROUP | BS_TEXT | WS_OVERLAPPED */
HB_FUNC( WVW_RBCREATE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
int iOffTop, iOffLeft, iOffBottom, iOffRight;
/* int iStyle; */
UINT uiPBid;
USHORT usTop = ( USHORT ) hb_parni( 2 ),
usLeft = ( USHORT ) hb_parni( 3 ),
usBottom = ( USHORT ) hb_parni( 4 ),
usRight = ( USHORT ) hb_parni( 5 );
LPCTSTR lpszCaption = HB_ISCHAR( 6 ) ? hb_parcx( 6 ) : NULL;
char * szBitmap = HB_ISCHAR( 7 ) ? ( char * ) hb_parcx( 7 ) : NULL;
UINT uiBitmap = HB_ISNUM( 7 ) ? ( UINT ) hb_parni( 7 ) : 0;
double dStretch = ! HB_ISNIL( 10 ) ? hb_parnd( 10 ) : 1;
BOOL bMap3Dcolors = HB_ISLOG( 11 ) ? ( BOOL ) hb_parl( 11 ) : FALSE;
if( ! HB_ISBLOCK( 8 ) )
{
hb_retnl( 0 );
return;
}
iOffTop = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 1 ) : -2;
iOffLeft = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 2 ) : -2;
iOffBottom = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 3 ) : +2;
iOffRight = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 4 ) : +2;
uiPBid = ButtonCreate( usWinNum, usTop, usLeft, usBottom, usRight, lpszCaption,
szBitmap, uiBitmap, hb_param( 8, HB_IT_BLOCK ),
iOffTop, iOffLeft, iOffBottom, iOffRight,
dStretch, bMap3Dcolors,
BS_AUTORADIOBUTTON /*| WS_GROUP*/ );
hb_retnl( ( LONG ) uiPBid );
}
HB_FUNC( WVW_SETCONTROLTEXT )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT uiCtrlId = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
byte bStyle;
HWND hWndPB = FindControlHandle( usWinNum, WVW_CONTROL_PUSHBUTTON, uiCtrlId, &bStyle );
if( uiCtrlId == 0 || hWndPB == NULL )
return;
SetWindowText( hWndPB, hb_parcx( 3 ) );
hb_retl( TRUE );
}
HB_FUNC( WVW_PBVISIBLE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT uiCtrlId = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
BOOL bEnable = HB_ISNIL( 3 ) ? TRUE : hb_parl( 3 );
byte bStyle;
HWND hWndPB = FindControlHandle( usWinNum, WVW_CONTROL_PUSHBUTTON, uiCtrlId, &bStyle );
int iCmdShow;
if( uiCtrlId == 0 || hWndPB == NULL )
{
hb_retl( FALSE );
return;
}
if( bEnable )
iCmdShow = SW_SHOW;
else
iCmdShow = SW_HIDE;
hb_retl( ShowWindow( hWndPB, iCmdShow ) == 0 );
}
HB_FUNC( WVW_CBVISIBLE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT uiCtrlId = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
BOOL bEnable = HB_ISNIL( 3 ) ? TRUE : hb_parl( 3 );
byte bStyle;
HWND hWndCB = FindControlHandle( usWinNum, WVW_CONTROL_COMBOBOX, uiCtrlId, &bStyle );
int iCmdShow;
if( hWndCB )
{
if( bEnable )
iCmdShow = SW_SHOW;
else
iCmdShow = SW_HIDE;
hb_retl( ShowWindow( hWndCB, iCmdShow ) == 0 );
}
else
hb_retl( FALSE );
}
HB_FUNC( WVW_CXVISIBLE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT uiCtrlId = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
BOOL bEnable = HB_ISNIL( 3 ) ? TRUE : hb_parl( 3 );
byte bStyle;
HWND hWndPB = FindControlHandle( usWinNum, WVW_CONTROL_PUSHBUTTON, uiCtrlId, &bStyle );
int iCmdShow;
if( uiCtrlId == 0 || hWndPB == NULL )
{
hb_retl( FALSE );
return;
}
if( bEnable )
iCmdShow = SW_SHOW;
else
iCmdShow = SW_HIDE;
hb_retl( ShowWindow( hWndPB, iCmdShow ) == 0 );
}
/* wvw_xbVisible( [nWinNum], nXBid, lShow )
* show/hide scrollbar nXBid in window nWinNum (default to topmost window)
* nWinNum better be NIL
* nXBid is the handle of the scrolbar
* lShow: .T. shows the scrolbar (default)
* .F. hides the scrolbar
* returns .t. if successful
*/
HB_FUNC( WVW_XBVISIBLE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT uiXBid = ( UINT ) ( HB_ISNIL( 2 ) ? 0 : hb_parni( 2 ) );
BOOL bShow = ( BOOL ) ( HB_ISLOG( 3 ) ? hb_parl( 3 ) : TRUE );
byte bStyle;
HWND hWndXB = uiXBid == 0 ? NULL : FindControlHandle( usWinNum, WVW_CONTROL_SCROLLBAR, uiXBid, &bStyle );
if( uiXBid == 0 || hWndXB == NULL )
{
hb_retl( FALSE );
return;
}
hb_retl( ShowScrollBar( hWndXB, SB_CTL, bShow ) );
}
HB_FUNC( WVW_MOUSE_COL )
{
WVW_DATA * pData = hb_getWvwData();
if( pData )
{
if( hb_gt_wvw_GetMainCoordMode() )
hb_retni( hb_gt_wvwGetMouseX( pData->s_pWindows[ pData->s_usNumWindows - 1 ] ) + hb_gt_wvwColOfs( pData->s_usNumWindows - 1 ) );
else
hb_retni( hb_gt_wvwGetMouseX( pData->s_pWindows[ pData->s_usCurWindow ] ) );
}
else
hb_retni( 0 );
}
HB_FUNC( WVW_MOUSE_ROW )
{
WVW_DATA * pData = hb_getWvwData();
if( pData )
{
if( hb_gt_wvw_GetMainCoordMode() )
hb_retni( hb_gt_wvwGetMouseY( pData->s_pWindows[ pData->s_usNumWindows - 1 ] ) + hb_gt_wvwRowOfs( pData->s_usNumWindows - 1 ) );
else
hb_retni( hb_gt_wvwGetMouseY( pData->s_pWindows[ pData->s_usCurWindow ] ) );
}
else
hb_retni( 0 );
}
HB_FUNC( SENDMESSAGE )
{
hb_retnl( ( LONG ) SendMessage(
( HWND ) HB_PARHANDLE( 1 ), /* handle of destination window */
( UINT ) hb_parni( 2 ), /* message to send */
( WPARAM ) hb_parnl( 3 ), /* first message parameter */
( HB_ISCHAR( 4 ) ) ? ( LPARAM ) hb_parc( 4 ) :
( LPARAM ) hb_parnl( 4 ) /* second message parameter */
) );
}
HB_FUNC( SETPARENT )
{
UINT usWinNum = WVW_WHICH_WINDOW;
UINT usWinNum1 = HB_ISNIL( 2 ) ? ( hb_gt_wvw_GetMainCoordMode() ? ( ( hb_gt_wvw_GetNumWindows() ) - 1 ) : hb_gt_wvw_GetCurWindow() ) : ( ( USHORT ) hb_parni( 2 ) );
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
WIN_DATA * pWindowData1 = hb_gt_wvw_GetWindowsData( usWinNum1 );
HWND hWndParent = pWindowData->hWnd;
HWND hWndParent1 = pWindowData1->hWnd;
if( usWinNum1 != 0 )
SetParent( hWndParent, hWndParent1 );
}
HB_FUNC( BRINGTOTOP1 )
{
HWND hWnd = ( HWND ) HB_PARHANDLE( 1 );
#if 0
DWORD ForegroundThreadID;
DWORD ThisThreadID;
DWORD timeout;
#endif
if( IsIconic( hWnd ) )
{
ShowWindow( hWnd, SW_RESTORE );
hb_retl( TRUE );
return;
}
BringWindowToTop( hWnd ); /* IE 5.5 related hack */
SetForegroundWindow( hWnd );
}
HB_FUNC( ISWINDOW )
{
hb_retl( IsWindow( ( HWND ) HB_PARHANDLE( 1 ) ) );
}
HB_FUNC( ADDTOOLTIPEX ) /* changed by MAG */
{
/* HWND hWnd = ( HWND ) hb_parnl( 1 ); */
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
WVW_DATA * pData = hb_getWvwData();
int iStyle = TTS_ALWAYSTIP;
INITCOMMONCONTROLSEX icex = { 0 };
TOOLINFO ti = { 0 };
/* Load the tooltip class from the DLL.
*/
icex.dwSize = sizeof( icex );
icex.dwICC = ICC_BAR_CLASSES;
if( ! InitCommonControlsEx( &icex ) )
{
}
#if 0
if( lToolTipBalloon )
{
iStyle = iStyle | TTS_BALLOON;
}
#endif
if( ! pData->hWndTT )
pData->hWndTT = CreateWindow( TOOLTIPS_CLASS, ( LPSTR ) NULL, iStyle,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, ( HMENU ) NULL, GetModuleHandle( NULL ), NULL );
if( ! pData->hWndTT )
{
hb_retnl( 0 );
return;
}
ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND;
ti.hwnd = pWindowData->hWnd;
ti.uId = ( UINT ) hb_parnl( 2 );
/* ti.uId = ( UINT ) GetDlgItem( hWnd, hb_parni( 2 ) ); */
ti.hinst = GetModuleHandle( NULL );
ti.lpszText = ( LPSTR ) hb_parc( 3 );
hb_retl( SendMessage( pData->hWndTT, TTM_ADDTOOL, 0, ( LPARAM ) ( LPTOOLINFO ) &ti ) );
}
/*
* CreateImageList( array, cx, cy, nGrow, flags )
*/
HB_FUNC( CREATEIMAGELIST )
{
PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY );
UINT flags = HB_ISNIL( 5 ) ? ILC_COLOR : hb_parni( 5 );
HIMAGELIST himl;
ULONG ul, ulLen = hb_arrayLen( pArray );
HBITMAP hbmp;
himl = ImageList_Create( hb_parni( 2 ), hb_parni( 3 ), flags,
ulLen, hb_parni( 4 ) );
for( ul = 1; ul <= ulLen; ul++ )
{
hbmp = ( HBITMAP ) hb_arrayGetNL( pArray, ul );
ImageList_Add( himl, hbmp, ( HBITMAP ) NULL );
DeleteObject( hbmp );
}
HB_RETHANDLE( himl );
}
HB_FUNC( IMAGELIST_ADD )
{
hb_retnl( ImageList_Add( ( HIMAGELIST ) HB_PARHANDLE( 1 ), ( HBITMAP ) HB_PARHANDLE( 2 ), ( HBITMAP ) NULL ) );
}
HB_FUNC( IMAGELIST_ADDMASKED )
{
hb_retnl( ImageList_AddMasked( ( HIMAGELIST ) HB_PARHANDLE( 1 ), ( HBITMAP ) HB_PARHANDLE( 2 ), ( COLORREF ) hb_parnl( 3 ) ) );
}
HB_FUNC( GETBITMAPSIZE )
{
BITMAP bitmap;
PHB_ITEM aMetr = hb_itemArrayNew( 3 );
GetObject( ( HBITMAP ) HB_PARHANDLE( 1 ), sizeof( BITMAP ), ( LPVOID ) &bitmap );
hb_arraySetNL( aMetr, 1, bitmap.bmWidth );
hb_arraySetNL( aMetr, 2, bitmap.bmHeight );
hb_arraySetNL( aMetr, 3, bitmap.bmBitsPixel );
hb_itemReturnRelease( aMetr );
}
HB_FUNC( GETICONSIZE )
{
ICONINFO iinfo;
PHB_ITEM aMetr = hb_itemArrayNew( 2 );
GetIconInfo( ( HICON ) HB_PARHANDLE( 1 ), &iinfo );
hb_arraySetNL( aMetr, 1, iinfo.xHotspot * 2 );
hb_arraySetNL( aMetr, 2, iinfo.yHotspot * 2 );
hb_itemReturnRelease( aMetr );
}
HB_FUNC( LOADIMAGE )
{
if( HB_ISNUM( 2 ) )
hb_retnl( ( LONG )
LoadImage( hb_getWvwData()->hInstance, /* HB_ISNIL( 1 ) ? GetModuleHandle(NULL) : (HINSTANCE) hb_parnl( 1 ), handle of the instance that contains the image */
( LPCTSTR ) MAKEINTRESOURCE( hb_parnl( 2 ) ), /* name or identifier of image */
( UINT ) hb_parni( 3 ), /* type of image */
hb_parni( 4 ), /* desired width */
hb_parni( 5 ), /* desired height */
( UINT ) hb_parni( 6 ) /* load flags */
) );
else
HB_RETHANDLE(
LoadImage( ( HINSTANCE ) hb_parnl( 1 ), /* handle of the instance that contains the image */
( LPCTSTR ) hb_parc( 2 ), /* name or identifier of image */
( UINT ) hb_parni( 3 ), /* type of image */
hb_parni( 4 ), /* desired width */
hb_parni( 5 ), /* desired height */
( UINT ) hb_parni( 6 ) /* load flags */
) );
}
HB_FUNC( LOADBITMAP )
{
if( HB_ISNUM( 1 ) )
{
if( ! HB_ISNIL( 2 ) && hb_parl( 2 ) )
/* hb_retnl( (LONG) LoadBitmap( GetModuleHandle( NULL ), MAKEINTRESOURCE(hb_parnl( 1 ) )) ); */
HB_RETHANDLE( LoadBitmap( NULL, ( LPCTSTR ) hb_parnl( 1 ) ) );
else
HB_RETHANDLE( LoadBitmap( GetModuleHandle( NULL ), ( LPCTSTR ) hb_parnl( 1 ) ) );
}
else
HB_RETHANDLE( LoadBitmap( GetModuleHandle( NULL ), ( LPCTSTR ) hb_parc( 1 ) ) );
}
HB_FUNC( LOADBITMAPEX )
{
HINSTANCE h = HB_ISNUM( 1 ) ? ( HINSTANCE ) hb_parnl( 1 ) : GetModuleHandle( NULL );
if( HB_ISNUM( 1 ) && HB_ISNUM( 2 ) )
{
if( ! HB_ISNIL( 3 ) && hb_parl( 3 ) )
/* hb_retnl( (LONG) LoadBitmap( h, MAKEINTRESOURCE(hb_parnl( 2 ) )) ); */
HB_RETHANDLE( LoadBitmap( h, ( LPCTSTR ) hb_parnl( 3 ) ) );
else
HB_RETHANDLE( LoadBitmap( ( HINSTANCE ) h, ( LPCTSTR ) hb_parnl( 2 ) ) );
}
else
HB_RETHANDLE( LoadBitmap( h, ( LPCTSTR ) hb_parc( 2 ) ) );
}
HB_FUNC( OPENIMAGE )
{
const char * cFileName = hb_parc( 1 );
BOOL lString = HB_ISNIL( 2 ) ? 0 : hb_parl( 2 );
int iFileSize;
FILE * fp;
/* IPicture * pPic; */
LPPICTURE pPic;
IStream * pStream;
HGLOBAL hG;
HBITMAP hBitmap = 0;
if( lString )
{
iFileSize = hb_parclen( 1 );
hG = GlobalAlloc( GPTR, iFileSize );
if( ! hG )
{
hb_retnl( 0 );
return;
}
memcpy( ( void * ) hG, ( void * ) cFileName, iFileSize );
}
else
{
fp = fopen( cFileName, "rb" );
if( ! fp )
{
hb_retnl( 0 );
return;
}
fseek( fp, 0, SEEK_END );
iFileSize = ftell( fp );
hG = GlobalAlloc( GPTR, iFileSize );
if( ! hG )
{
fclose( fp );
hb_retnl( 0 );
return;
}
fseek( fp, 0, SEEK_SET );
fread( ( void * ) hG, 1, iFileSize, fp );
fclose( fp );
}
CreateStreamOnHGlobal( hG, 0, &pStream );
if( ! pStream )
{
GlobalFree( hG );
hb_retnl( 0 );
return;
}
#if 0
#if defined( __cplusplus )
OleLoadPicture( pStream, 0, 0, &IID_IPicture, ( void ** ) &pPic );
pStream->Release();
#else
OleLoadPicture( pStream, 0, 0, &IID_IPicture, ( void ** ) &pPic );
pStream->lpVtbl->Release( pStream );
#endif
#endif
GlobalFree( hG );
if( ! pPic )
{
hb_retnl( 0 );
return;
}
#if 0
#if defined( __cplusplus )
pPic->get_Handle( ( OLE_HANDLE * ) &hBitmap );
#else
pPic->lpVtbl->get_Handle( pPic, ( OLE_HANDLE * ) &hBitmap );
#endif
#endif
hb_retnl( ( LONG ) CopyImage( hBitmap, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG ) );
#if 0
#if defined( __cplusplus )
pPic->Release();
#else
pPic->lpVtbl->Release( pPic );
#endif
#endif
}
HB_FUNC( OPENBITMAP )
{
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
LPBITMAPINFO lpbmi;
DWORD dwRead;
LPVOID lpvBits;
HGLOBAL hmem1, hmem2;
HBITMAP hbm;
HDC hDC = ( hb_pcount() > 1 && ! HB_ISNIL( 2 ) ) ? ( HDC ) HB_PARHANDLE( 2 ) : NULL;
HANDLE hfbm = CreateFile( hb_parc( 1 ), GENERIC_READ, FILE_SHARE_READ,
( LPSECURITY_ATTRIBUTES ) NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY, ( HANDLE ) NULL );
if( ( ( long int ) hfbm ) <= 0 )
{
HB_RETHANDLE( NULL );
return;
}
/* Retrieve the BITMAPFILEHEADER structure. */
ReadFile( hfbm, &bmfh, sizeof( BITMAPFILEHEADER ), &dwRead, NULL );
/* Retrieve the BITMAPFILEHEADER structure. */
ReadFile( hfbm, &bmih, sizeof( BITMAPINFOHEADER ), &dwRead, NULL );
/* Allocate memory for the BITMAPINFO structure. */
hmem1 = GlobalAlloc( GHND, sizeof( BITMAPINFOHEADER ) +
( ( 1 << bmih.biBitCount ) * sizeof( RGBQUAD ) ) );
lpbmi = ( LPBITMAPINFO ) GlobalLock( hmem1 );
/* Load BITMAPINFOHEADER into the BITMAPINFO structure. */
lpbmi->bmiHeader.biSize = bmih.biSize;
lpbmi->bmiHeader.biWidth = bmih.biWidth;
lpbmi->bmiHeader.biHeight = bmih.biHeight;
lpbmi->bmiHeader.biPlanes = bmih.biPlanes;
lpbmi->bmiHeader.biBitCount = bmih.biBitCount;
lpbmi->bmiHeader.biCompression = bmih.biCompression;
lpbmi->bmiHeader.biSizeImage = bmih.biSizeImage;
lpbmi->bmiHeader.biXPelsPerMeter = bmih.biXPelsPerMeter;
lpbmi->bmiHeader.biYPelsPerMeter = bmih.biYPelsPerMeter;
lpbmi->bmiHeader.biClrUsed = bmih.biClrUsed;
lpbmi->bmiHeader.biClrImportant = bmih.biClrImportant;
/* Retrieve the color table.
* 1 << bmih.biBitCount == 2 ^ bmih.biBitCount
*/
switch( bmih.biBitCount )
{
case 1:
case 4:
case 8:
ReadFile( hfbm, lpbmi->bmiColors,
( ( 1 << bmih.biBitCount ) * sizeof( RGBQUAD ) ),
&dwRead, ( LPOVERLAPPED ) NULL );
break;
case 16:
case 32:
if( bmih.biCompression == BI_BITFIELDS )
ReadFile( hfbm, lpbmi->bmiColors,
( 3 * sizeof( RGBQUAD ) ),
&dwRead, ( LPOVERLAPPED ) NULL );
break;
case 24:
break;
}
/* Allocate memory for the required number of bytes. */
hmem2 = GlobalAlloc( GHND, ( bmfh.bfSize - bmfh.bfOffBits ) );
lpvBits = GlobalLock( hmem2 );
/* Retrieve the bitmap data. */
ReadFile( hfbm, lpvBits, ( bmfh.bfSize - bmfh.bfOffBits ), &dwRead, NULL );
if( ! hDC )
hDC = GetDC( 0 );
/* Create a bitmap from the data stored in the .BMP file. */
hbm = CreateDIBitmap( hDC, &bmih, CBM_INIT, lpvBits, lpbmi, DIB_RGB_COLORS );
if( hb_pcount() < 2 || HB_ISNIL( 2 ) )
ReleaseDC( 0, hDC );
/* Unlock the global memory objects and close the .BMP file. */
GlobalUnlock( hmem1 );
GlobalUnlock( hmem2 );
GlobalFree( hmem1 );
GlobalFree( hmem2 );
CloseHandle( hfbm );
HB_RETHANDLE( hbm );
}
HB_FUNC( SETTEXTCOLOR )
{
COLORREF crColor = SetTextColor(
( HDC ) HB_PARHANDLE( 1 ), /* handle of device context */
( COLORREF ) hb_parnl( 2 ) /* text color */
);
hb_retnl( ( LONG ) crColor );
}
HB_FUNC( SETBKCOLOR )
{
COLORREF crColor = SetBkColor(
( HDC ) HB_PARHANDLE( 1 ), /* handle of device context */
( COLORREF ) hb_parnl( 2 ) /* text color */
);
hb_retnl( ( LONG ) crColor );
}
HB_FUNC( CREATESOLIDBRUSH )
{
HB_RETHANDLE( CreateSolidBrush(
( COLORREF ) hb_parnl( 1 ) /* brush color */
) );
}
HB_FUNC( CREATEHATCHBRUSH )
{
HB_RETHANDLE( CreateHatchBrush(
hb_parni( 1 ), ( COLORREF ) hb_parnl( 2 ) ) );
}
HB_FUNC( RGB )
{
hb_retnl( RGB( hb_parni( 1 ), hb_parni( 2 ), hb_parni( 3 ) ) );
}
HB_FUNC( GETSYSCOLOR )
{
hb_retnl( ( LONG ) GetSysColor( hb_parni( 1 ) ) );
}
HB_FUNC( REDRAWWINDOW )
{
RedrawWindow(
( HWND ) HB_PARHANDLE( 1 ), /* handle of window */
NULL, /* address of structure with update rectangle */
NULL, /* handle of update region */
( UINT ) hb_parni( 2 ) /* array of redraw flags */
);
}
/* CreateFont( fontName, nWidth, hHeight [,fnWeight] [,fdwCharSet],
[,fdwItalic] [,fdwUnderline] [,fdwStrikeOut] )
*/
HB_FUNC( CREATEFONT )
{
HFONT hFont;
int fnWeight = HB_ISNIL( 4 ) ? 0 : hb_parni( 4 );
DWORD fdwCharSet = HB_ISNIL( 5 ) ? 0 : hb_parnl( 5 );
DWORD fdwItalic = HB_ISNIL( 6 ) ? 0 : hb_parnl( 6 );
DWORD fdwUnderline = HB_ISNIL( 7 ) ? 0 : hb_parnl( 7 );
DWORD fdwStrikeOut = HB_ISNIL( 8 ) ? 0 : hb_parnl( 8 );
hFont = CreateFont(
hb_parni( 3 ), /* logical height of font */
hb_parni( 2 ), /* logical average character width */
0, /* angle of escapement */
0, /* base-line orientation angle */
fnWeight, /* font weight */
fdwItalic, /* italic attribute flag */
fdwUnderline, /* underline attribute flag */
fdwStrikeOut, /* strikeout attribute flag */
fdwCharSet, /* character set identifier */
0, /* output precision */
0, /* clipping precision */
0, /* output quality */
0, /* pitch and family */
( LPCTSTR ) hb_parc( 1 ) /* pointer to typeface name string */
);
HB_RETHANDLE( hFont );
}
HB_FUNC( SELECTFONT )
{
CHOOSEFONT cf;
LOGFONT lf;
HFONT hfont;
PHB_ITEM pObj = HB_ISNIL( 1 ) ? NULL : hb_param( 1, HB_IT_OBJECT );
/* PHB_ITEM temp1; */
PHB_ITEM aMetr = hb_itemArrayNew( 9 );
cf.lStructSize = sizeof( CHOOSEFONT );
cf.hwndOwner = ( HWND ) NULL;
cf.hDC = ( HDC ) NULL;
cf.lpLogFont = &lf;
cf.iPointSize = 0;
cf.Flags = CF_SCREENFONTS | ( ( pObj ) ? CF_INITTOLOGFONTSTRUCT : 0 );
cf.rgbColors = RGB( 0, 0, 0 );
cf.lCustData = 0L;
cf.lpfnHook = ( LPCFHOOKPROC ) NULL;
cf.lpTemplateName = ( LPSTR ) NULL;
cf.hInstance = ( HINSTANCE ) NULL;
cf.lpszStyle = ( LPSTR ) NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
/* Display the CHOOSEFONT common-dialog box. */
if( ! ChooseFont( &cf ) )
{
hb_itemRelease( aMetr );
hb_ret();
return;
}
/* Create a logical font based on the user's */
/* selection and return a handle identifying */
/* that font. */
hfont = CreateFontIndirect( cf.lpLogFont );
hb_arraySetNInt( aMetr, 1, ( HB_PTRUINT ) hfont );
hb_arraySetC( aMetr, 2, lf.lfFaceName );
hb_arraySetNL( aMetr, 3, lf.lfWidth );
hb_arraySetNL( aMetr, 4, lf.lfHeight );
hb_arraySetNL( aMetr, 5, lf.lfWeight );
hb_arraySetNI( aMetr, 6, lf.lfCharSet );
hb_arraySetNI( aMetr, 7, lf.lfItalic );
hb_arraySetNI( aMetr, 8, lf.lfUnderline );
hb_arraySetNI( aMetr, 9, lf.lfStrikeOut );
hb_itemReturnRelease( aMetr );
}
HB_FUNC( INVALIDATERECT )
{
RECT rc;
if( hb_pcount() > 2 )
{
rc.left = hb_parni( 3 );
rc.top = hb_parni( 4 );
rc.right = hb_parni( 5 );
rc.bottom = hb_parni( 6 );
}
InvalidateRect(
( HWND ) HB_PARHANDLE( 1 ), /* handle of window with changed update region */
( hb_pcount() > 2 ) ? &rc : NULL, /* address of rectangle coordinates */
hb_parni( 2 ) /* erase-background flag */
);
}
HB_FUNC( TOOLBARADDBUTTONS )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
HWND hWndCtrl = ( HWND ) HB_PARHANDLE( 2 );
/* HWND hToolTip = ( HWND ) hb_parnl( 5 ) ; */
PHB_ITEM pArray = hb_param( 3, HB_IT_ARRAY );
int iButtons = hb_parni( 4 );
TBBUTTON * tb = ( struct _TBBUTTON * ) hb_xgrab( iButtons * sizeof( TBBUTTON ) );
PHB_ITEM pTemp;
/* BOOL bSystem; */
ULONG ulCount;
ULONG ulID;
DWORD style = GetWindowLong( hWndCtrl, GWL_STYLE );
USHORT usOldHeight;
SetWindowLong( hWndCtrl, GWL_STYLE, style | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT );
SendMessage( hWndCtrl, TB_BUTTONSTRUCTSIZE, sizeof( TBBUTTON ), 0L );
usOldHeight = pWindowData->usTBHeight;
for( ulCount = 0; ( ulCount < hb_arrayLen( pArray ) ); ulCount++ )
{
pTemp = hb_arrayGetItemPtr( pArray, ulCount + 1 );
ulID = hb_arrayGetNI( pTemp, 1 );
/* bSystem = hb_arrayGetL( pTemp, 9 ); */
#if 0
if( bSystem )
if( ulID > 0 && ulID < 31 )
{
tb[ ulCount ].iBitmap = ulID > 0 ? ( int ) ulID : -1;
}
else
{
tb[ ulCount ].iBitmap = ulID > 0 ? ( int ) ulCount : -1;
}
#endif
tb[ ulCount ].idCommand = hb_arrayGetNI( pTemp, 2 );
tb[ ulCount ].fsState = ( BYTE ) hb_arrayGetNI( pTemp, 3 );
tb[ ulCount ].fsStyle = ( BYTE ) hb_arrayGetNI( pTemp, 4 );
tb[ ulCount ].dwData = hb_arrayGetNI( pTemp, 5 );
tb[ ulCount ].iString = hb_arrayGetCLen( pTemp, 6 ) > 0 ? ( int ) hb_arrayGetCPtr( pTemp, 6 ) : 0;
}
SendMessage( hWndCtrl, TB_ADDBUTTONS, ( WPARAM ) iButtons, ( LPARAM ) ( LPTBBUTTON ) tb );
SendMessage( hWndCtrl, TB_AUTOSIZE, 0, 0 );
hb_gt_wvwTBinitSize( pWindowData, hWndCtrl );
if( pWindowData->usTBHeight != usOldHeight )
hb_gt_wvwResetWindow( usWinNum );
hb_xfree( tb );
}
HB_FUNC( SETBITMAPRESOURCEID )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
TBADDBITMAP tbab;
HBITMAP hBitmap = ( HBITMAP ) HB_PARHANDLE( 3 );
UINT uiBitmap = ( UINT ) hb_parni( 4 );
HWND hWndToolbar = pWindowData->hToolBar;
int iNewBitmap;
int iBitmapType = hb_parni( 2 );
int iOffset;
switch( iBitmapType )
{
case 0:
iOffset = 0;
break;
case 1:
iOffset = pWindowData->iStartStdBitmap;
break;
case 2:
iOffset = pWindowData->iStartViewBitmap;
break;
case 3:
iOffset = pWindowData->iStartHistBitmap;
break;
default:
iOffset = 0;
break;
}
if( iBitmapType == 0 )
{
tbab.hInst = NULL;
tbab.nID = ( UINT ) hBitmap;
iNewBitmap = SendMessage( hWndToolbar, TB_ADDBITMAP, ( WPARAM ) 1, ( WPARAM ) &tbab );
}
else /* system bitmap */
iNewBitmap = ( int ) uiBitmap + iOffset;
hb_retni( iNewBitmap );
}
HB_FUNC( DRAWICON )
{
DrawIcon( ( HDC ) HB_PARHANDLE( 1 ), hb_parni( 3 ), hb_parni( 4 ), ( HICON ) HB_PARHANDLE( 2 ) );
}
HB_FUNC( LOADICON )
{
if( HB_ISNUM( 1 ) )
HB_RETHANDLE( LoadIcon( NULL, ( LPCTSTR ) hb_parnl( 1 ) ) );
else
HB_RETHANDLE( LoadIcon( GetModuleHandle( NULL ), ( LPCTSTR ) hb_parc( 1 ) ) );
}
HB_FUNC( DRAWBITMAP )
{
HDC hDC = ( HDC ) HB_PARHANDLE( 1 );
HDC hDCmem = CreateCompatibleDC( hDC );
DWORD dwraster = HB_ISNIL( 3 ) ? SRCCOPY : hb_parnl( 3 );
HBITMAP hBitmap = ( HBITMAP ) HB_PARHANDLE( 2 );
BITMAP bitmap;
int nWidthDest = ( hb_pcount() >= 5 && ! HB_ISNIL( 6 ) ) ? hb_parni( 6 ) : 0;
int nHeightDest = ( hb_pcount() >= 6 && ! HB_ISNIL( 7 ) ) ? hb_parni( 7 ) : 0;
SelectObject( hDCmem, hBitmap );
GetObject( hBitmap, sizeof( BITMAP ), ( LPVOID ) &bitmap );
if( nWidthDest && ( nWidthDest != bitmap.bmWidth || nHeightDest != bitmap.bmHeight ) )
StretchBlt( hDC, hb_parni( 4 ), hb_parni( 5 ), nWidthDest, nHeightDest, hDCmem,
0, 0, bitmap.bmWidth, bitmap.bmHeight, dwraster );
else
BitBlt( hDC, hb_parni( 4 ), hb_parni( 5 ), bitmap.bmWidth, bitmap.bmHeight, hDCmem, 0, 0, dwraster );
DeleteDC( hDCmem );
}
HB_FUNC( WINDOW2BITMAP )
{
HWND hWnd = ( HWND ) HB_PARHANDLE( 1 );
BOOL lFull = HB_ISNIL( 2 ) ? 0 : ( BOOL ) hb_parl( 2 );
HDC hDC = lFull ? GetWindowDC( hWnd ) : GetDC( hWnd );
HDC hDCmem = CreateCompatibleDC( hDC );
HBITMAP hBitmap;
RECT rc;
if( lFull )
GetWindowRect( hWnd, &rc );
else
GetClientRect( hWnd, &rc );
hBitmap = CreateCompatibleBitmap( hDC, rc.right - rc.left, rc.bottom - rc.top );
SelectObject( hDCmem, hBitmap );
BitBlt( hDCmem, 0, 0, rc.right - rc.left, rc.bottom - rc.top, hDC, 0, 0, SRCCOPY );
DeleteDC( hDCmem );
DeleteDC( hDC );
HB_RETHANDLE( hBitmap );
}
/* wvw_SetMaxBMCache([nMax])
Get/Set maximum user-bitmap cache (default is 20, minimum is 1).
Returns old setting of maximum user-bitmap cache.
Description:
To minimize bitmap loading operation, wvw_drawimage caches bitmap once
it reads from disk.
Ie., subsequent wvw_drawimage will use the bitmap from the memory.
When the maximum number of cache is used, the least recently opened bitmap
will be discarded from the cache.
Remarks:
There is no way to discard a specific bitmap from the cache.
If you want to control bitmap caching manually, use wvw_LoadPicture()
instead.
Example:
wvw_SetMaxBMCache(1) :: this will cache one bitmap only
wvw_SetMaxBMCache(50) :: allows up to 50 bitmap stored in the cache
*/
HB_FUNC( WVW_SETMAXBMCACHE )
{
WVW_DATA * p = hb_getWvwData();
UINT uiOldMaxBMcache = 0;
if( p )
{
uiOldMaxBMcache = p->s_sApp->uiMaxBMcache;
if( ! HB_ISNIL( 1 ) )
p->s_sApp->uiMaxBMcache = ( UINT ) hb_parni( 1 );
}
hb_retni( uiOldMaxBMcache );
}
/* wvw_NumBMCache()
Returns current number of user-bitmap cache.
*/
HB_FUNC( WVW_NUMBMCACHE )
{
WVW_DATA * p = hb_getWvwData();
hb_retni( p ? p->s_sApp->uiBMcache : 0 );
}
/* */
/* Miscellaneous xHarbour callable functions */
/* Budyanto Dj. <budyanto@centrin.net.id> */
/* */
/* TIMER */
/*wvw_SetTimer([nWinNum], nInterval)
* set timer event for every nInterval millisec
*(effective only if WVW_TIMER() function exists)
* eg. it can be usefull to update clock on status bar
* returns .t. if successfull
*/
/*20040602: WARNING: WVT is slightly different*/
HB_FUNC( WVW_SETTIMER )
{
WVW_DATA * p = hb_getWvwData();
if( p && p->s_sApp->pSymWVW_TIMER )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
SetTimer( pWindowData->hWnd, WVW_ID_BASE_TIMER + usWinNum, ( UINT ) hb_parni( 2 ), NULL );
hb_retl( TRUE );
}
else
hb_retl( FALSE );
}
/*wvw_KillTimer([nWinNum])
* kill the timer event handler for window nWinNum
* returns .t. if successfull
*/
/*20040602: WARNING: WVT is slightly different */
HB_FUNC( WVW_KILLTIMER )
{
WVW_DATA * p = hb_getWvwData();
if( p && p->s_sApp->pSymWVW_TIMER )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
KillTimer( pWindowData->hWnd, WVW_ID_BASE_TIMER + usWinNum );
hb_retl( TRUE );
}
else
hb_retl( FALSE );
}
/*wvw_GetPaintRect( nWinNum ) nWinNum is 0 based */
/*returns array of paint pending rect {top, left, bottom, right} */
/*WARNING: */
/*unlike WVT, top maybe > bottom */
/* left maybe > right */
/*in these cases, no paint request is pending */
/*(in WVT these is reflected in {0,0,0,0}) */
HB_FUNC( WVW_GETPAINTRECT )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
RECT rPaintRect = pWindowData->rPaintPending;
PHB_ITEM info = hb_itemArrayNew( 4 );
hb_arraySetNI( info, 1, rPaintRect.top );
hb_arraySetNI( info, 2, rPaintRect.left );
hb_arraySetNI( info, 3, rPaintRect.bottom );
hb_arraySetNI( info, 4, rPaintRect.right );
hb_itemReturnRelease( info );
}
HB_FUNC( WVW_SETPOINTER )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
int iCursor = hb_parni( 2 );
HCURSOR hCursor;
switch( iCursor )
{
case 1:
hCursor = LoadCursor( NULL, IDC_ARROW );
break;
case 2:
hCursor = LoadCursor( NULL, IDC_IBEAM );
break;
case 3:
hCursor = LoadCursor( NULL, IDC_WAIT );
break;
case 4:
hCursor = LoadCursor( NULL, IDC_CROSS );
break;
case 5:
hCursor = LoadCursor( NULL, IDC_UPARROW );
break;
case 6:
hCursor = LoadCursor( NULL, IDC_SIZE );
break;
case 7:
hCursor = LoadCursor( NULL, IDC_ICON );
break;
case 8:
hCursor = LoadCursor( NULL, IDC_SIZENWSE );
break;
case 9:
hCursor = LoadCursor( NULL, IDC_SIZENESW );
break;
case 10:
hCursor = LoadCursor( NULL, IDC_SIZEWE );
break;
case 11:
hCursor = LoadCursor( NULL, IDC_SIZENS );
break;
case 12:
hCursor = LoadCursor( NULL, IDC_SIZEALL );
break;
case 13:
hCursor = LoadCursor( NULL, IDC_NO );
break;
case 14:
hCursor = LoadCursor( NULL, IDC_HAND );
break;
case 15:
hCursor = LoadCursor( NULL, IDC_APPSTARTING );
break;
case 16:
hCursor = LoadCursor( NULL, IDC_HELP );
break;
default:
hCursor = LoadCursor( NULL, IDC_ARROW );
break;
}
SetClassLongPtr( pWindowData->hWnd, GCLP_HCURSOR, ( LONG_PTR ) hCursor );
}
/* */
/* wvw_LoadPicture( nSlot, cFilePic ) */
/* */
HB_FUNC( WVW_LOADPICTURE )
{
BOOL bResult = FALSE;
WVW_DATA * p = hb_getWvwData();
IPicture * iPicture = hb_gt_wvwLoadPicture( hb_parcx( 2 ) );
if( p && iPicture )
{
int iSlot = hb_parni( 1 ) - 1;
if( p->s_sApp->iPicture[ iSlot ] )
hb_gt_wvwDestroyPicture( p->s_sApp->iPicture[ iSlot ] );
p->s_sApp->iPicture[ iSlot ] = iPicture;
bResult = TRUE;
}
hb_retl( bResult );
}
/* */
/* wvw_LoadFont( nSlotFont, cFontFace, nHeight, nWidth, nWeight, lItalic, lUnderline, lStrikeout, */
/* nCharSet, nQuality, nEscapement ) */
/* */
HB_FUNC( WVW_LOADFONT )
{
WVW_DATA * p = hb_getWvwData();
if( p )
{
UINT usWinNum = p->s_usNumWindows - 1;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
LOGFONT logfont;
int iSlot = hb_parni( 1 ) - 1;
HFONT hFont;
logfont.lfEscapement = HB_ISNIL( 11 ) ? 0 : ( hb_parni( 11 ) * 10 );
logfont.lfOrientation = 0;
logfont.lfWeight = HB_ISNIL( 5 ) ? 0 : hb_parni( 5 );
logfont.lfItalic = HB_ISNIL( 6 ) ? 0 : ( BYTE ) hb_parl( 6 );
logfont.lfUnderline = HB_ISNIL( 7 ) ? 0 : ( BYTE ) hb_parl( 7 );
logfont.lfStrikeOut = HB_ISNIL( 8 ) ? 0 : ( BYTE ) hb_parl( 8 );
logfont.lfCharSet = HB_ISNIL( 9 ) ? ( BYTE ) pWindowData->CodePage : ( BYTE ) hb_parni( 9 );
logfont.lfOutPrecision = 0;
logfont.lfClipPrecision = 0;
logfont.lfQuality = HB_ISNIL( 10 ) ? ( BYTE ) DEFAULT_QUALITY : ( BYTE ) hb_parni( 10 );
logfont.lfPitchAndFamily = FF_DONTCARE;
logfont.lfHeight = HB_ISNIL( 3 ) ? pWindowData->fontHeight : hb_parni( 3 );
logfont.lfWidth = HB_ISNIL( 4 ) ? ( pWindowData->fontWidth < 0 ? -pWindowData->fontWidth : pWindowData->fontWidth ) : hb_parni( 4 );
strcpy( logfont.lfFaceName, HB_ISNIL( 2 ) ? pWindowData->fontFace : hb_parcx( 2 ) );
hFont = CreateFontIndirect( &logfont );
if( hFont )
{
if( p->s_sApp->hUserFonts[ iSlot ] )
DeleteObject( ( HFONT ) p->s_sApp->hUserFonts[ iSlot ] );
p->s_sApp->hUserFonts[ iSlot ] = hFont;
}
}
}
/* */
/* wvw_LoadPen( nSlot, nStyle, nWidth, nRGBColor ) */
/* */
HB_FUNC( WVW_LOADPEN )
{
WVW_DATA * p = hb_getWvwData();
int iPenWidth, iPenStyle;
COLORREF crColor;
HPEN hPen;
int iSlot = hb_parni( 1 ) - 1;
iPenStyle = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
iPenWidth = HB_ISNIL( 3 ) ? 0 : hb_parni( 3 );
crColor = HB_ISNIL( 4 ) ? RGB( 0, 0, 0 ) : ( COLORREF ) hb_parnl( 4 );
hPen = CreatePen( iPenStyle, iPenWidth, crColor );
if( hPen )
{
if( p->s_sApp->hUserPens[ iSlot ] )
DeleteObject( ( HPEN ) p->s_sApp->hUserPens[ iSlot ] );
p->s_sApp->hUserPens[ iSlot ] = hPen;
hb_retl( TRUE );
}
else
hb_retl( FALSE );
}
HB_FUNC( WVW_MESSAGEBOX )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
hb_retni( MessageBox( pWindowData->hWnd, hb_parcx( 2 ), hb_parcx( 3 ), HB_ISNIL( 4 ) ? MB_OK : hb_parni( 4 ) ) );
}
/* End of Drawing Primitives */
/* */
/* Utility Functions . A Natural Extension */
/* copied and modified from gtwvt */
/* */
/* wvw_ChooseFont( cFontName, nHeight, nWidth, nWeight, nQuality, ; */
/* lItalic, lUnderline, lStrikeout ) */
/* */
HB_FUNC( WVW_CHOOSEFONT )
{
CHOOSEFONT cf = { 0 };
LOGFONT lf = { 0 };
LONG PointSize = 0;
WVW_DATA * p = hb_getWvwData();
if( ! HB_ISNIL( 2 ) )
PointSize = -MulDiv( ( LONG ) hb_parnl( 2 ), GetDeviceCaps( p->s_pWindows[ p->s_usNumWindows - 1 ]->hdc, LOGPIXELSY ), 72 );
lf.lfHeight = PointSize;
lf.lfWidth = HB_ISNIL( 3 ) ? 0 : hb_parni( 3 );
lf.lfWeight = HB_ISNIL( 4 ) ? 0 : hb_parni( 4 );
lf.lfItalic = HB_ISNIL( 6 ) ? 0 : ( BYTE ) hb_parl( 6 );
lf.lfUnderline = HB_ISNIL( 7 ) ? 0 : ( BYTE ) hb_parl( 7 );
lf.lfStrikeOut = HB_ISNIL( 8 ) ? 0 : ( BYTE ) hb_parl( 8 );
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfQuality = HB_ISNIL( 5 ) ? DEFAULT_QUALITY : ( BYTE ) hb_parni( 5 );
lf.lfPitchAndFamily = FF_DONTCARE;
if( HB_ISCHAR( 1 ) )
strcpy( lf.lfFaceName, hb_parcx( 1 ) );
cf.lStructSize = sizeof( CHOOSEFONT );
cf.hwndOwner = p->s_pWindows[ p->s_usNumWindows - 1 ]->hWnd;
cf.hDC = ( HDC ) NULL;
cf.lpLogFont = &lf;
cf.iPointSize = 0;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_SHOWHELP | CF_INITTOLOGFONTSTRUCT;
cf.rgbColors = RGB( 0, 0, 0 );
cf.lCustData = 0L;
cf.lpfnHook = ( LPCFHOOKPROC ) NULL;
cf.lpTemplateName = ( LPSTR ) NULL;
cf.hInstance = ( HINSTANCE ) NULL;
cf.lpszStyle = ( LPSTR ) NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
if( ChooseFont( &cf ) )
{
PointSize = -MulDiv( lf.lfHeight, 72, GetDeviceCaps( p->s_pWindows[ p->s_usNumWindows - 1 ]->hdc, LOGPIXELSY ) );
hb_reta( 8 );
hb_storvc( lf.lfFaceName, -1, 1 );
hb_storvnl( ( LONG ) PointSize, -1, 2 );
hb_storvni( lf.lfWidth, -1, 3 );
hb_storvni( lf.lfWeight, -1, 4 );
hb_storvni( lf.lfQuality, -1, 5 );
hb_storvl( lf.lfItalic, -1, 6 );
hb_storvl( lf.lfUnderline, -1, 7 );
hb_storvl( lf.lfStrikeOut, -1, 8 );
}
else
{
hb_reta( 8 );
hb_storvc( "", -1, 1 );
hb_storvnl( ( LONG ) 0, -1, 2 );
hb_storvni( 0, -1, 3 );
hb_storvni( 0, -1, 4 );
hb_storvni( 0, -1, 5 );
hb_storvl( 0, -1, 6 );
hb_storvl( 0, -1, 7 );
hb_storvl( 0, -1, 8 );
}
return;
}
/* */
/* wvw_ChooseColor( nRGBInit, aRGB16, nFlags ) => nRGBSelected */
/* */
HB_FUNC( WVW_CHOOSECOLOR )
{
CHOOSECOLOR cc;
COLORREF crCustClr[ 16 ];
int i;
WVW_DATA * p = hb_getWvwData();
for( i = 0; i < 16; i++ )
crCustClr[ i ] = HB_ISARRAY( 2 ) ? ( COLORREF ) hb_parvnl( 2, i + 1 ) : GetSysColor( COLOR_BTNFACE );
cc.lStructSize = sizeof( CHOOSECOLOR );
cc.hwndOwner = p->s_pWindows[ p->s_usNumWindows - 1 ]->hWnd;
cc.rgbResult = HB_ISNIL( 1 ) ? 0 : ( COLORREF ) hb_parnl( 1 );
cc.lpCustColors = crCustClr;
cc.Flags = ( WORD ) ( HB_ISNIL( 3 ) ? CC_ANYCOLOR | CC_RGBINIT | CC_FULLOPEN : hb_parnl( 3 ) );
if( ChooseColor( &cc ) )
hb_retnl( cc.rgbResult );
else
hb_retnl( -1 );
}
/*wvw_SetMousePos( nWinNum, nRow, nCol ) nWinNum is 0 based */
/*WHAT'S the difference with GT_FUNC( mouse_SetPos ) ??? */
/*this func is able to position cursor on any window */
/*NOTE: consider using 'standard' SetMouse() instead: */
/* SetMouse(.t., nRow, nCol) */
/* This will treat (nRow,nCol) according to current s_pWvwData->s_bMainCoordMode setting */
HB_FUNC( WVW_SETMOUSEPOS )
{
POINT xy = { 0 };
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
USHORT usRow = ( USHORT ) hb_parni( 2 ),
usCol = ( USHORT ) hb_parni( 3 );
if( hb_gt_wvw_GetMainCoordMode() )
hb_wvw_HBFUNCPrologue( usWinNum, &usRow, &usCol, NULL, NULL );
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usCol, usRow );
if( ClientToScreen( pWindowData->hWnd, &xy ) )
hb_retl( SetCursorPos( xy.x, xy.y + ( pWindowData->PTEXTSIZE.y / 2 ) ) );
else
hb_retl( FALSE );
}
/*by bdj */
/*none in gtwvt */
/* wvw_FillRectangle( nWinNum, nTop, nLeft, nBottom, nRight, nRGBcolor/hBrush, */
/* lTight, lUseBrush, aOffSet ) */
/* */
/* if lTight, rect is drawn inside the character region */
/* AND top and left lines are lower two pixel down to make room for above/left object */
/* WARNING: gui object of this type subject to be overwritten by chars */
/* NOTE that these lines are to be overwritten by displayed char, */
/* we are depending on the fact that gui object will be painted last */
/* */
/* if lUseBrush, nRGBcolor is treated as a BRUSH handle */
/* */
HB_FUNC( WVW_FILLRECTANGLE )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WVW_DATA * p = hb_getWvwData();
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
POINT xy = { 0 };
int iTop, iLeft, iBottom, iRight;
int iOffTop, iOffLeft, iOffBottom, iOffRight;
USHORT usTop = ( USHORT ) hb_parni( 2 ),
usLeft = ( USHORT ) hb_parni( 3 ),
usBottom = ( USHORT ) hb_parni( 4 ),
usRight = ( USHORT ) hb_parni( 5 );
COLORREF crRGBcolor = HB_ISNIL( 6 ) ? 0 : hb_parnl( 6 );
BOOL bTight = HB_ISNIL( 7 ) ? FALSE : hb_parl( 7 );
BOOL bUseBrush = HB_ISNIL( 8 ) ? FALSE : hb_parl( 8 );
LOGBRUSH lb = { 0 };
HBRUSH hBrush;
RECT xyRect = { 0 };
if( hb_gt_wvw_GetMainCoordMode() )
hb_wvw_HBFUNCPrologue( usWinNum, &usTop, &usLeft, &usBottom, &usRight );
iOffTop = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 1 ) : 0;
iOffLeft = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 2 ) : 0;
iOffBottom = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 3 ) : 0;
iOffRight = ! HB_ISNIL( 9 ) ? hb_parvni( 9, 4 ) : 0;
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usLeft, usTop );
iTop = bTight ? xy.y + 2 : xy.y;
iLeft = bTight ? xy.x + 2 : xy.x;
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usRight + 1, usBottom + 1 );
xy.y -= pWindowData->byLineSpacing;
iBottom = xy.y - 1;
iRight = xy.x - 1;
/* Aplica OffSet */
iTop += iOffTop;
iLeft += iOffLeft;
iBottom += iOffBottom;
iRight += iOffRight;
xyRect.left = iLeft;
xyRect.top = iTop;
xyRect.right = iRight + 1;
xyRect.bottom = iBottom + 1;
lb.lbStyle = BS_SOLID;
lb.lbColor = crRGBcolor;
lb.lbHatch = 0;
hBrush = ! bUseBrush ? CreateBrushIndirect( &lb ) : ( HBRUSH ) HB_PARHANDLE( 6 );
FillRect( pWindowData->hdc, &xyRect, hBrush );
if( ! bUseBrush )
{
SelectObject( p->s_pWindows[ 0 ]->hdc, ( HBRUSH ) p->s_sApp->OriginalBrush );
DeleteObject( hBrush );
}
hb_retl( TRUE );
}
HB_FUNC( WVW_LBADDSTRING )
{
SendMessage( GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ), LB_ADDSTRING, 0, ( LPARAM ) ( LPSTR ) hb_parcx( 3 ) );
}
HB_FUNC( WVW_LBSETCURSEL )
{
SendMessage( GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ), LB_SETCURSEL, hb_parni( 3 ), 0 );
}
/* WARNING!!! this function is not member of WVW_CB* group of functions */
HB_FUNC( WVW_CBADDSTRING )
{
SendMessage( GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ), CB_ADDSTRING, 0, ( LPARAM ) ( LPSTR ) hb_parcx( 3 ) );
}
/* WARNING!!! this function is not member of WVW_CB* group of functions */
HB_FUNC( WVW_CBSETCURSEL )
{
SendMessage( GetDlgItem( ( HWND ) HB_PARHANDLE( 1 ), hb_parni( 2 ) ), CB_SETCURSEL, hb_parni( 3 ), 0 );
}
HB_FUNC( WVW_DLGSETICON )
{
HICON hIcon;
if( HB_ISNUM( 2 ) )
hIcon = LoadIcon( hb_getWvwData()->hInstance, MAKEINTRESOURCE( hb_parni( 2 ) ) );
else
hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, hb_parc( 2 ), IMAGE_ICON, 0, 0, LR_LOADFROMFILE );
if( hIcon )
{
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon ); /* Set Title Bar ICON */
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), WM_SETICON, ICON_BIG, ( LPARAM ) hIcon ); /* Set Task List Icon */
}
if( hIcon )
hb_retnl( ( ULONG ) hIcon );
}
/* */
/* GUI Drawing Functions */
/* Pritpal Bedi <pritpal@vouchcac.com> */
/* */
/* */
/* wvw_SetPen( nPenStyle, nWidth, nColor ) */
/* */
/* IMPORTANT: in prev release this functions has nWinNum parameter
PENs are now application-wide.
*/
HB_FUNC( WVW_SETPEN )
{
int iPenWidth, iPenStyle;
COLORREF crColor;
HPEN hPen;
WVW_DATA * p = hb_getWvwData();
if( HB_ISNIL( 1 ) )
hb_retl( FALSE );
iPenStyle = hb_parni( 1 );
iPenWidth = HB_ISNIL( 2 ) ? 0 : hb_parni( 2 );
crColor = HB_ISNIL( 3 ) ? RGB( 0, 0, 0 ) : ( COLORREF ) hb_parnl( 3 );
hPen = CreatePen( iPenStyle, iPenWidth, crColor );
if( hPen )
{
/* 20040923, was:
if ( s_pWvwData->s_pWindows[usWinNum]->currentPen )
{
DeleteObject( (HPEN) s_pWvwData->s_pWindows[usWinNum]->currentPen );
}
s_pWvwData->s_pWindows[usWinNum]->currentPen = hPen;
*/
if( p->s_sApp->currentPen )
DeleteObject( ( HPEN ) p->s_sApp->currentPen );
p->s_sApp->currentPen = hPen;
hb_retl( TRUE );
}
else
hb_retl( FALSE );
}
/* */
/* wvw_SetBrush( nStyle, nColor, [ nHatch ] ) */
/* */
/* IMPORTANT: in prev release this functions has nWinNum parameter
BRUSHes are now application-wide.
*/
HB_FUNC( WVW_SETBRUSH )
{
HBRUSH hBrush;
LOGBRUSH lb = { 0 };
WVW_DATA * p = hb_getWvwData();
if( HB_ISNIL( 1 ) )
hb_retl( FALSE );
lb.lbStyle = hb_parnl( 1 );
lb.lbColor = HB_ISNIL( 2 ) ? RGB( 0, 0, 0 ) : ( COLORREF ) hb_parnl( 2 );
lb.lbHatch = HB_ISNIL( 3 ) ? 0 : hb_parnl( 3 );
hBrush = CreateBrushIndirect( &lb );
if( hBrush )
{
/* 20040923,was:
if ( s_pWvwData->s_pWindows[usWinNum]->currentBrush )
{
DeleteObject( (HBRUSH) s_pWvwData->s_pWindows[usWinNum]->currentBrush );
}
s_pWvwData->s_pWindows[usWinNum]->currentBrush = hBrush;
*/
if( p->s_sApp->currentBrush )
{
SelectObject( p->s_pWindows[ 0 ]->hdc, ( HBRUSH ) p->s_sApp->OriginalBrush );
DeleteObject( ( HBRUSH ) p->s_sApp->currentBrush );
}
p->s_sApp->currentBrush = hBrush;
hb_retl( TRUE );
}
else
hb_retl( FALSE );
}
HB_FUNC( WVW__MAKEDLGTEMPLATE )
{
WORD * p, * pdlgtemplate;
WORD nItems = ( WORD ) hb_parvni( 1, 4 );
int i, nchar;
DWORD lStyle;
pdlgtemplate = p = ( PWORD ) LocalAlloc( LPTR, 65534 );
lStyle = hb_parvnl( 1, 3 );
*p++ = 1;
*p++ = 0xFFFF;
*p++ = LOWORD( hb_parvnl( 1, 1 ) );
*p++ = HIWORD( hb_parvnl( 1, 1 ) );
*p++ = LOWORD( hb_parvnl( 1, 2 ) );
*p++ = HIWORD( hb_parvnl( 1, 2 ) );
*p++ = LOWORD( lStyle );
*p++ = HIWORD( lStyle );
*p++ = ( WORD ) nItems;
*p++ = ( short ) hb_parvni( 1, 5 );
*p++ = ( short ) hb_parvni( 1, 6 );
*p++ = ( short ) hb_parvni( 1, 7 );
*p++ = ( short ) hb_parvni( 1, 8 );
*p++ = ( short ) 0;
*p++ = ( short ) 0x00;
if( hb_parinfa( 1, 11 ) == HB_IT_STRING )
{
nchar = nCopyAnsiToWideChar( p, TEXT( ( char * ) hb_parvcx( 1, 11 ) ) );
p += nchar;
}
else
*p++ = 0;
if( ( lStyle & DS_SETFONT ) )
{
*p++ = ( short ) hb_parvni( 1, 12 );
*p++ = ( short ) hb_parvni( 1, 13 );
*p++ = ( short ) hb_parvni( 1, 14 );
nchar = nCopyAnsiToWideChar( p, TEXT( ( char * ) hb_parvcx( 1, 15 ) ) );
p += nchar;
}
for( i = 1; i <= nItems; i++ )
{
p = lpwAlign( p );
*p++ = LOWORD( hb_parvnl( 2, i ) );
*p++ = HIWORD( hb_parvnl( 2, i ) );
*p++ = LOWORD( hb_parvnl( 3, i ) );
*p++ = HIWORD( hb_parvnl( 3, i ) );
*p++ = LOWORD( hb_parvnl( 4, i ) );
*p++ = HIWORD( hb_parvnl( 4, i ) );
*p++ = ( short ) hb_parvni( 5, i );
*p++ = ( short ) hb_parvni( 6, i );
*p++ = ( short ) hb_parvni( 7, i );
*p++ = ( short ) hb_parvni( 8, i );
*p++ = LOWORD( hb_parvnl( 9, i ) );
*p++ = HIWORD( hb_parvnl( 9, i ) );
if( hb_parinfa( 10, i ) == HB_IT_STRING )
{
nchar = nCopyAnsiToWideChar( p, TEXT( ( char * ) hb_parvcx( 10, i ) ) );
p += nchar;
}
else
{
*p++ = 0xFFFF;
*p++ = ( WORD ) hb_parvni( 10, i );
}
if( hb_parinfa( 11, i ) == HB_IT_STRING )
{
nchar = nCopyAnsiToWideChar( p, ( LPSTR ) hb_parvcx( 11, i ) );
p += nchar;
}
else
{
*p++ = 0xFFFF;
*p++ = ( WORD ) hb_parvni( 11, i );
}
*p++ = 0x00;
}
p = lpwAlign( p );
hb_retclen( ( LPSTR ) pdlgtemplate, ( ( ULONG ) p - ( ULONG ) pdlgtemplate ) );
LocalFree( LocalHandle( pdlgtemplate ) );
}
HB_FUNC( WVW_GETCURSORPOS )
{
POINT xy = { 0 };
PHB_ITEM info = hb_itemArrayNew( 2 );
GetCursorPos( &xy );
hb_arraySetNI( info, 1, xy.x );
hb_arraySetNI( info, 2, xy.y );
hb_itemReturnRelease( info );
}
/* wvw_ShowWindow( [nWinNum], nCmdShow ) */
HB_FUNC( WVW_SHOWWINDOW )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
int iCmdShow = HB_ISNUM( 2 ) ? hb_parni( 2 ) : SW_SHOWNORMAL;
ShowWindow( pWindowData->hWnd, iCmdShow );
}
/* wvw_UpdateWindow( [nWinNum] ) */
HB_FUNC( WVW_UPDATEWINDOW )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
UpdateWindow( pWindowData->hWnd );
}
/*
*
* Dialogs
* original work by Pritpal Bedi in WVTUTILS.C
*/
HB_FUNC( WVW_CREATEDIALOGDYNAMIC )
{
PHB_ITEM pFirst = hb_param( 3, HB_IT_ANY );
PHB_ITEM pFunc = NULL;
PHB_DYNS pExecSym;
WVW_DATA * p = hb_getWvwData();
HWND hDlg = NULL;
int iIndex;
int iType = 0;
int iResource = hb_parni( 4 );
/* check if we still have room for a new dialog */
for( iIndex = 0; iIndex < WVW_DLGML_MAX; iIndex++ )
if( p->s_sApp->hDlgModeless[ iIndex ] == NULL )
break;
if( iIndex >= WVW_DLGML_MAX )
{
/* no more room */
hb_retnl( ( ULONG ) NULL );
return;
}
if( HB_IS_BLOCK( pFirst ) )
{
/* pFunc is pointing to stored code block (later) */
pFunc = hb_itemNew( pFirst );
iType = 2;
}
else if( HB_IS_STRING( pFirst ) == HB_IT_STRING )
{
pExecSym = hb_dynsymFindName( hb_itemGetCPtr( pFirst ) );
if( pExecSym )
pFunc = ( PHB_ITEM ) pExecSym;
iType = 1;
}
{
if( HB_ISNUM( 3 ) )
hDlg = CreateDialogIndirect( hb_getWvwData()->hInstance,
( LPDLGTEMPLATE ) hb_parc( 1 ),
hb_parl( 2 ) ? p->s_pWindows[ 0 ]->hWnd : NULL,
( DLGPROC ) hb_parnl( 3 ) );
else
{
switch( iResource )
{
case 0:
hDlg = CreateDialog( hb_getWvwData()->hInstance,
hb_parc( 1 ),
hb_parl( 2 ) ? p->s_pWindows[ 0 ]->hWnd : NULL,
( DLGPROC ) hb_gt_wvwDlgProcMLess );
break;
case 1:
hDlg = CreateDialog( hb_getWvwData()->hInstance,
MAKEINTRESOURCE( ( WORD ) hb_parni( 1 ) ),
hb_parl( 2 ) ? p->s_pWindows[ 0 ]->hWnd : NULL,
( DLGPROC ) hb_gt_wvwDlgProcMLess );
break;
case 2:
hDlg = CreateDialogIndirect( hb_getWvwData()->hInstance,
( LPDLGTEMPLATE ) hb_parc( 1 ),
hb_parl( 2 ) ? p->s_pWindows[ 0 ]->hWnd : NULL,
( DLGPROC ) hb_gt_wvwDlgProcMLess );
break;
}
}
if( hDlg )
{
p->s_sApp->hDlgModeless[ iIndex ] = hDlg;
if( pFunc )
{
/* if codeblock, store the codeblock and lock it there */
if( HB_IS_BLOCK( pFirst ) )
p->s_sApp->pcbFunc[ iIndex ] = pFunc;
p->s_sApp->pFunc[ iIndex ] = pFunc;
p->s_sApp->iType[ iIndex ] = iType;
}
else
{
p->s_sApp->pFunc[ iIndex ] = NULL;
p->s_sApp->iType[ iIndex ] = 0;
}
SendMessage( hDlg, WM_INITDIALOG, 0, 0 );
}
else
{
if( iType == 2 && pFunc )
hb_itemRelease( pFunc );
p->s_sApp->hDlgModeless[ iIndex ] = NULL;
}
}
hb_retnl( ( ULONG ) hDlg );
}
HB_FUNC( WVW_CREATEDIALOGMODAL )
{
PHB_ITEM pFirst = hb_param( 3, HB_IT_ANY );
PHB_ITEM pFunc = NULL;
PHB_DYNS pExecSym;
WVW_DATA * p = hb_getWvwData();
int iIndex;
int iResource = hb_parni( 4 );
int iResult = 0;
HWND hParent = HB_ISNIL( 5 ) ? p->s_pWindows[ 0 ]->hWnd : ( HWND ) HB_PARHANDLE( 5 );
/* check if we still have room for a new dialog */
for( iIndex = 0; iIndex < WVW_DLGMD_MAX; iIndex++ )
if( p->s_sApp->hDlgModal[ iIndex ] == NULL )
break;
if( iIndex >= WVW_DLGMD_MAX )
{
/* no more room */
hb_retni( ( int ) NULL );
return;
}
if( HB_IS_BLOCK( pFirst ) )
{
/* pFunc is pointing to stored code block (later) */
p->s_sApp->pcbFuncModal[ iIndex ] = hb_itemNew( pFirst );
pFunc = p->s_sApp->pcbFuncModal[ iIndex ];
p->s_sApp->pFuncModal[ iIndex ] = pFunc;
p->s_sApp->iTypeModal[ iIndex ] = 2;
}
else if( HB_IS_STRING( pFirst ) == HB_IT_STRING )
{
pExecSym = hb_dynsymFindName( hb_itemGetCPtr( pFirst ) );
if( pExecSym )
pFunc = ( PHB_ITEM ) pExecSym;
p->s_sApp->pFuncModal[ iIndex ] = pFunc;
p->s_sApp->iTypeModal[ iIndex ] = 1;
}
switch( iResource )
{
case 0:
iResult = DialogBoxParam( hb_getWvwData()->hInstance,
hb_parc( 1 ),
hParent,
( DLGPROC ) hb_gt_wvwDlgProcModal,
( LPARAM ) ( DWORD ) iIndex + 1 );
break;
case 1:
iResult = DialogBoxParam( hb_getWvwData()->hInstance,
MAKEINTRESOURCE( ( WORD ) hb_parni( 1 ) ),
hParent,
( DLGPROC ) hb_gt_wvwDlgProcModal,
( LPARAM ) ( DWORD ) iIndex + 1 );
break;
case 2:
iResult = DialogBoxIndirectParam( hb_getWvwData()->hInstance,
( LPDLGTEMPLATE ) hb_parc( 1 ),
hParent,
( DLGPROC ) hb_gt_wvwDlgProcModal,
( LPARAM ) ( DWORD ) iIndex + 1 );
break;
}
hb_retni( iResult );
}
/* removed from GTWVT, so we remove it from here also. I really don;t like doing it... */
HB_FUNC( WVW_DELETEOBJECT )
{
hb_retl( DeleteObject( ( HGDIOBJ ) HB_PARHANDLE( 1 ) ) );
}
HB_FUNC( WVW_SETONTOP )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
RECT rect = { 0 };
GetWindowRect( pWindowData->hWnd, &rect );
hb_retl( SetWindowPos( pWindowData->hWnd, HWND_TOPMOST,
rect.left,
rect.top,
0,
0,
SWP_NOSIZE + SWP_NOMOVE + SWP_NOACTIVATE ) );
}
HB_FUNC( WVW_SETASNORMAL )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
RECT rect = { 0 };
GetWindowRect( pWindowData->hWnd, &rect );
hb_retl( SetWindowPos( pWindowData->hWnd, HWND_NOTOPMOST,
rect.left,
rect.top,
0,
0,
SWP_NOSIZE + SWP_NOMOVE + SWP_NOACTIVATE ) );
}
/* */
/* aScr := wvw_SaveScreen( nWinNum, nTop, nLeft, nBottom, nRight ) */
/* */
/*TODO: reconsider, is it really needed? is it better to be handled by application?
* besides, with Windowing feature, it seems not needed anymore
*/
HB_FUNC( WVW_SAVESCREEN )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
HBITMAP hBmp, oldBmp;
POINT xy = { 0 };
int iTop, iLeft, iBottom, iRight, iWidth, iHeight;
PHB_ITEM info = hb_itemArrayNew( 3 );
USHORT usTop = ( USHORT ) hb_parni( 2 ),
usLeft = ( USHORT ) hb_parni( 3 ),
usBottom = ( USHORT ) hb_parni( 4 ),
usRight = ( USHORT ) hb_parni( 5 );
if( hb_gt_wvw_GetMainCoordMode() )
hb_wvw_HBFUNCPrologue( usWinNum, &usTop, &usLeft, &usBottom, &usRight );
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usLeft, usTop );
iTop = xy.y;
iLeft = xy.x;
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usRight + 1, usBottom + 1 );
iBottom = xy.y - 1;
iRight = xy.x - 1;
iWidth = iRight - iLeft + 1;
iHeight = iBottom - iTop + 1;
hBmp = CreateCompatibleBitmap( pWindowData->hdc, iWidth, iHeight );
oldBmp = ( HBITMAP ) SelectObject( pWindowData->hCompDC, hBmp );
BitBlt( pWindowData->hCompDC, 0, 0, iWidth, iHeight, pWindowData->hdc, iLeft, iTop, SRCCOPY );
SelectObject( pWindowData->hCompDC, oldBmp );
hb_arraySetNI( info, 1, iWidth );
hb_arraySetNI( info, 2, iHeight );
hb_arraySetNInt( info, 3, ( HB_PTRUINT ) hBmp );
hb_itemReturnRelease( info );
}
/* */
/* wvw_RestScreen( nWinNum, nTop, nLeft, nBottom, nRight, aScr, lDoNotDestroyBMP )*/
/* */
/*TODO: reconsider, is it really needed? is it better to be handled by application?
* besides, with Windowing feature, it seems not needed anymore
*/
HB_FUNC( WVW_RESTSCREEN )
{
UINT usWinNum = WVW_WHICH_WINDOW;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
POINT xy = { 0 };
int iTop, iLeft, iBottom, iRight, iWidth, iHeight;
HBITMAP hBmp;
BOOL bResult = FALSE;
BOOL bDoNotDestroyBMP = HB_ISNIL( 7 ) ? FALSE : hb_parl( 7 );
USHORT usTop = ( USHORT ) hb_parni( 2 ),
usLeft = ( USHORT ) hb_parni( 3 ),
usBottom = ( USHORT ) hb_parni( 4 ),
usRight = ( USHORT ) hb_parni( 5 );
if( hb_gt_wvw_GetMainCoordMode() )
hb_wvw_HBFUNCPrologue( usWinNum, &usTop, &usLeft, &usBottom, &usRight );
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usLeft, usTop );
iTop = xy.y;
iLeft = xy.x;
xy = hb_gt_wvwGetXYFromColRow( pWindowData, usRight + 1, usBottom + 1 );
iBottom = xy.y - 1;
iRight = xy.x - 1;
iWidth = iRight - iLeft + 1;
iHeight = iBottom - iTop + 1;
hBmp = ( HBITMAP ) SelectObject( pWindowData->hCompDC, ( HBITMAP ) hb_parvnl( 6, 3 ) );
if( hBmp )
{
if( ( iWidth == hb_parvni( 6, 1 ) ) && ( iHeight == hb_parvni( 6, 2 ) ) )
{
if( BitBlt( pWindowData->hdc,
iLeft,
iTop,
iWidth,
iHeight,
pWindowData->hCompDC,
0,
0,
SRCCOPY ) )
bResult = TRUE;
}
else if( StretchBlt( pWindowData->hdc,
iLeft,
iTop,
iWidth,
iHeight,
pWindowData->hCompDC,
0,
0,
hb_parvni( 6, 1 ),
hb_parvni( 6, 2 ),
SRCCOPY ) )
bResult = TRUE;
}
SelectObject( pWindowData->hCompDC, hBmp );
if( ! bDoNotDestroyBMP )
DeleteObject( ( HBITMAP ) hb_parvnl( 6, 3 ) );
hb_retl( bResult );
}
/* */
/* wvw_CreateFont( cFontFace, nHeight, nWidth, nWeight, lItalic, lUnderline,*/
/* lStrikeout, nCharSet, nQuality, nEscapement ) */
/* */
HB_FUNC( WVW_CREATEFONT )
{
WVW_DATA * p = hb_getWvwData();
UINT usWinNum = p->s_usNumWindows - 1;
WIN_DATA * pWindowData = hb_gt_wvw_GetWindowsData( usWinNum );
LOGFONT logfont;
HFONT hFont;
logfont.lfEscapement = HB_ISNIL( 10 ) ? 0 : ( hb_parni( 10 ) * 10 );
logfont.lfOrientation = 0;
logfont.lfWeight = HB_ISNIL( 4 ) ? 0 : hb_parni( 4 );
logfont.lfItalic = HB_ISNIL( 5 ) ? 0 : ( BYTE ) hb_parl( 5 );
logfont.lfUnderline = HB_ISNIL( 6 ) ? 0 : ( BYTE ) hb_parl( 6 );
logfont.lfStrikeOut = HB_ISNIL( 7 ) ? 0 : ( BYTE ) hb_parl( 7 );
logfont.lfCharSet = HB_ISNIL( 8 ) ? ( BYTE ) pWindowData->CodePage : ( BYTE ) hb_parni( 8 );
logfont.lfOutPrecision = 0;
logfont.lfClipPrecision = 0;
logfont.lfQuality = HB_ISNIL( 9 ) ? ( BYTE ) DEFAULT_QUALITY : ( BYTE ) hb_parni( 9 );
logfont.lfPitchAndFamily = FF_DONTCARE;
logfont.lfHeight = HB_ISNIL( 2 ) ? pWindowData->fontHeight : hb_parni( 2 );
logfont.lfWidth = HB_ISNIL( 3 ) ? ( pWindowData->fontWidth < 0 ? -pWindowData->fontWidth : pWindowData->fontWidth ) : hb_parni( 3 );
strcpy( logfont.lfFaceName, HB_ISNIL( 1 ) ? pWindowData->fontFace : hb_parcx( 1 ) );
hFont = CreateFontIndirect( &logfont );
if( hFont )
hb_retnl( ( ULONG ) hFont );
else
hb_retnl( 0 );
}
HB_FUNC( WVW_GETKEYSTATE )
{
hb_retni( GetKeyState( hb_parni( 1 ) ) );
}
HB_FUNC( WVW_LOWORD )
{
hb_retni( ( int ) ( hb_parnl( 1 ) & 0xFFFF ) );
}
HB_FUNC( WVW_HIWORD )
{
hb_retni( ( int ) ( ( hb_parnl( 1 ) >> 16 ) & 0xFFFF ) );
}