第五章FLTK的畫圖函數
這章涵蓋了FLTK提供的所有畫圖函數
什麼時候可以畫圖
隻有在幾個地方可以執行畫圖代碼。在其他地方調用該函數會出現未定義該行為的錯誤
1最常出現的地方是在虛拟函數Fl_Widget::draw()中。你的類需要繼承一個Fl_Widget類,然後在自己的類中寫draw()函數。
2在寫boxtype和labeltype函數中用到。
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);
該函數畫了一個邊框,s是4個字母,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,H為0;
顔色
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 語言實作的功能很相似,在X和Win32上,在畫線段之前所有的轉換頂點都是用整數表示,這就限制了畫圖的精确性。如果要畫比較精确的圖形,最好用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_loop和fl_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,y和x3,y3。
void fl_arc(float x, float y, float r, float start, float end)
增加一系列的點在目前圓環的弧線上。在調用fl_arc()之前應用scale和rotate 可以得到橢圓的路徑。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();