* src/rtl/gtwvt/gtwvt.c
% Deleted unnecessary cast.
* utils/hbmk2/hbmk2.pt_BR.po
+ Uploaded new version received from Vailton Renato. Thanks!
* utils/hbmk2/hbmk2.hu_HU.po
+ Updated.
+ Added some new translations.
* utils/hbmk2/hbmk2.prg
* Minor formatting.
! Fixed typo in one of the displayed texts.
+ examples/gtwvw
+ examples/gtwvw/Makefile
+ examples/gtwvw/hbgtwvw.h
+ examples/gtwvw/hbole.h
+ examples/gtwvw/gtwvw.c
+ examples/gtwvw/wvwdraw.c
+ examples/gtwvw/wvwmenu.c
+ examples/gtwvw/wvwstbar.c
+ examples/gtwvw/wvwcheck.c
+ examples/gtwvw/wvwfuncs.c
+ examples/gtwvw/wvwpush.c
+ examples/gtwvw/wvwedit.c
+ examples/gtwvw/wvwtbar.c
+ examples/gtwvw/gtwvw.hbc
+ examples/gtwvw/gtwvw.hbp
+ examples/gtwvw/readme.txt
+ examples/gtwvw/tests
+ examples/gtwvw/tests/wvwtest9.rc
+ examples/gtwvw/tests/prog1.prg
+ examples/gtwvw/tests/prog2.prg
+ examples/gtwvw/tests/dia_excl.ico
+ examples/gtwvw/tests/drawimg.prg
+ examples/gtwvw/tests/vouch1.bmp
+ examples/gtwvw/tests/wvwmouse.prg
+ examples/gtwvw/tests/wvwtest9.hbp
+ examples/gtwvw/tests/hbmk.hbm
+ examples/gtwvw/tests/cbtest1.prg
+ examples/gtwvw/tests/def2.bmp
+ examples/gtwvw/tests/maincoor.prg
+ examples/gtwvw/tests/wvt2wvw.ch
+ examples/gtwvw/tests/cbtest6.prg
+ examples/gtwvw/tests/wvwtest9.prg
+ examples/gtwvw/tests/ebtest7.prg
+ examples/gtwvw/tests/vouch1.gif
+ examples/gtwvw/tests/maximize.prg
+ examples/gtwvw/tests/readme.txt
+ examples/gtwvw/tests/wvwtest9.xml
+ examples/gtwvw/tests/inpfocus.prg
+ examples/gtwvw/tests/prog0.prg
+ examples/gtwvw/docs
+ examples/gtwvw/docs/funclist.txt
+ examples/gtwvw/docs/gtwvw.txt
+ examples/gtwvw/docs/whatsnew.txt
+ Added rudimentary port of GTWVW to Harbour.
(The source was current xhb CVS repository.)
The port is very very (very) far from anything else
than can be found in Harbour, this port involved making
all the minimum required steps to build and link under
Harbour, plus some extra cleanups.
! Lots of cleanups and fixes.
+ Added Harbour make files (both GNU make and hbmk2)
+ Cleaned tests to avoid multiple symbols and much simpler
interdependencies.
! Removed extra test.dbf and what32 dependency.
; TOFIX: Due to public symbol collisions, this GTWVW it's
probably not possible to use it with gtwin lib.
; NOTE: GTWVW is limited to non-UNICODE, non-C++, 32-bit
Windows (no WinCE) builds, and for a clean compiler
I had to suppress Harbour standard warning levels.
Anyway, not basic tests program seems to work,
although I didn't dig into them very deeply.
We will see if this contrib turns out to be useful
or not, and we can decide to drop it or maybe
moving it to contrib once it has been brought up
to Harbour standards. Although the code is huge,
so don't expect to happen this very soon.
358 lines
9.9 KiB
Plaintext
358 lines
9.9 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
compile and link this file together with wutil.prg
|
|
(use drawimg.bat to build)
|
|
|
|
This is a sample of how to display an image file (.bmp,.gif,.jpg)
|
|
in four ways:
|
|
1. Image stretched to fit a region
|
|
(all four coordinates are defined)
|
|
2. Height is defined, width is proportional to height
|
|
(right coordinate is passed as NIL)
|
|
3. Width is defined, height is proportional to width
|
|
(bottom coordinate is passed as NIL)
|
|
4. Actual image size
|
|
(bottom and right coordinate are NIL)
|
|
|
|
Also shown in this sample:
|
|
1. Image Caching
|
|
Image is read from file only once, and then cached.
|
|
Test: After image is displayed, delete the image file.
|
|
Image should be still displayed with no problem,
|
|
since gtwvw already store it in memory.
|
|
2. Transparency
|
|
If this option is used, topleft pixel is used as the transparent mask
|
|
of the image.
|
|
|
|
Remarks:
|
|
Image drawing and wvw_paint management are performed by WUTIL.PRG.
|
|
WUTIL.PRG is a simple "middle module" interfacing an application with
|
|
gtwvw.
|
|
*/
|
|
#include "common.ch"
|
|
#include "hbclass.ch"
|
|
|
|
//WPAINTOBJ types
|
|
#define WPAINTOBJ_LABEL 1
|
|
#define WPAINTOBJ_SHADEDRECT 2
|
|
#define WPAINTOBJ_TEXTBOX 3
|
|
#define WPAINTOBJ_PROGRESSBAR 4
|
|
#define WPAINTOBJ_BOXGET 5
|
|
#define WPAINTOBJ_BOXRAISED 6
|
|
#define WPAINTOBJ_BOXRECESSED 7
|
|
#define WPAINTOBJ_BOXGROUP 8
|
|
#define WPAINTOBJ_BOXGROUPRAISED 9
|
|
#define WPAINTOBJ_IMAGE 10
|
|
#define WPAINTOBJ_OUTLINE 11
|
|
#define WPAINTOBJ_LINE 12
|
|
#define WPAINTOBJ_ELLIPSE 13
|
|
#define WPAINTOBJ_RECTANGLE 14
|
|
#define WPAINTOBJ_FILLRECTANGLE 15
|
|
#define WPAINTOBJ_ROUNDRECT 16
|
|
#define WPAINTOBJ_FOCUSRECT 17
|
|
#define WPAINTOBJ_GRIDHORZ 18
|
|
#define WPAINTOBJ_GRIDVERT 19
|
|
#define WPAINTOBJ_PICTURE 20
|
|
#define WPAINTOBJ_LABELEX 21
|
|
#define WPAINTOBJ_LINEEX 22
|
|
#define WPAINTOBJ_OUTLINEEX 23
|
|
|
|
//WCTRLOBJ types
|
|
#define WCTRLOBJ_PUSHBUTTON 1001
|
|
#define WCTRLOBJ_VSCROLLBAR 1002
|
|
#define WCTRLOBJ_HSCROLLBAR 1003
|
|
#define WCTRLOBJ_COMBOBOX 1004
|
|
|
|
//OBJECT OPERATION
|
|
#define WOBJ_ADD_OVERWRITE 1 //overwrite if exists
|
|
#define WOBJ_ADD_APPEND 2 //append even if exists (the same id can coexist)
|
|
#define WOBJ_ADD_NEWONLY 3 //cancel if exists
|
|
|
|
STATIC s_aPObjList := {}
|
|
|
|
proc main
|
|
local ntop := 7,;
|
|
nleft:= 3,;
|
|
nbot := maxrow()-2,;
|
|
nrig := maxcol()-2,;
|
|
nmidver:=INT((ntop+nbot)/2),;
|
|
nmidhor:=INT((nleft+nrig)/2)
|
|
local cpict := "vouch1.gif",;
|
|
ltransp := .f.,;
|
|
nMaxCache := wvw_SetMaxBMcache()
|
|
local i,j,oWPaint
|
|
local getlist := {}
|
|
setcolor("N/W,N/GR*,,,N/W*")
|
|
wvw_setcodepage(,255)
|
|
wg_ResetWPaintObj( 0 )
|
|
do while .t.
|
|
CLS
|
|
setcursor(1)
|
|
cpict := padr(cpict,40)
|
|
@ 0,0 say "FileName :" get cpict pict "@K" valid file(alltrim(cpict))
|
|
@ 1,0 say "Transpar? :" get ltransp pict "Y"
|
|
@ 2,0 say "Max Cache :" get nMaxCache pict "999"
|
|
@ 3,0 say "NumOfCache=" + trans(wvw_numBMcache(),"999") +;
|
|
", Max NumOfCache=" + trans(wvw_SetMaxBMcache(),"999")
|
|
read
|
|
if lastkey()==27
|
|
exit
|
|
endif
|
|
wvw_SetMaxBMcache(nMaxCache)
|
|
@ 3,0 say "NumOfCache=" + trans(wvw_numBMcache(),"999") +;
|
|
", Max NumOfCache=" + trans(wvw_SetMaxBMcache(),"999")
|
|
|
|
@ 5,0 say "TOPLEFT: stretched image TOPRIGHT: fit vertically (proportional)"
|
|
@ 6,0 say "BOTLEFT: fit horizontally (proportional) BOTRIGHT: actual image size"
|
|
|
|
cpict := alltrim(cpict)
|
|
|
|
//wvw_loadpicture( 1, cpict ) //20060707
|
|
|
|
setcursor(0)
|
|
DISPBEGIN()
|
|
for i := ntop to nbot
|
|
for j := nleft to nrig
|
|
@ i,j say "X"
|
|
next
|
|
next
|
|
@ ntop,nmidhor to nbot,nmidhor
|
|
@ nmidver,nleft to nmidver,nrig
|
|
@ ntop,nleft to nbot,nrig
|
|
DISPEND()
|
|
|
|
* topleft panel, stretch/fit to panel
|
|
oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "TOPLEFT", ntop+1, nleft+1, nmidver-1, nmidhor-1, NIL, ltransp)
|
|
oWPaint:cImage := cpict
|
|
wg_AddWPaintObj( 0, oWPaint )
|
|
|
|
* topright panel, fit vertically
|
|
oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "TOPRIGHT", ntop+1, nmidhor+1, nmidver-1, NIL, NIL, ltransp)
|
|
oWPaint:cImage := cpict
|
|
wg_AddWPaintObj( 0, oWPaint )
|
|
|
|
* botleft panel, fit horizontally
|
|
oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "BOTLEFT", nmidver+1, nleft+1, NIL, nmidhor-1, NIL, ltransp)
|
|
oWPaint:cImage := cpict
|
|
wg_AddWPaintObj( 0, oWPaint )
|
|
|
|
* botright panel, actual image size
|
|
oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "BOTRIGHT", nmidver+1, nmidhor+1, NIL, NIL, NIL, ltransp)
|
|
oWPaint:cImage := cpict
|
|
wg_AddWPaintObj( 0, oWPaint )
|
|
|
|
inkey(0)
|
|
|
|
* delete all image objects
|
|
wg_DelWPaintObj(0, WPAINTOBJ_IMAGE, NIL)
|
|
enddo //while .t.
|
|
setcursor(1)
|
|
return
|
|
|
|
|
|
*************** simple wpaint organizer *******
|
|
|
|
/*********************************************************/
|
|
|
|
CLASS wGUIObj
|
|
DATA nWinNum //parent window's number
|
|
DATA lVisible //is the object visible
|
|
DATA nType //Type
|
|
DATA cId //Id
|
|
DATA nRow1, nCol1, nRow2, nCol2 //mouse object region
|
|
DATA aOffTLBR //offset in pixels
|
|
|
|
ENDCLASS //wGUIObj
|
|
|
|
/*********************************************************/
|
|
|
|
CLASS wPaintObj FROM wGUIObj
|
|
* image like wvtimage
|
|
DATA cImage
|
|
DATA lTransp
|
|
|
|
METHOD New()
|
|
METHOD Draw()
|
|
METHOD Undraw()
|
|
METHOD Hide()
|
|
METHOD Show()
|
|
ENDCLASS //wPaintOBJ
|
|
|
|
METHOD New(nWinNum, nType, cId, nRow1, nCol1, nRow2, nCol2, aOffTLBR, lTransp) CLASS wPaintObj
|
|
default aOffTLBR to {0,0,0,0}
|
|
default lTransp to .f.
|
|
|
|
::nWinNum := nWinNum
|
|
::lVisible := .t.
|
|
|
|
::nType := nType
|
|
::cId := cId
|
|
::nRow1 := nRow1
|
|
::nCol1 := nCol1
|
|
::nRow2 := nRow2
|
|
::nCol2 := nCol2
|
|
|
|
if !(valtype(aOffTLBR)=="A")
|
|
aOffTLBR := {0,0,0,0}
|
|
endif
|
|
|
|
::aOffTLBR := aclone(aOffTLBR)
|
|
|
|
::lTransp := lTransp
|
|
RETURN Self
|
|
|
|
METHOD Draw() CLASS wPaintObj
|
|
if !::lVisible
|
|
return NIL
|
|
endif
|
|
|
|
do case
|
|
case ::nType==WPAINTOBJ_IMAGE
|
|
if !empty(::cImage)
|
|
WVW_DRAWIMAGE( ::nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ;
|
|
::cImage, ::aOffTLBR, ::lTransp )
|
|
endif
|
|
|
|
otherwise
|
|
* lBoxErrMessage()
|
|
endcase
|
|
|
|
RETURN NIL //DRAW()
|
|
|
|
METHOD Undraw() CLASS wPaintObj
|
|
* undraw the object
|
|
* normally this is called with ::lVisible == .f.,
|
|
* otherwise the object will be redrawn by WVW_PAINT
|
|
local cScreen
|
|
local nRow1, nCol1, nRow2, nCol2, nMaxRow, nMaxCol
|
|
* to be safer, the area can be enlarged first
|
|
nMaxRow := maxrow()
|
|
nMaxCol := maxcol()
|
|
|
|
do case
|
|
case ::nType==WPAINTOBJ_LABEL
|
|
nRow1 := ::nRow1
|
|
nCol1 := ::nCol1
|
|
nRow2 := ::nRow2
|
|
nCol2 := ::nCol2
|
|
otherwise
|
|
nRow1 := max(::nRow1-1, 0)
|
|
nCol1 := max(::nCol1-1, 0)
|
|
nRow2 := min(::nRow2+1, nMaxRow)
|
|
nCol2 := min(::nCol2+1, nMaxCol)
|
|
endcase
|
|
|
|
cScreen := savescreen(nRow1, nCol1, nRow2, nCol2)
|
|
DISPBEGIN()
|
|
restscreen(nRow1, nCol1, nRow2, nCol2, cScreen)
|
|
DISPEND()
|
|
RETURN NIL //undraw()
|
|
|
|
METHOD Hide() CLASS wPaintObj
|
|
* temporarily hides the object
|
|
::lVisible := .f.
|
|
::Undraw()
|
|
RETURN NIL
|
|
|
|
METHOD Show() CLASS wPaintObj
|
|
* show the object
|
|
::lVisible := .t.
|
|
::draw()
|
|
RETURN NIL
|
|
|
|
/*********************************************************/
|
|
|
|
function wg_ResetWPaintObj( nWinNum, nObjNum, lStrict )
|
|
* clears all wPaint objects from window nWinNum
|
|
* if nObjNum specified, clears object >= nObjNum
|
|
local i
|
|
default nObjNum to 0
|
|
default lStrict to .f.
|
|
|
|
do while len(s_aPObjList) < nWinNum+1
|
|
aadd( s_aPObjList, {} )
|
|
enddo
|
|
|
|
asize(s_aPObjList[ nWinNum+1 ], nObjNum)
|
|
|
|
return .t.
|
|
|
|
function wg_AddWPaintObj( nWinNum, oWPaint, lStrict, nOperation )
|
|
* adds a WPaint object oWPaint into window nWinNum
|
|
* returns ::cId if successful. "" if failed.
|
|
local i
|
|
local nLen, aRect //20050720
|
|
default lStrict to .f.
|
|
default nOperation to WOBJ_ADD_OVERWRITE
|
|
|
|
* simplified:
|
|
nOperation := WOBJ_ADD_OVERWRITE
|
|
|
|
* parameter checking...
|
|
* ...
|
|
|
|
* exist nType + cId ?
|
|
i := ASCAN(s_aPObjList[ nWinNum+1 ], {|x| x:nType==oWPaint:nType .and. x:cId==oWPaint:cId})
|
|
|
|
if i > 0
|
|
* so we are about to overwrite now...
|
|
//::Hide() is ideal, but it can be slow
|
|
//let's do it only of user want strict/perfect operation
|
|
if lStrict
|
|
s_aPObjList[ nWinNum+1 ][i]:Hide()
|
|
else
|
|
s_aPObjList[ nWinNum+1 ][i]:lVisible := .f.
|
|
endif
|
|
s_aPObjList[ nWinNum+1 ][i] := oWPaint
|
|
|
|
else
|
|
aadd( s_aPObjList[ nWinNum+1 ], oWPaint )
|
|
endif
|
|
|
|
* if it is visible, draw it now!
|
|
if oWPaint:lVisible
|
|
oWPaint:draw()
|
|
endif
|
|
return oWPaint:cId //20040811 was .t.
|
|
|
|
function wg_DelWPaintObj( nWinNum, nType, cId, lStrict )
|
|
* deletes a WPaint object oWPaint from window nWinNum
|
|
* returns number of object deleted.
|
|
*
|
|
*NOTE: if cId is NIL, delete all object of type nType
|
|
local i
|
|
local lDelAll := (cId == NIL)
|
|
local nDeleted := 0
|
|
local nLen
|
|
local cCurId
|
|
default lStrict to .f.
|
|
|
|
* is nType set?
|
|
if nType < 1
|
|
return nDeleted
|
|
endif
|
|
|
|
* exist nType + cId ?
|
|
i := 1
|
|
nLen := len(s_aPObjList[ nWinNum+1 ])
|
|
do while i <= nLen
|
|
if s_aPObjList[ nWinNum+1 ][i]:nType==nType .and.;
|
|
(lDelAll .or. s_aPObjList[ nWinNum+1 ][i]:cId==cId)
|
|
if lStrict
|
|
s_aPObjList[ nWinNum+1 ][i]:Hide()
|
|
else
|
|
s_aPObjList[ nWinNum+1 ][i]:lVisible := .f.
|
|
endif
|
|
cCurId := s_aPObjList[ nWinNum+1 ][i]:cId
|
|
adel(s_aPObjList[ nWinNum+1 ], i)
|
|
asize(s_aPObjList[ nWinNum+1 ], --nLen)
|
|
nDeleted++
|
|
else
|
|
i++
|
|
endif
|
|
enddo
|
|
return nDeleted
|