2005-12-09, 15:32 h
thomas
Posts: 7723
User
|
Hier ist ein Beispiel mit Bewegung:
code:
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/utility.h>
#include <intuition/gadgetclass.h>
#include <intuition/imageclass.h>
#include <intuition/icclass.h>
#define GID_RARROW 911
#define GID_LARROW 912
#define GID_UARROW 913
#define GID_DARROW 914
#define GID_XPROP 915
#define GID_YPROP 916
void draw_something (struct RastPort *rp,long x,long y,long w,long h)
{
UBYTE c = 0;
long i;
w --;
h --;
for (i = 0; i <= w; i += 5)
{
SetAPen (rp,c);
Move (rp,x+i,y);
Draw (rp,x+w-i,y+h);
c ++;
}
for (i = 0; i <= h; i += 5)
{
SetAPen (rp,c);
Move (rp,x+w,y+i);
Draw (rp,x,y+h-i);
c ++;
}
}
int main (int argc,char *argv[])
{
struct RDArgs *rdargs;
static struct {
char *pubscreen;
} args = {0};
struct Screen *scr;
struct Window *win;
struct MsgPort *port;
struct IntuiMessage *mess;
BOOL cont;
long barh;
long w,h;
long sizew,sizeh;
struct DrawInfo *drawinfo;
struct Image *sizeimage,*rarrowimage,*larrowimage,*darrowimage,*uarrowimage;
struct Gadget *xprop,*yprop,*rarrowbutton,*larrowbutton,*darrowbutton,*uarrowbutton;
struct BitMap *pattern;
long xtotal,ytotal;
if (rdargs = ReadArgs ("PUBSCREEN/K",(APTR)&args,NULL))
{
if (scr = LockPubScreen (args.pubscreen))
{
xtotal = scr->Width;
ytotal = scr->Height;
drawinfo = GetScreenDrawInfo (scr);
sizeimage = NewObject (NULL,SYSICLASS,
SYSIA_Which,SIZEIMAGE,
SYSIA_Size,SYSISIZE_MEDRES,
SYSIA_DrawInfo,drawinfo,
TAG_END);
if (sizeimage)
{
GetAttr (IA_Width,sizeimage,&sizew);
GetAttr (IA_Height,sizeimage,&sizeh);
}
else
{
sizew = 18;
sizeh = 10;
}
darrowimage = NewObject (NULL,SYSICLASS,
SYSIA_Which,DOWNIMAGE,
SYSIA_Size,SYSISIZE_MEDRES,
SYSIA_DrawInfo,drawinfo,
TAG_END);
if (darrowimage)
{
GetAttr (IA_Width,darrowimage,&w);
GetAttr (IA_Height,darrowimage,&h);
}
darrowbutton = NewObject (NULL,BUTTONGCLASS,
GA_ID,GID_DARROW,
GA_RelRight,-w+1,
GA_RelBottom,-sizeh-h+1,
GA_Width,w,
GA_Height,h,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_RightBorder,TRUE,
GA_Image,darrowimage,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
uarrowimage = NewObject (NULL,SYSICLASS,
SYSIA_Which,UPIMAGE,
SYSIA_Size,SYSISIZE_MEDRES,
SYSIA_DrawInfo,drawinfo,
TAG_END);
if (uarrowimage)
{
GetAttr (IA_Width,uarrowimage,&w);
GetAttr (IA_Height,uarrowimage,&h);
}
uarrowbutton = NewObject (NULL,BUTTONGCLASS,
GA_Previous,darrowbutton,
GA_ID,GID_UARROW,
GA_RelRight,-w+1,
GA_RelBottom,-sizeh-h-h+1,
GA_Width,w,
GA_Height,h,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_RightBorder,TRUE,
GA_Image,uarrowimage,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
barh = scr->WBorTop+scr->RastPort.TxHeight+2;
yprop = NewObject (NULL,PROPGCLASS,
GA_Previous,uarrowbutton,
GA_ID,GID_YPROP,
GA_RelRight,-sizew+4,
GA_Top,barh,
GA_Width,sizew-6,
GA_RelHeight,-sizeh-h-h-barh-1,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_RightBorder,TRUE,
PGA_Freedom,FREEVERT,
PGA_Borderless,TRUE,
PGA_NewLook,TRUE,
PGA_Total,ytotal,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
rarrowimage = NewObject (NULL,SYSICLASS,
SYSIA_Which,RIGHTIMAGE,
SYSIA_Size,SYSISIZE_MEDRES,
SYSIA_DrawInfo,drawinfo,
TAG_END);
if (rarrowimage)
{
GetAttr (IA_Width,rarrowimage,&w);
GetAttr (IA_Height,rarrowimage,&h);
}
rarrowbutton = NewObject (NULL,BUTTONGCLASS,
GA_Previous,yprop,
GA_ID,GID_RARROW,
GA_RelRight,-sizew-w+1,
GA_RelBottom,-h+1,
GA_Width,w,
GA_Height,h,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_BottomBorder,TRUE,
GA_Image,rarrowimage,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
larrowimage = NewObject (NULL,SYSICLASS,
SYSIA_Which,LEFTIMAGE,
SYSIA_Size,SYSISIZE_MEDRES,
SYSIA_DrawInfo,drawinfo,
TAG_END);
if (larrowimage)
{
GetAttr (IA_Width,larrowimage,&w);
GetAttr (IA_Height,larrowimage,&h);
}
larrowbutton = NewObject (NULL,BUTTONGCLASS,
GA_Previous,rarrowbutton,
GA_ID,GID_LARROW,
GA_RelRight,-sizew-w-w+1,
GA_RelBottom,-h+1,
GA_Width,w,
GA_Height,h,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_BottomBorder,TRUE,
GA_Image,larrowimage,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
xprop = NewObject (NULL,PROPGCLASS,
GA_Previous,larrowbutton,
GA_ID,GID_XPROP,
GA_Left,scr->WBorLeft,
GA_RelBottom,-sizeh+3,
GA_RelWidth,-sizew-w-w-scr->WBorLeft-1,
GA_Height,sizeh-4,
GA_DrawInfo,drawinfo,
GA_GZZGadget,TRUE,
GA_BottomBorder,TRUE,
PGA_Freedom,FREEHORIZ,
PGA_Borderless,TRUE,
PGA_NewLook,TRUE,
PGA_Total,xtotal,
ICA_TARGET,ICTARGET_IDCMP,
TAG_END);
w = scr->Width >> 1;
h = scr->Height >> 1;
if (pattern = AllocBitMap (xtotal,ytotal,GetBitMapAttr(scr->RastPort.BitMap,BMA_DEPTH),BMF_MINPL ANES|BMF_CLEAR,scr->RastPort.BitMap))
{
struct RastPort rp;
InitRastPort (&rp);
rp.BitMap = pattern;
draw_something (&rp,0,0,xtotal,ytotal);
}
if (win = OpenWindowTags (NULL,
WA_CustomScreen,scr,
WA_Title,"Scroll",
WA_Width,w,WA_Height,h,
WA_Left,(scr->Width - w) >> 1,
WA_Top,(scr->Height - h) >> 1,
WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SIZEG ADGET|WFLG_GIMMEZEROZERO|WFLG_ACTIVATE|WFLG_NOCAREREFRESH,
WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE|IDCMP_IDCMPUPDATE,
WA_MinWidth,120,WA_MinHeight,90,
WA_MaxWidth,-1,WA_MaxHeight,-1,
WA_Gadgets,darrowbutton,
TAG_END))
{
long x,y;
long maxx,maxy;
BOOL new_size = TRUE;
port = win->UserPort;
cont = TRUE;
do {
if (new_size)
{
SetGadgetAttrs (xprop,win,NULL,PGA_Visible,win->GZZWidth,TAG_END);
SetGadgetAttrs (yprop,win,NULL,PGA_Visible,win->GZZHeight,TAG_END);
maxx = xtotal - win->GZZWidth;
maxy = ytotal - win->GZZHeight;
GetAttr (PGA_Top,xprop,&x);
GetAttr (PGA_Top,yprop,&y);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
new_size = FALSE;
}
WaitPort (port);
while (mess = (struct IntuiMessage *) GetMsg (port))
{
switch (mess->Class)
{
case IDCMP_IDCMPUPDATE:
switch (GetTagData (GA_ID,0,(struct TagItem *)mess->IAddress))
{
case GID_LARROW:
if (x > 0)
{
x -= 10;
if (x < 0)
x = 0;
SetGadgetAttrs (xprop,win,NULL,PGA_Top,x,TAG_END);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
}
break;
case GID_RARROW:
if (x < maxx)
{
x += 10;
if (x > maxx)
x = maxx;
SetGadgetAttrs (xprop,win,NULL,PGA_Top,x,TAG_END);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
}
break;
case GID_UARROW:
if (y > 0)
{
y -= 10;
if (y < 0)
y = 0;
SetGadgetAttrs (yprop,win,NULL,PGA_Top,y,TAG_END);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
}
break;
case GID_DARROW:
if (y < maxy)
{
y += 10;
if (y > maxy)
y = maxy;
SetGadgetAttrs (yprop,win,NULL,PGA_Top,y,TAG_END);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
}
break;
case GID_XPROP:
x = GetTagData (PGA_Top,0,(struct TagItem *)mess->IAddress);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
break;
case GID_YPROP:
y = GetTagData (PGA_Top,0,(struct TagItem *)mess->IAddress);
if (pattern)
BltBitMapRastPort (pattern,x,y,win->RPort,0,0,win->GZZWidth,win->GZZHeight,0xc0);
break;
}
break;
case IDCMP_NEWSIZE:
new_size = TRUE;
break;
case IDCMP_CLOSEWINDOW:
cont = FALSE;
break;
}
ReplyMsg ((struct Message *) mess);
}
}
while (cont);
CloseWindow (win);
}
DisposeObject (larrowbutton);
DisposeObject (larrowimage);
DisposeObject (rarrowbutton);
DisposeObject (rarrowimage);
DisposeObject (xprop);
DisposeObject (darrowbutton);
DisposeObject (darrowimage);
DisposeObject (uarrowbutton);
DisposeObject (uarrowimage);
DisposeObject (yprop);
DisposeObject (sizeimage);
if (pattern)
FreeBitMap (pattern);
FreeScreenDrawInfo (scr,drawinfo);
UnlockPubScreen (NULL,scr);
}
FreeArgs (rdargs);
}
PrintFault (IoErr(),NULL);
return(0);
}
Gruß Thomas
--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/
[ - Answer - Quote - Direct link - ]
|