📄 gui16.cpp
字号:
xx1=xx3= width;
if(xx2 < 0)
xx2=xx4= 0;
if(xx2 > width)
{ xx2=xx4= width;
b1 = false;
}
if(xx5 < 0)
{ xx5=xx7= 0;
b2 = false;
}
if(xx5 > width)
xx5=xx7= width;
if(xx6 < 0)
xx6=xx8= 0;
if(xx6 > width)
{ xx6=xx8= width;
b2 = false;
}
if(b1)
{ if(y1>=0&&y1<=height)
{ pt = p + pitch*y2 + xx2;
*pt = color;
while(xx2<xx1)
{ pt++;
*pt = color;
xx2++;
}
}
if(y3>=0&&y3<=height)
{ pt = p + pitch*y4 + xx4;
*pt = color;
while(xx4<xx3)
{ pt++;
*pt = color;
xx4++;
}
}
}
if(b2)
{ if(y5>=0&&y5<=height)
{ pt = p + pitch*y6 + xx6;
*pt = color;
while(xx6<xx5)
{ pt++;
*pt = color;
xx6++;
}
}
if(y7>=0&&y7<=height)
{ pt = p + pitch*y8 + xx8;
*pt = color;
while(xx8<xx7)
{ pt++;
*pt = color;
xx8++;
}
}
}
}
}
void ellipse(DDSURFACEDESC* ddsd,int xx1,int yy1,int xx2,int yy2,WORD color)
{ int xx,yy,x1,x2,x3,x4,y1,y2,y3,y4,pk;
int xc,yc,rx,ry,rx2,ry2,tworx2,twory2,px,py;
xc = (xx1 + xx2) >> 1;
yc = (yy1 + yy2) >> 1;
if(xx1 > xx2)
rx = (xx1 - xx2) >> 1;
else
rx = (xx2 - xx1) >> 1;
if(yy1 > yy2)
ry = (yy1 - yy2) >> 1;
else
ry = (yy2 - yy1) >> 1;
rx2 = rx * rx;
ry2 = ry * ry;
tworx2 = rx2<<1;
twory2 = ry2<<1;
xx = 0;
yy = ry;
px = 0;
py = tworx2 * yy;
pk = ry2 - rx2*ry + rx2>>2;
x1 = xc , y1 = yc + ry;
x2 = xc , y2 = yc + ry;
x3 = xc , y3 = yc - ry;
x4 = xc , y4 = yc - ry;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
while(px < py)
{ xx++;
px+= twory2;
x1++,x2--,x3++,x4--;
if(pk < 0)
pk+= ry2 + px;
else
{ yy--;
y1--,y2--,y3++,y4++;
py -= tworx2;
pk+= ry2 + px - py;
}
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
}
pk = (int)sqrt(((ry2*(xx*2+1)*(xx*2+1))>>2) + rx2*(yy-1)*(yy-1) - rx2*ry2);
while(yy>0)
{ yy--;
y1--,y2--,y3++,y4++;
py-=tworx2;
if(pk>0)
{ pk+=rx2 - py;
}
else
{ xx++;
x1++,x2--,x3++,x4--;
px+=twory2;
pk+=rx2-py+px;
}
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
}
}
void ellipseFill(DDSURFACEDESC* ddsd,int a1,int b1,int a2,int b2,WORD color)
{ int xx,yy,x1,x2,x3,x4,y1,y2,y3,y4,pk;
int xc,yc,rx,ry,rx2,ry2,tworx2,twory2,px,py;
int xx1,xx2,xx3,xx4;
long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
long pitch = ddsd->lPitch>>1;
WORD* p=(WORD*)ddsd->lpSurface,*pt;
bool b;
xc = (a1 + a2) >> 1;
yc = (b1 + b2) >> 1;
if(a1 > a2)
rx = (a1 - a2) >> 1;
else
rx = (a2 - a1) >> 1;
if(b1 > b2)
ry = (b1 - b2) >> 1;
else
ry = (b2 - b1) >> 1;
rx2 = rx * rx;
ry2 = ry * ry;
tworx2 = rx2<<1;
twory2 = ry2<<1;
xx = 0;
yy = ry;
px = 0;
py = tworx2 * yy;
pk = ry2 - rx2*ry + rx2>>2;
x1 = xc , y1 = yc + ry;
x2 = xc , y2 = yc + ry;
x3 = xc , y3 = yc - ry;
x4 = xc , y4 = yc - ry;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x3,y3,color);
while(px < py)
{ xx++;
px+= twory2;
x1++,x2--,x3++,x4--;
if(pk < 0)
{ b = false;
pk+= ry2 + px;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
}
else
{ yy--;
b = true;
y1--,y2--,y3++,y4++;
py -= tworx2;
pk+= ry2 + px - py;
}
xx1=x1,xx2=x2,xx3=x3,xx4=x4;
if(xx1 < 0 || xx2 > width)
b = false;
if(xx1 > width)
xx1=xx3=width;
if(xx2 < 0)
xx2=xx4=0;
if(b)
{ if(y1>=0&&y1<=height)
{ pt = p + pitch*y2 + xx2;
*pt = color;
while(xx2<xx1)
{ pt++;
*pt = color;
xx2++;
}
}
if(y3>=0&&y3<=height)
{ pt = p + pitch*y4 + xx4;
*pt = color;
while(xx4<xx3)
{ pt++;
*pt = color;
xx4++;
}
}
}
}
pk = (int)sqrt(((ry2*(xx*2+1)*(xx*2+1))>>2) + rx2*(yy-1)*(yy-1) - rx2*ry2);
while(yy>0)
{ b = true;
yy--;
y1--,y2--,y3++,y4++;
py-=tworx2;
if(pk>0)
{ pk+=rx2 - py;
}
else
{ xx++;
x1++,x2--,x3++,x4--;
px+=twory2;
pk+=rx2-py+px;
}
xx1=x1,xx2=x2,xx3=x3,xx4=x4;
if(xx1 < 0 || xx2 > width)
b = false;
if(xx1 > width)
xx1=xx3=width;
if(xx2 < 0)
xx2=xx4=0;
if(b)
{ if(y1>=0&&y1<=height)
{ pt = p + pitch*y2 + xx2;
*pt = color;
while(xx2<xx1)
{ pt++;
*pt = color;
xx2++;
}
}
if(y3>=0&&y3<=height)
{ pt = p + pitch*y4 + xx4;
*pt = color;
while(xx4<xx3)
{ pt++;
*pt = color;
xx4++;
}
}
}
}
}
void drawRect(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{ int chg,xx1,xx2,yy1,yy2,x,y;
long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
long pitch = ddsd->lPitch>>1;
WORD* p=(WORD*)ddsd->lpSurface,*pt;
if(x1 > x2)
{ chg = x1;
x1 = x2;
x2 = chg;
}
if(y1 > y2)
{ chg = y1;
y1 = y2;
y2 = chg;
}
if(x1 > width || x2 < 0 || y1 > height || y2 < 0)
return;
xx1 = x1;xx2 = x2;yy1 = y1;yy2 = y2;
if(x1<0)
xx1 = 0;
if(x2>width)
xx2 = width;
if(y1<0)
yy1 = 0;
if(y2>height)
yy2 = height;
if(y1>=0)
{ pt = p + pitch*y1 + xx1;
*pt = color;
x = xx1;
while(x<xx2)
{ pt++;
*pt = color;
x++;
}
}
if(y2<=height)
{ pt = p + pitch*y2 + xx1;
*pt = color;
x = xx1;
while(x<xx2)
{ pt++;
*pt = color;
x++;
}
}
if(x1 >= 0)
{ pt = p + pitch*yy1 + x1;
*pt = color;
y = yy1;
while(y<yy2)
{ pt+=pitch;
*pt = color;
y++;
}
}
if(x2 <= width)
{ pt = p + pitch*yy1 + x2;
*pt = color;
y = yy1;
while(y<yy2)
{ pt+=pitch;
*pt = color;
y++;
}
}
}
void rectFill(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{ int chg,x;
long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
long pitch1,pitch = ddsd->lPitch>>1;
WORD* p=(WORD*)ddsd->lpSurface;
if(x1 > x2)
{ chg = x1;
x1 = x2;
x2 = chg;
}
if(y1 > y2)
{ chg = y1;
y1 = y2;
y2 = chg;
}
if(x1 > width || x2 < 0 || y1 > height || y2 < 0)
return;
if(x1<0)
x1 = 0;
if(x2>width)
x2 = width;
if(y1<0)
y1 = 0;
if(y2>height)
y2 = height;
p +=pitch*y1 + x1;
pitch1 = pitch-x2+x1;
while(y1<=y2)
{ *p=color;
x = x1;
while(x<x2)
{ p++;
x++;
*p=color;
}
y1++;
p+=pitch1;
}
}
void drawPolygon(DDSURFACEDESC* ddsd,POINT* points,int num,WORD color)
{ int i;
for(i=0;i<num-1;i++)
line(ddsd,points[i].x,points[i].y,points[i+1].x,points[i+1].y,color);
line(ddsd,points[0].x,points[0].y,points[num-1].x,points[num-1].y,color);
}
#define INDEX_FORWORD(index) index = (index + 1) % num;
#define INDEX_BACKWORD(index) index = (index - 1 + num) % num;
void polygonFill(DDSURFACEDESC* ddsd,POINT* points,int num,WORD color)
{ int lx1,ly1,lx2,ly2,rx1,ry1,rx2,ry2,ldx,ldy,rdx,rdy;
int minY,maxY,lindex,rindex,lxinc,rxinc,lxadd,rxadd,lxsgn,rxsgn,lxsum,rxsum;
int i,x1,x2;
long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
long pitch = ddsd->lPitch>>1;
WORD* p=(WORD*)ddsd->lpSurface,*pt;
if(num < 3)
return;
rindex = lindex = 0;
maxY=minY=points[0].y;
for(i=0;i<num;i++)
{ if(points[i].y<minY)
minY = points[lindex = i].y;
else if(points[i].y > maxY)
maxY = points[i].y;
}
if(minY == maxY)
return;
rindex = lindex;
while(points[lindex].y == minY)
//INDEX_BACKWORD(lindex);
INDEX_FORWORD(lindex);
INDEX_BACKWORD(lindex);
//INDEX_FORWORD(lindex);
while(points[rindex].y == minY)
//INDEX_FORWORD(rindex);
INDEX_BACKWORD(rindex);
//INDEX_BACKWORD(rindex);
INDEX_FORWORD(rindex);
lx1 = points[lindex].x;
ly1 = points[lindex].y;
INDEX_FORWORD(lindex);
//INDEX_BACKWORD(lindex);
lx2 = points[lindex].x;
ly2 = points[lindex].y;
ldx = lx2 - lx1;
ldy = ly2 - ly1;
lxsgn = (ldx >= 0)?1:-1;
if(ldy>0)
{ lxadd = ldx/ldy;
lxinc = (ldx%ldy)*lxsgn;
}
rx1 = points[rindex].x;
ry1 = points[rindex].y;
INDEX_BACKWORD(rindex);
//INDEX_FORWORD(rindex);
rx2 = points[rindex].x;
ry2 = points[rindex].y;
rdx = rx2 - rx1;
rdy = ry2 - ry1;
rxsgn = (rdx >= 0)?1:-1;
if(rdy>0)
{ rxadd = rdx/rdy;
rxinc = (rdx%rdy)*rxsgn;
}
lxsum = 0;
rxsum = 0;
minY++;
p += pitch*minY;
while(minY <= maxY)
{ lxsum+=lxinc;
lx1+=lxadd;
if(lxsum >= ldy)
{ lx1+=lxsgn;
lxsum -= ldy;
}
rxsum+=rxinc;
rx1+=rxadd;
if(rxsum >= rdy)
{ rx1+=rxsgn;
rxsum -= rdy;
}
x1 = lx1,x2 = rx1 - 1;
if(minY>=0&&minY<=height&&x1<=width&&x2>=0&&x2>=x1)
{ if(x1<0)
x1=0;
if(x2>width)
x2=width;
pt = p + x1;
*pt = color;
while(x1<x2)
{ pt++;
*pt = color;
x1++;
}
}
if(minY == ly2)
{ do{
lx1 = points[lindex].x;
ly1 = points[lindex].y;
INDEX_FORWORD(lindex);
//INDEX_BACKWORD(lindex);
lx2 = points[lindex].x;
ly2 = points[lindex].y;
}while(ly2 == ly1);
ldx = lx2 - lx1;
ldy = ly2 - ly1;
lxsgn = (ldx >= 0)?1:-1;
if(ldy>0)
{ lxadd = ldx/ldy;
lxinc = (ldx%ldy)*lxsgn;
}
}
if(minY == ry2)
{ do{
rx1 = points[rindex].x;
ry1 = points[rindex].y;
INDEX_BACKWORD(rindex);
//INDEX_FORWORD(rindex);
rx2 = points[rindex].x;
ry2 = points[rindex].y;
}while(ry2 == ry1);
rdx = rx2 - rx1;
rdy = ry2 - ry1;
rxsgn = (rdx >= 0)?1:-1;
if(rdy>0);
{ rxadd = rdx/rdy;
rxinc = (rdx%rdy)*rxsgn;
}
}
minY++;
p += pitch;
}
}
bool loadBitmap(LPDIRECTDRAWSURFACE FAR * lpsurface,LPCSTR fileName)
{ BMPHEAD head;
unsigned long bufLen,width,height;
unsigned char* buf;
DDSURFACEDESC ddsd;
HRESULT ddrval;
ifstream ifs(fileName,ios::binary);
if(!ifs)
return FALSE;
ifs.read((char*)&head,sizeof(BMPHEAD));
if(!ifs.good())
return FALSE;
width = head.width;
height = head.height;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS |
DDSD_WIDTH|
DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |DDSCAPS_SYSTEMMEMORY ;
ddsd.dwWidth = width;
ddsd.dwHeight = height;
ddrval = lpDD->CreateSurface( &ddsd, lpsurface, NULL );
if(ddrval != DD_OK)
return FALSE;
bufLen = (width*3 + 3) & 0xfffffffc;
if((buf = new unsigned char[bufLen]) == NULL)
return FALSE;
while ((ddrval=(*lpsurface)->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
;
WORD* p = (WORD*)ddsd.lpSurface + width*height - 1 - width;
for(UINT i=0;i<height;i++)
{ ifs.read(buf,bufLen);
if(ifs.bad())
{ (*lpsurface)->Unlock(NULL);
return FALSE;
}
for(UINT j=0;j<width;j++)
{ *p++ = (((WORD)buf[j*3]&0xfff8)>>3) |
(((WORD)buf[j*3+1]&0xfffc)<<3)|
(((WORD)buf[j*3+2]&0xfff8)<<8);
}
p -= width*2;
}
(*lpsurface)->Unlock(NULL);
delete[] buf;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -