DEV-C++ ege.h库 绘图教程(八)

一、前言

继绘图函数,文字哈数,颜色表示函数,图像函数,音乐函数和时间函数等等这些函数以后,我们今天就来讲一个相当重要的函数,那就是绘图环境函数。

DEV-C++ ege.h库 绘图教程合集

二、绘图环境设置函数

其实这个在我之前写的DEV-C++ ege.h库进阶里面有讲过一部分。不过当时讲的并不系统,这次我们来全面的讲一讲。

1.initgraph

这个创建窗口大家肯定都知道,什么INIT_ANIMATION上次也讲过,所以就当复习吧。

功能:

初始化绘图环境。

声明:
void initgraph(
    int width,
    int height
);

void initgraph(
    int width,
    int height,
    int initmode
);

void initgraph(
    int* gdriver,
    int* gmode,
    char* path
); // 兼容 Borland C++ 3.1 的重载,不建议使用。

参数:
width
创建的窗口中,绘图区域的宽度。如果为 -1,则窗口使用屏幕的宽度。

height
创建的窗口中,绘图区域的高度。如果为 -1,则窗口使用屏幕的高度。

initmode
初始化模式,每个二进制位控制是否启用某种模式(值为 0 表示仅使用普通窗口,不启用额外的模式)
可以由以下模式进行组合:
初始化模式说明
INIT_DEFAULT0x0普通窗口
INIT_NOBORDER0x1无边框窗口
INIT_CHILD0x2子窗口,需配合 attachHWND() 函数
INIT_TOPMOST0x4顶层窗口(不会被其它窗口遮挡)
INIT_RENDERMANUAL0x8手动渲染模式
INIT_NOFORCEEXIT0x10退出时不强制结束程序,而是设置标志位,可由 is_run() 判断
当设置了 INIT_NOFORCEEXIT 模式后,用户进行关闭窗口操作时窗口不会关闭,程序也不会退出,此时 is_run() 返回 false。
同时 getch(), getmouse() 之类的阻塞性函数将不再阻塞,由于窗口没有主动关闭,所以后续需要在代码中自行做窗口关闭和程序退出的相关处理。
INIT_UNICODE (ege20.08 起)0x20窗口使用 Unicode 字符集
INIT_HIDE (ege dev)0x40窗口使用 Unicode 字符集
INIT_WITHLOGO0x100带 EGE logo 出场动画
设定的组合模式:
组合模式说明
INIT_ANIMATIONINIT_RENDERMANUAL 与 INIT_NOFORCEEXIT 模式的组合,用于动画
说明: 只有两个参数的函数 initgraph(width, height) 并未指定初始化模式,如果在此之前已经由 setinitmode() 指定 ,那么使用其指定的初始化模式。如果尚未指定,那么 initgraph(width, height) 将在不同的编译模式下使用不同的初始化模式:
编译模式初始化模式
DebugINIT_DEFAULT
ReleaseINIT_WITHLOGO

2.closegraph

关闭窗口,也不用说了。

3.cleardevice

清屏。

4.is_run

这里要说明一下。

只有在初始化时设置了INIT_NOFORCEEXIT模式时他才有用,不然的话别用它,用它也没用,他会给你一直返回true.

当你设置了INIT_FORCEEXIT时,相当于你不能手动关闭窗口。什么意思呢,就是你窗口右上角的那个“×”失效了,要想关闭窗口,只能是程序里的return 0货或者closegraph.

但当你按下“×”的时候,is_run函数就会给你返回false了。相当于这玩意是判断用户有没有手动退出程序的。

(但可以在任务管理器里强制关掉)

我们来看一下官方解释。

功能:

  判断窗口环境是否还在运行。

说明:
    只有在初始化模式中设置了 INIT_NOFORCEEXIT 模式时 is_run() 返回值才有效,否则返回值一直为 true。
    当设置了 INIT_NOFORCEEXIT 模式后,用户进行关闭窗口操作时窗口不会关闭,程序也不会退
出,仅仅是设置标志位,此时 is_run() 返回 false。
    同时 getch(), getmouse() 之类的阻塞性函数将不再阻塞,由于窗口没有主动关闭,所以后
续需要在代码中自行做窗口关闭和程序退出的相关处理。

5.setcaption

设置窗口标题,也没什么好说的吧。

setcaption("TEST_0");        //将窗口标题设置为"TEST_0"

 6.seticon

设置窗口图标


功能:

设置窗口图标。

声明:
void seticon(int icon_id);

参数: icon_id 图标资源文件的id

 不过关于这个我也没有看懂,感兴趣的同学可以去网上搜一搜。

7.setinitmode

功能:

设置图形环境的初始化模式以及窗口位置。

声明:
void setinitmode(int mode, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT);
参数: mode 初始化模式,每个二进制位控制是否启用某种模式(值为 0 表示仅使用普通窗口,不启用额外的模式) 可以由以下模式进行组合:
初始化模式说明
INIT_DEFAULT0x0普通窗口
INIT_NOBORDER0x1无边框窗口
INIT_CHILD0x2子窗口,需配合 attachHWND() 函数
INIT_TOPMOST0x4顶层窗口(不会被其它窗口遮挡)
INIT_RENDERMANUAL0x8手动渲染模式
INIT_NOFORCEEXIT0x10退出时不强制结束程序,而是设置标志位,可由 is_run() 判断
当设置了 INIT_NOFORCEEXIT 模式后,用户进行关闭窗口操作时窗口不会关闭,程序也不会退出,此时 is_run() 返回 false。
同时 getch(), getmouse() 之类的阻塞性函数将不再阻塞,由于窗口没有主动关闭,所以后续需要在代码中自行做窗口关闭和程序退出的相关处理。
INIT_UNICODE (ege20.08 起)0x20窗口使用 Unicode 字符集
INIT_HIDE (ege dev)0x40窗口使用 Unicode 字符集
INIT_WITHLOGO0x100带 EGE logo 出场动画
设定的组合模式:
组合模式说明
INIT_ANIMATIONINIT_RENDERMANUAL 与 INIT_NOFORCEEXIT 模式的组合,用于动画

x, y 初始化后,窗口左上角在屏幕上的坐标,默认为系统分配。

这个也不用多说了,跟initgraph一样的。

8.setrendermode


功能:

设置渲染模式,指定更新窗口的方式:自动和手动。

声明:
void setrendermode(rendermode_e mode);
参数: mode 渲染模式,有以下两个值:
模式说明
RENDER_AUTO (默认)自动渲染模式,用于简单绘图,自动更新窗口
RENDER_MANUAL (推荐)手动渲染模式,用于复杂绘图、制作动画和游戏等,需要调用 delay_fps()/delay_ms() 等带有等待特性的函数时才会更新窗口,可减少闪烁

关于这个你需要记住的就是 setrendermode(RENDER_MANUAL) 会让你的动画更流畅就是了。

9.gettarget

获取当前绘图目标,返回0就是你现在在窗口上画画。

功能:

获取当前绘图目标。

声明:
PIMAGE gettarget();

参数:
(无)

返回值:

当前作为绘图目标的图像。如果是窗口则返回 NULL。

 10.settarget

设置绘图对象。

int     settarget(PIMAGE pbuf); // 用 NULL 设置窗口为绘图目标

PIMAGE是什么我们之前已经讲过了。

11.setviewport

功能:

设置窗口(图像)的视口区域,并将视口区域左上角的位置设置为坐标系原点。

声明:
void setviewport( int left, int top, int right, int bottom, int clip = 1, PIMAGE pimg = NULL ); 
参数:
参数类型说明
leftint视口区域左边界的 x 坐标
topint视口区域上边界的 y 坐标
rightint视口区域右边界的 x 坐标
bottomint视口区域下边界的 y 坐标
clipint视口区域的裁剪标志。如果为 true,则超出视口区域的绘图将会被裁剪掉。
pimgPIMAGE设置视口区域的目标图像( NULL 为窗口)

设置视口区域后,区域左上角坐标 (left, top) 将成为新的原点,右下角坐标为 (right-1, bottom-1)。

 

#include <graphics.h>
int main()
{
    initgraph(640, 480);
    setviewport(100, 100, 200, 200);			//设置绘图窗口范围为(100,100)到(200,200)
    rectangle(0, 0, 200, 200);					//超出上面这个范围的会被裁减掉。
    getch();
    closegraph();
    return 0;
}

12.getviewport 

功能:

获取当前视口区域的信息。

声明:
void getviewport( int *pleft, int *ptop, int *pright, int *pbottom, int *pclip = NULL, PIMAGE pimg = NULL ); 
参数:
参数类型说明
pleftint*返回视口区域左边界的 x 坐标
ptopint*返回视口区域上边界的 y 坐标
prightint*返回视口区域右边界的 x 坐标
pbottomint*返回视口区域下边界的 y 坐标
pclipint*返回视口区域的裁剪标志。返回的值如果为 true,则超出视口区域的绘图将会被裁剪掉。false 则超出部分不做裁剪。
pimgPIMAGE所获取视口区域信息的目标图像( NULL 为窗口)

13.clearviewport

相当于这个viewport的cleardevice.

功能:

清除视口区域内容(用背景色填充),相当于对视口区域进行 cleardevice() 操作。

声明:
void clearviewport( PIMAGE pimg = NULL ); 

参数: pimg 指定被清除视口区域内容的目标图像,默认值为 NULL(窗口)
 

14. setactivepage

功能:

设置当前绘图页。

声明:
void setactivepage(int page);

参数: page 绘图页索引,一共 4 个绘图页,取值范围:[0, 3]。初始化环境后,当前绘图页默认为绘图页 0。

15. setvisualpage


功能:

设置要显示到窗口的绘图页。

声明:
void setvisualpage(int page);

参数: page 绘图页索引,一共 4 个绘图页,取值范围:[0, 3]。初始化环境后,默认显示绘图页 0。

这两个函数就像是四块黑板,setactivepage就相当于要翻到那块黑板写,setvisualpage就是要把那块黑板翻出来给同学们看。(尽管比喻并不形象)

 16.windows_getviewport

功能:

获取当前窗口可见区域。

声明:
void window_getviewport( int *pleft, int *ptop, int *pright, int *pbottom, ); 

参数: pleft 返回当前视图的左部 x 坐标。 ptop 返回当前视图的上部 y 坐标。 pright 返回当前视图的右部 x 坐标。 pbottom 返回当前视图的下部 y 坐标。

17.windows_setviewport


功能:

设置当前窗口可见区域。

声明:
void window_setviewport( int left, int top, int right, int bottom ); 

参数: left 可见区域的左部 x 坐标。 top 可见区域的上部 y 坐标。(left, top) 将成为新的原点。 right 可见区域的右部 x 坐标。 bottom 可见区域的下部 y 坐标。(right-1, bottom-1) 是视图的右下角坐标。 

#include <graphics.h>
int main()
{
    initgraph(640, 480);
    window_setviewport(100, 100, 400, 400);
    rectangle(0, 0, 200, 200);
    getch();
    closegraph();
    return 0;
}

 这两个函数就是设置绘图范围,比如上面这段代码, 超过上面这个范围的地方就不渲染。

18.movewindow

功能:

将窗口移动到屏幕指定位置 (x, y),移动后窗口左上角在屏幕上的坐标为 (x, y)

声明:
void movewindow( int x, int y, bool redraw = true ); 

参数: x 目标位置在屏幕上的 x 坐标 y 目标位置在屏幕上的 坐标 redraw 是否要重绘窗口,默认为 true 

这个函数就非常简单了吧,我们可以利用这个写一个恶搞程序。

#include <graphics.h>
int main(){
    initgraph(640, 480);
    randomize();
    for(;;delay_fps(60)){
		movewindow(random(1000),random(1000));
	}
    getch();
    closegraph();
    return 0;
}

 (别自己按到F11就好)

19.resizewindow


功能:

改变窗口大小,将窗口的绘图区域宽度调整为 width,高度调整为 height

声明:
void resizewindow( int width, int height ); 

参数: width 窗口绘图区域宽度 height 窗口绘图区域高度

 

#include <graphics.h>
int main(){
    initgraph(640, 480);
    randomize();
    for(;;delay_fps(60)){
		resizewindow(random(1000),random(1000));
	}
    getch();
    closegraph();
    return 0;
}

(学以致用)

三、附录

窗口设置函数:

// 绘图环境相关函数
void EGEAPI setinitmode(int mode, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT); //设置初始化模式,mode=0为普通,1为无边框窗口,xy是初始窗口坐标
int  EGEAPI getinitmode();
void EGEAPI initgraph(int Width, int Height, int Flag);        // 初始化图形环境
// Debug 配置下默认不显示 LOGO,Release 模式下默认显示。
#if !defined(NDEBUG) || defined(DEBUG) || defined(_DEBUG)
inline void EGEAPI initgraph(int Width, int Height) {
	initgraph(Width, Height, getinitmode());
}
#else
inline void EGEAPI initgraph(int Width, int Height) {
	initgraph(Width, Height, getinitmode()|INIT_WITHLOGO);
}
#endif
void EGEAPI initgraph(int* gdriver, int* gmode, const char* path);  // 兼容 Borland C++ 3.1 的重载,只使用 640x480x24bit
void EGEAPI closegraph();                                           // 关闭图形环境
bool EGEAPI is_run();                                               // 判断UI是否退出
void EGEAPI setcaption(LPCSTR  caption);
void EGEAPI setcaption(LPCWSTR caption);
void EGEAPI seticon(int icon_id);
int  EGEAPI attachHWND(HWND hWnd);

void EGEAPI movewindow(int x, int y, bool redraw = true);	//移动窗口
void EGEAPI resizewindow(int width, int height);			//重设窗口尺寸

void EGEAPI setrendermode(rendermode_e mode);

// 绘图环境设置
PIMAGE  gettarget();
int     settarget(PIMAGE pbuf); // 用 NULL 设置窗口为绘图目标

void EGEAPI cleardevice(PIMAGE pimg = NULL);                   // 清屏

void EGEAPI getviewport(int *pleft, int *ptop, int *pright, int *pbottom, int *pclip = 0, PCIMAGE pimg = NULL); // 获取视图信息
void EGEAPI setviewport(int left, int top, int right, int bottom, int clip = 1, PIMAGE pimg = NULL);           // 设置视图
void EGEAPI clearviewport(PIMAGE pimg = NULL);                                                                 // 清空视图

EGE_DEPRECATE(setactivepage)
void EGEAPI setactivepage(int page); // 设置当前绘图页,即绘图函数默认的输出缓冲,范围0-1,默认为0
EGE_DEPRECATE(setvisualpage)
void EGEAPI setvisualpage(int page); // 设置当前显示页,用于设置显示到窗口上的页,范围0-1,默认为0
EGE_DEPRECATE(swappage)
void EGEAPI swappage();
void EGEAPI window_getviewport(struct viewporttype * viewport);
void EGEAPI window_getviewport(int* left, int* top, int* right, int* bottom);
void EGEAPI window_setviewport(int  left, int  top, int  right, int  bottom);

四、THE END

那么今天我们讲了绘图环境函数,整体是比较简单的。

下次,我们将会讲解杂项函数,敬请期待!

DEV-C++ ege.h库 绘图教程合集

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值