i have a working harbour App using HMG Syntax for "WINDOW"
it create 8 x WINDOW in a loop using Macro which have no Titlebar or Frame.
i use some HB_FUNC to "paint" Part of Bitmap into Window and cover it with "Region"
it need a Timer to call Function every Second to show Time()
so my Problem now is to "translate" these both Modul to FiveWin
Code: Select all
#IFDEF Use_HMG
#include "hmg.ch"
#ELSE
#include "fivewin.ch"
#ENDIF
#include "DLL.ch"
#include "INKEY.ch"
#define RGN_OR 2
#define PROGRAM "LCD_Time"
#define BMP_ERASE 0 // Borra la imagen de fondo de la ventana
#define BMP_COPY_NORMAL 1 // Pega la imagen al fondo con el tamaño original de la misma
#define BMP_COPY_SCALE 2 // Ajusta proporcionalmente la imagen para que se vea completa en la ventana
#define BMP_COPY_STRETCH 3 // Ajusta el tamaño de la imagen al tamaño de la ventana (no respeta las proporciones originales)
#define BMP_COPY_SPLIT 99 // Jimmy : more Parameter
#define BMP_INFO_WIDTH 0
#define BMP_INFO_HEIGHT 1
#define BMP_INFO_BITSPIXEL 2
#ifdef __XHARBOUR__
#define ENUMINDEX hb_EnumIndex()
#else
#define ENUMINDEX enum:__EnumIndex
#endif
STATIC lBusy := .F.
*--------------------------------------------------------*
*
* this Demo was made by Auge & Ohr, Jimmy 26.11.2019
* it show how to use Macro e.g. pass Parameter
*
* it create 8 x Form and "mask" it via API SetWindowRgn()
*
* Background Image is "split" into 8 Parts and show diffent Color
*
*--------------------------------------------------------*
MEMVAR a_Forms, aSubSize,aBitmap
MEMVAR FORM_1, cOnPaintProc
PROCEDURE Main()
PUBLIC a_Forms := {}
PUBLIC aSubSize := { 100, 300 }
PUBLIC aBitmap := {}
PRIVATE FORM_1
SET MULTIPLE OFF
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 0 HEIGHT 0 ;
TITLE PROGRAM ;
ICON 'MAIN' ;
MAIN ;
ON INIT CreateForms() ;
ON RELEASE DoRelease() ;
NOTIFYICON 'MAIN' ;
NOTIFYTOOLTIP PROGRAM ;
NOSHOW ;
ON NOTIFYCLICK HideShow()
DEFINE NOTIFY MENU OF Form_1
ITEM '&Exit' ACTION Form_1.Release
END MENU
DEFINE TIMER Timer_1 OF Form_1 INTERVAL 1000 ACTION ShowTime()
END WINDOW
ACTIVATE WINDOW Form_1
RETURN
Code: Select all
STATIC FUNCTION CreateForms()
Local aDesk := GetDesktopArea()
Local nDeskWidth := aDesk[3] - aDesk[1]
LOCAL nDeskHeight := aDesk[4] - aDesk[2]
Local nTop := 0, nLeft := 0
Local i,iMax := 8
Local cForm
Local hBitmap
Local wide
Local height
PRIVATE cOnPaintProc
hBitmap := BMP_LOAD_FILE("COLORS.BMP")
wide := BMP_GET_INFO (hBitmap, BMP_INFO_WIDTH)
height := BMP_GET_INFO (hBitmap, BMP_INFO_HEIGHT)
AADD(aBitmap,hBitmap)
nLeft := ( nDeskWidth - ( iMax * aSubSize[ 1 ] ) - 8 ) / 2
nTop := ( nDeskHeight - aSubSize[ 2 ] ) / 2
// Left Height
FOR i = 1 TO iMax
cForm := "Form_"+strzero(i, 2)
/******************************************************************
* aData[1] := cForm
* aData[2] := hBitmap
* aData[3] := wide
* aData[4] := height
* cOnPaintProc := "Paint_Background_Window( '" + cForm + "', '" + hb_Serialize(aData) + "')"
******************************************************************/
cOnPaintProc := "Paint_Background_Window( '" + cForm + ;
"', '" + str(i) + ;
"', '" + str(wide) + ;
"', '" + str(height) + ;
"', '" + str(hBitmap)+ "' )"
DEFINE WINDOW &cForm ;
AT nTop, nLeft ;
WIDTH aSubSize[ 1 ] HEIGHT aSubSize[ 2 ] ;
CHILD ;
TOPMOST ;
NOSHOW ;
NOCAPTION ;
ON PAINT &cOnPaintProc ;
NOMINIMIZE NOMAXIMIZE NOSIZE
END WINDOW
#IFDEF Use_HMG
ThisWindow.NoClose := .T.
#ELSE
// FiveWin ?
#ENDIF
aAdd(a_Forms, "Form_" + strzero(i,2))
nLeft += aSubSize[ 1 ] + 2
NEXT
_ActivateWindow ( a_Forms, .F. )
HideShow()
RETURN NIL
in FUNCTION CreateForms() 8 x WINDOW &cForm are create. i use (WM_) PAINT Event.
Code: Select all
FUNCTION Paint_Background_Window(cForm,cID,cwide,cheight,cBitmap)
//
// Note : don't made STATIC FUNCTION with Macro !
//
LOCAL hWnd
LOCAL hBitmap
LOCAL nMode := BMP_COPY_SPLIT
LOCAL Row := 0
LOCAL Col := 0
Local nNo := 0
Local wide := 32
Local height := 35
Local nPart := 0
nNo := VAL(cID )
wide := VAL(cwide )
height := VAL(cheight)
hBitmap := VAL(cBitmap)
nPart := ROUND(wide/8,0)-1
hWnd := GetFormHandle(cForm)
Row := GetProperty(cForm ,"Height")
Col := GetProperty(cForm ,"Width" )
BMP_PAINT (hWnd, hBitmap, nMode,0,0,Row,Col,;
0,nPart*(nNo-1),height,nPart)
RETURN NIL
Code: Select all
//*************************************************************************************************
// BMP_PAINT (hWnd, hBitmap, nMode, Row, Col, Row2, Col2)
// BMP_PAINT (hWnd, hBitmap, nMode, Row, Col, Row2, Col2, aSource.top, aSource.left, aSource.bottom, aSource.right)
//*************************************************************************************************
HB_FUNC(BMP_PAINT)
{
HWND hWnd;
HBITMAP hBitmap;
HDC memDC, hDC;
RECT rect;
RECT aSource;
BITMAP bm;
int nMode;
hWnd = (HWND) hb_parnl (1);
hBitmap = (HBITMAP) hb_parnl (2);
nMode = hb_parni (3);
GetClientRect(hWnd, &rect);
//hDC = GetDC (hWnd); // obtine un hDC para toda el area del cliente (se puede pintar en cualquier lugar del area del cliente)
PAINTSTRUCT ps;
hDC = BeginPaint (hWnd, &ps); // obtiene un hDC solo para el area invalida (area que debe ser repintada) en un mensaje WM_PAINT
if (nMode == BMP_ERASE)
FillRect(hDC,&rect,(HBRUSH) GetSysColorBrush(COLOR_BTNFACE));
else
{
FillRect(hDC,&rect,(HBRUSH) GetSysColorBrush(COLOR_BTNFACE)); // borra la imagen anterior antens de asignar otra
memDC = CreateCompatibleDC(hDC);
SelectObject(memDC, hBitmap);
rect.top = hb_parnl (4);
rect.left = hb_parnl (5);
if (nMode == BMP_COPY_NORMAL)
{
rect.bottom = hb_parnl (6);
rect.right = hb_parnl (7);
BitBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, memDC, 0, 0, SRCCOPY);
}
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
if (nMode == BMP_COPY_SCALE)
{ if ((int) bm.bmWidth * rect.bottom / bm.bmHeight <= rect.right)
rect.right= (int) bm.bmWidth * rect.bottom / bm.bmHeight;
else
rect.bottom = (int) bm.bmHeight * rect.right / bm.bmWidth;
StretchBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
if (nMode == BMP_COPY_SPLIT) // Jimmy
{
rect.bottom = hb_parnl (6);
rect.right = hb_parnl (7);
aSource.top = hb_parnl (8);
aSource.left = hb_parnl (9);
aSource.bottom = hb_parnl (10);
aSource.right = hb_parnl (11);
StretchBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, memDC, aSource.left, aSource.top, aSource.right, aSource.bottom, SRCCOPY);
}
if (nMode == BMP_COPY_STRETCH)
StretchBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
DeleteDC(memDC);
}
//EndPaint (hWnd, hDC); //Elimina el hDC y Valida el area pintada
ReleaseDC(hWnd, hDC); //Elimina el hDC pero NO Valida el area pintada
//Al no validar el area pintada permite que los procesos de pintura siguientes encadenados puedan usar hDC = BeginPaint (hWnd, &ps);
}
so how to get it work under FiveWin while i got Error like these when link
please help a FiveWin Newbie, thxc:\fwh\samples\1\HMG_UHR.prg(58) Error E0030 Syntax error "syntax error at 'WINDOW'"
c:\fwh\samples\1\HMG_UHR.prg(60) Error E0030 Syntax error "syntax error at 'NOTIFY'"
c:\fwh\samples\1\HMG_UHR.prg(61) Error E0030 Syntax error "syntax error at '&Exit'"
c:\fwh\samples\1\HMG_UHR.prg(62) Error E0030 Syntax error "syntax error at 'END'"
c:\fwh\samples\1\HMG_UHR.prg(64) Warning W0001 Ambiguous reference 'TIMER_1'
c:\fwh\samples\1\HMG_UHR.prg(66) Error E0030 Syntax error "syntax error at 'END'"
c:\fwh\samples\1\HMG_UHR.prg(121) Error E0030 Syntax error "syntax error at 'WINDOW'"
c:\fwh\samples\1\HMG_UHR.prg(132) Error E0013 NEXT does not match FOR