`
chinamming
  • 浏览: 151409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

第五章FLTK的画图函数

 
阅读更多

第五章FLTK的画图函数

这章涵盖了FLTK提供的所有画图函数

什么时候可以画图

只有在几个地方可以执行画图代码。在其他地方调用该函数会出现未定义该行为的错误

1最常出现的地方是在虚拟函数Fl_Widget::draw()中。你的类需要继承一个Fl_Widget类,然后在自己的类中写draw()函数。

2在写boxtypelabeltype函数中用到。

3你可以调用Fl_Window::make_current()来增加控件的更新。用Fl_Widget::window()找到要更新的窗口

FLTK的画图函数

调用这些画图函数之前,要包含头文件<FL/fl_draw.H>.FLTK提供以下画图函数。

Boxes

Clipping

Colors

Line dashes and thickness

Fase Shapes

Complex Shapes

Text

Images

Overlay

Boxes

FLTK提供了三个函数来画box,主要用于画按钮和其他的UI控件。每一个函数都提供了box的左上角,宽, 高等参数。

void fl_draw_box(Fl_Boxtype b, int x, int y, int w, int h, Fl_Color c);

该函数画了一个标准的box,box类行为b,颜色是c

void fl_frame(const char *s, int x, int y, int w, int h);

该函数画了一个边框,s4个字母,A代表黑色,X代表白色,顺序是上,左,下,右。

void fl_frame2(const char *s, int x, int y, int w, int h);

fl_frame不同时s代表的颜色的顺序,分别是下,右,上,左。

剪切

你可以限制你的画图行为在一个矩形之内,应用 fl_push_clip(x,y,w,h),释放用fl_pop_clip.

该矩形用象素未单位,不会受变换矩阵的影响

另外,系统会提供更新窗口的剪切域,但是比一个简单的矩形要复杂的多

void fl_clip(int x, int y, int w, int h)
void fl_push_clip(int x, int y, int w, int h)

用一个矩形剪切一个区域,并把这个区域压入堆栈。Fl_clip()不提倡,并将在以后的版本中去除该函数

void fl_push_no_clip()

压入一个空的剪切域到堆栈

void fl_pop_clip()

恢复剪切域,画图范围不再受矩形限制,fl_push_clip()一定要调用该函数。

int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H)

新的剪切域与旧的剪切域相交,相交的矩形位置保存在X,Y,W,H,如果完全没有相交,则W,H0

颜色

FLTK将颜色处理为 32位的整形。0-255分别代表不同的颜色。Fl_color枚举类型定义了前256个基本的颜色。

颜色值大于255的被认为是24位的RGB值。显示的是最接近该值的颜色。

void fl_color(Fl_Color) 设置当前使用的颜色

Fl_Color fl_color() 返回最后设定的颜色

void fl_color(uchar r, uchar g, uchar b) 设置rgb颜色。

设置线条的属性

FLTK支持设定线条的宽度和类型。

void fl_line_style(int style, int width=0, char* dashes=0)

style是以下几种类型之一,默认的是FL_SOLID

FL_SOLID -------

FL_DASH - - - -

FL_DOT .......

FL_DASHDOT - . - .

FL_DASHDOTDOT - .. -

FL_CAP_FLAT

FL_CAP_ROUND

FL_CAP_SQUARE (extends past end point 1/2 line width)

FL_JOIN_MITER (pointed)

FL_JOIN_ROUND

FL_JOIN_BEVEL (flat)

宽度是以象素值为单位,默认的0

画一般的图形函数

下面的函数几乎可以用来画所有的控件,这些函数画图非常精确,也非常快。他们可以在任何支持FLTK的平台上使用。

Void fl_point(int x,int y) 画点函数

Void fl_rectf(int x,int y,int w,int h)画一个矩形并填充内部

Void fl_rectf(int x,int y,int w,int h,uchar r,uchar g,uchar b)自定义颜色填充矩形

Void fl_line(int x, int y, int x1,int y1)画一条直线,起点为x,y,终点为x1,y1

Void fl_line(int x int y,int x1,int y1,int x2,int y2) 画两条直线

void fl_loop(int x, int y, int x1, int y1, int x2, int y2)
void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)

Outline a 3 or 4-sided polygon with lines.

画封闭的线,一次连接个顶点

void fl_polygon(int x, int y, int x1, int y1, int x2, int y2)
void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)

Fill a 3 or 4-sided polygon. The polygon must be convex.

画三边形或四边形,并填充内部

void fl_xyline(int x, int y, int x1)
void fl_xyline(int x, int y, int x1, int y2)
void fl_xyline(int x, int y, int x1, int y2, int x3)

先画一条水平的线,再画一条垂直的线条,最后画一条水平线

void fl_yxline(int x, int y, int y1)
void fl_yxline(int x, int y, int y1, int x2)
void fl_yxline(int x, int y, int y1, int x2, int y3)

首先画垂直线条,接着是水平线,最后是垂直线

void fl_arc(int x, int y, int w, int h, double a1, double a2)
void fl_pie(int x, int y, int w, int h, double a1, double a2)

画弧形线,两个角度是以三点处为0度,逆时针旋转,a2必须大于或等于a1

fl_pie()填充弧形内部

复杂图形函数

复杂的画图函数利用2-D线性转换能让你画出任意图形。这个功能与Adobe® PostScript语言实现的功能很相似,在XWin32上,在画线段之前所有的转换顶点都是用整数表示,这就限制了画图的精确性。如果要画比较精确的图形,最好用OpenGL来画。

void fl_push_matrix()
void fl_pop_matrix()

保存和恢复当前的转换,堆栈的最大深度为4

void fl_scale(float x, float y)
void fl_scale(float x)
void fl_translate(float x, float y)
void fl_rotate(float d)
void fl_mult_matrix(float a, float b, float c, float d, float x, float y)

在当前的转换基础上连接另外一个转换。旋转角度是度数不是弧度,逆时针旋转。

void fl_begin_line()
void fl_end_line()

开始和结束画线

void fl_begin_loop()
void fl_end_loop()

开始和结束画一系列封闭的线

void fl_begin_polygon()
void fl_end_polygon()

开始和结束画多边形并填充

void fl_begin_complex_polygon()
void fl_gap()
void fl_end_complex_polygon()

开始和结束画一个复杂的多边形并填充。这个多边形可以是凹凸不同的,不连贯的,甚至中间有空心的。调用fl_gap()分开路径。不必也是有害的如果在第一个顶点之前或最后一个顶点之后调用fl_gap()函数,在一行中多次调用也是不行的。

Fl_gap()只能用在fl_begin_complex_polygon()fl_end_complex_polygon()之间。画多边形的轮廓,使用fl_begin_loop并用fl_end_loopfl_begin_loop代替fl_gap();

void fl_vertex(float x, float y)

在当前路径中增加一个顶点

void fl_curve(float x, float y, float x1, float y1, float x2, float y2, float x3, float y3)

在路径中增加一系列的点画Bezier 曲线。该曲线的末端是x,yx3,y3

void fl_arc(float x, float y, float r, float start, float end)

增加一系列的点在当前圆环的弧线上。在调用fl_arc()之前应用scalerotate 可以得到椭圆的路径。X,y是圆的中心,r是半径。Fl_arc()start角度画弧直到end,按逆时针旋转。如果end大于start则它是按照顺时针转

void fl_circle(float x, float y, float r)

fl_circle等于fl_arc(…,0,360),但是更快,如果你在画多边形的时候用到,则必须用fl_arc().

文本的画法

所有的文本都字体都是适用当前字体。现在还不明确在转换情况下,位置或字符是否会改变

void fl_draw(const char *, int x, int y)
void fl_draw(const char *, int n, int x, int y)

在窗口中画出字符串,位置是靠左,接近底线

void fl_draw(const char *, int x, int y, int w, int h, Fl_Align align, Fl_Image *img = 0, int draw_symbols = 1)

void fl_measure(const char *, int &w, int &h, int draw_symbols = 1)

int fl_height()

得到当前字体的高度

int fl_descent()

float fl_width(const char*)

float fl_width(const char*,int n)

float fl_width(uchar)

const char *fl_shortcut_label(ulong)

返回按钮或菜单的快捷键字符串

字体

FLTK支持很多标准的字体,比如Times, Helvetica/Arial, Courier, and Symbol typefaces,用户也可以自定义字体,每一个字体都有自己的索引列表

初始化只安装了16种字体,他们的名字是FL_HELVETICA, FL_TIMES, FL_COURIER,另外有二个修饰体FL_BOLD,FL_ITATIC。加上FL_SYMBOL,FL_ZAPF_DINGBATS

不能超过255种字体,因为Fl_Widget是以一个字节来存储的。

Void fl_font(int face , int size)设置字体和大小

int fl_font()
int fl_size()

得到字体和大小

覆盖画图函数

void fl_overlay_rect(int x, int y, int w, int h);
void fl_overlay_clear();

前者与先前颜色异或操作,后者清楚异或操作

使用该函数非常的巧妙,你应该在控件中有handle()和draw()函数,draw()应该调用fl_overlay_clear()在做任何事情之前。Handle()函数应该调用window()->make_current()然后在FL_DRAG事件中调用fl_overlay_rect(),在FL_RELEASE事件中调用fl_overlay_clear().

绘制图片

分享到:
评论

相关推荐

    fltk-1.1.7-source.zip_FLTK_fltk windo_fltk-1.1.7_轻量级ui

    在使用FLTK时,开发者通常会先包含所需的头文件,然后通过实例化窗口对象、添加控件、设置事件处理函数等步骤来构建UI。FLTK的事件驱动模型使得程序能够响应用户的交互,如点击按钮、移动滑块等。 为了帮助开发者更...

    FLTK.rar_FLTK_fltk怎么用

    5. **使用FLTK库**:在你的C++项目中,你需要包含FLTK头文件,并链接FLTK库。FLTK提供了一些基本的窗口类(如Fl_Window)、控件类(如Fl_Button)和事件处理函数。通过继承和重载这些类,你可以自定义UI组件和实现...

    FLTK使用小例子(FLTK—1.1.7)

    当用户按下或释放按钮时,FLTK会触发相应的事件,我们可以为这些事件编写回调函数来响应。 首先,你需要包含FLTK库的头文件,并且初始化FLTK系统。例如: ```cpp #include #include #include int main() { Fl...

    fltk中文手册

    **3.2 FLTK的画图函数** - **fl_draw**: 绘制文本。 - **fl_rectf**: 绘制矩形。 - **fl_point**: 绘制点。 - **fl_line**: 绘制线段。 **3.3 剪切** - **fl_push_clip**: 开始剪切。 - **fl_pop_clip**: 结束剪切...

    FLTK的指导书

    - 按照教材中的说明,创建并运行第12章的示例程序。 - 这些示例通常涵盖了FLTK的基本用法,如创建窗口、添加控件等。 #### 总结 本文详细介绍了如何下载、编译FLTK类库,并在Eclipse和VS2010两种环境中配置并创建...

    基于FLTK的小钟

    5. **丰富的控件集**:FLTK提供了多种基本的GUI元素,如按钮、文本输入框、滚动条、菜单等,可以满足大多数GUI应用的需求。 6. **简单易用**:FLTK的API设计简洁,学习曲线平缓,开发者可以快速上手。 **FLTK的使用...

    FLTK电子教程.PDF

    5. FLTK的安装(Building and Installing FLTK):该教程会介绍如何在UNIX、Apple OS X和Microsoft Windows上安装FLTK。这对于跨平台开发尤其重要,因为不同的操作系统可能有不同的安装和配置方法。特别提到了使用...

    FLTK 1.3.2 - FLTK Programming Manual

    该手册由多个章节组成,每个章节都旨在为用户提供使用FLTK的教程,而附录部分则提供了所有FLTK小部件、函数以及操作系统接口的便利参考。 #### 二、FLTK简介 FLTK是一种轻量级、高性能的跨平台GUI库,旨在提供简单...

    c++ GUI fltk库

    而绘图部分讲解了FLTK中的绘图函数、图像绘制和OpenGL的使用,以及如何通过OpenGL提高绘图性能。 ### 设计简单文本编辑器 手册中还特别用一章节的篇幅,通过设计一个简单的文本编辑器来演示FLTK的综合使用。这个...

    fltk 学习资料大全

    4. **易用性**:FLTK的API简洁明了,类和函数命名直观,使得学习曲线较为平缓,开发者能够快速上手。 5. **自绘图形**:FLTK提供了强大的自绘能力,可以绘制复杂的2D图形,支持抗锯齿和透明效果。 6. **多语言支持...

    fltk-1.3.9 使用VS2022编译好的库

    5. **快速**: 由于其高效的设计,FLTK能够快速响应用户的交互,提供流畅的体验。 6. **易用**: API设计直观,易于学习,使得开发者可以快速上手开发GUI应用。 7. **多语言支持**: 内置Unicode支持,可处理多种语言的...

    FLTK 2.0 r6786 界面库

    "include"目录通常包含了FLTK库的所有头文件,这些头文件包含了FLTK的类定义、函数声明和其他接口信息。开发者在编写FLTK应用程序时,需要引用这些头文件来使用FLTK的功能。例如,`#include &lt;FL/Fl.h&gt;`会引入FLTK的...

    fltk-1.3.5.zip

    FLTK(Fast Light ToolKit)是一个轻量级的C++图形用户界面(GUI)库,设计用于快速开发和跨平台兼容。标题中的"fltk-1.3.5.zip"表明这是一个包含FLTK 1.3.5版本源码的压缩文件。FLTK库主要由Bill Spitzak创建,它以...

    fltk 3.0 可视化编程库

    FLTK的事件处理机制是通过重载`handle()`函数实现的,开发者可以在这里定义各种事件的响应行为。 例如,以下是一个简单的FLTK程序,创建一个窗口并添加一个按钮: ```cpp #include #include #include int main...

    C++ 基于FLTK的五子棋

    6. **事件驱动编程**:FLTK库基于事件驱动模型,程序运行时会监听用户的输入事件(如鼠标点击),并调用相应的回调函数处理这些事件。在这个五子棋项目中,需要编写事件处理函数,响应用户的落子请求。 7. **图形...

    fltk-draw-demo

    此外,FLTK还提供了一些辅助函数,如`Fl::check()`用于处理事件循环,确保用户的交互得到及时响应。`Fl::run()`启动主事件循环,直到所有窗口关闭。 总结起来,"fltk-draw-demo"是一个利用FLTK和OpenGL进行图形绘制...

    仪表显示要用的FLTK编程指南(英文版)

    - **编写第一个FLTK程序**:介绍如何创建一个简单的FLTK应用程序。 - **编译标准编译器**:使用常见的编译器如GCC等编译FLTK程序。 - **使用Makefiles**:提供如何使用Makefile来管理项目的编译过程。 - **使用...

    多本fltk学习资料

    第一本书可能是关于FLTK的基础教程,适合初学者。书中可能涵盖了FLTK的基本概念,如窗口管理、控件创建、事件处理以及如何构建基本的用户界面。这部分内容会详细讲解FLTK的API(应用程序编程接口),让读者了解如何...

Global site tag (gtag.js) - Google Analytics