第三章 绘图
第一节 刷新窗口
第二节 绘制图形
第三节 读取图片
第四节 绘制图片
第五节 绘制拉伸图片
第六节 绘制透明图片
第一节 刷新窗口
以下函数可以刷新窗口:
void freshwin();
绘图完毕后须刷新窗口才能使绘制的内容生效(默认情况下,绘图子程序会绘制到缓冲区)。
使用绘图子程序会占用CPU,因此应尽量避免使用或减少使用次数,例如用图片代替图形。
刷新窗口后,帧率会自动更新。详情请阅读第五章第四节帧率获取。
实例:
#include "disp.h"//使用Display单元库
int main(){
createwin(red);//建立红色窗口
clear(blue);//清屏蓝色
msgbox("清屏没有生效");//这里清屏不会生效
freshwin();//刷新窗口
msgbox("清屏已生效");//这里清屏生效了
return 0;}
第二节 绘制图形
以下过程可以绘制图形:
void setpixel(unsigned long x,unsigned long y,unsigned long c);
void line(unsigned long x,unsigned long y,long w,long h,unsigned long c);
void bar(unsigned long x,unsigned long y,long w,long h,unsigned long c);
void bar(unsigned long x,unsigned long y,long w,long h,unsigned long cfg,unsigned long cbg);
void circle(long x,long y,long r,unsigned long cfg,unsigned long cbg);
void ellipse(long x,long y,long rx,long ry,unsigned long cfg,unsigned long cbg);
void ellipse(long x,long y,long rx,long ry,double sa,double ea,unsigned long cfg,unsigned long cbg);
void clear(unsigned long c);
void clear();
clear过程调用了bar过程。
实例:
#include "disp.h"//使用Display单元库
unsigned long n=0x1000;//绘制点数量
int main(){
createwin();//建立窗口
line(10,10,100,100,red);//绘制直线
bar(110,10,100,100,blue);//绘制矩形
circle(60,160,50,green);//绘制圆形
ellipse(185,160,25,50,pink);//绘制椭圆
while(n>0)
{
setpixel(random(getwidth()),random(getheight()),random(0xffffff));//随机画点
n=n-1;
}
freshwin();//刷新窗口
msgbox("绘制完成");//输出绘制完成信息
return 0;}
第三节 读取图片
读取图片之前,请先创建pbitmap类型变量。
pbitmap和bitmap类型结构:
struct bitmap {
unsigned long handle;
unsigned long dc;
unsigned long width;
unsigned long height;
unsigned long color;};
typedef bitmap* pbitmap;
以下函数可以读取图片:
pbitmap loadbmp(const char* s);
pbitmap loadbmp(const char* s,unsigned long c);
s为文件名,c为图片背景颜色(默认透明色)。
函数返回pbitmap类型的图片。
支持的格式:BMP,PNG,JPG,GIF和TIF。
在读取图片之前必须先创建窗口(因为创建图片时需要创建和窗口兼容的设备上下文句柄)。
实例:
#include "disp.h"//使用Display单元库
pbitmap img;
int main(){
createwin();//建立窗口
img=loadbmp("display.png");
msgbox(i2s(img->width)+" "+i2s(img->height));//输出图片信息
return 0;}
第四节 绘制图片
以下过程可以绘制图片:
void drawbmp(pbitmap b,unsigned long xd,unsigned long yd);
void drawbmp(pbitmap bs,pbitmap bd,unsigned long xd,unsigned long yd);
xd,yd为目标坐标,b,bs为需要绘制的图片,bd为绘制的目标。未指定bd时绘制到窗口。
bar,line等绘图过程也可以绘制到图片,只需在第一个参数加入pbitmap的图片变量即可。
实例:
#include "disp.h"//使用Display单元库
pbitmap img1,img2;
int main(){
createwin(800,600);//建立窗口
img1=loadbmp("display.png");//读取图片
img2=loadbmp("display.png");//读取图片
drawbmp(img1,(getwidth()-img1->width)/2,(getheight()-img1->height)/2);//绘制图片1
freshwin();//刷新窗口
msgbox("图片1");//输出绘制完成信息
bar(img2,img2->width/4,img2->height/4,img2->width/2,img2->height/2,blue);//绘制矩形到图片2中间
drawbmp(img2,(getwidth()-img2->width)/2,(getheight()-img2->height)/2);//绘制图片2
freshwin();//刷新窗口
msgbox("图片2");//输出绘制完成信息
return 0;}
第五节 绘制拉伸图片
以下过程可以绘制拉伸的图片:
procedure void drawbmp(pbitmap b,unsigned long xs,unsigned long ys,unsigned long ws,unsigned long hs,unsigned long xd,unsigned long yd,unsigned long wd,unsigned long hd);
wd,hd为目标大小,不能为负数(不能反射)。
xs,ys为需要绘制的图片左上角的位置,ws,hs为需要绘制的图片从xs,ys开始的大小。
ws,hs必须比原始图片小,否则绘图将会失败。
实例:
#include "disp.h"//使用Display单元库
pbitmap img;
int main(){
createwin(800,600);//建立窗口
img=loadbmp("display.png");//读取图片
drawbmp(img,(getwidth()-img->width*2)/2,(getheight()-img->height*2)/2,img->width*2,img->height*2);//绘制拉伸图片
freshwin();//刷新窗口
msgbox("绘制拉伸完成");//输出绘制完成信息
drawbmp(img,img->width/4,img->height/4,img->width/2,img->height/2,(getwidth()-img->width*2)/2,(getheight()-img->height*2)/2,img->width*2,img->height*2);//绘制剪切拉伸图片
freshwin();//刷新窗口
msgbox("绘制剪切完成");//输出绘制完成信息
return 0;}
第六节 绘制透明图片
以下过程可以绘制透明和半透明的图片:
void drawbmp(pbitmap b,unsigned long c);
c为透明颜色。如未指定c,则会使用b的背景颜色作为透明色。
该过程只会绘制图片中不是透明色的部分。
当c的Alpha部分不为0时(getalpha(c)<>0),绘图过程会以半透明的形式绘制到目标上(会创建临时位图并消耗资源,慎用)。
实例:
#include "disp.h"//使用Display单元库
int main(){
createwin(800,600,red);//建立窗口
drawbmp(loadbmp("display.png"),0x7fffffff);//绘制透明色半透明图片
freshwin();//刷新窗口
msgbox("绘制透明完成");//输出绘制完成信息
return 0;}