Files
harbour-core/harbour/examples/gtwvw/tests/drawimg.prg
Viktor Szakats a5a304efc2 2009-12-22 03:47 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* 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.
2009-12-22 02:50:24 +00:00

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