榪欎竴閮ㄥ垎璁茶堪濡備綍緇樺埗涓浜涚畝鍗曠殑鍥懼厓錛屽寘鎷洿綰褲佸~鍏呬笌絎旂敾鎿嶄綔銆佽櫄綰褲佺嚎绔紙Cap錛変笌綰跨殑浜ゅ悎絳夊浘褰㈢殑緇樺埗鏂規硶銆?br>鐩寸嚎孌?br>鐩寸嚎孌墊槸闈炲父鍩虹鐨勭煝閲忓浘褰㈠璞°傜敾涓鏉$洿綰挎錛岄渶瑕佽皟鐢ㄤ袱涓嚱鏁幫細cairo_move_to()
鍑芥暟錛岀敤浜庤緗嚎孌佃搗鐐癸紱cairo_line_to() 鐢ㄤ簬璁懼畾綰挎緇堢偣銆?br>#include #include double
coordx[100]; double coordy[100]; int count = 0; static
gboolean on_expose_event(GtkWidget *widget, GdkEventExpose
*event, gpointer data) { cairo_t *cr;
cr = gdk_cairo_create(widget->window);
cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_line_width (cr,
0.5); int i, j; for ( i = 0; i 1; i++ ) {
for ( j = 0; j -1; j++ ) {
cairo_move_to(cr, coordx, coordy);
cairo_line_to(cr, coordx[j], coordy[j]); }
} count = 0; cairo_stroke(cr);
cairo_destroy(cr); return FALSE; } gboolean
clicked(GtkWidget *widget, GdkEventButton *event, gpointer
user_data) { if (event->button == 1) {
coordx[count] = event->x; coordy[count++] =
event->y; } if (event->button == 3)
{ gtk_widget_queue_draw(widget); }
return TRUE; } int main (int argc, char
*argv[]) { GtkWidget *window;
gtk_init(&argc, &argv); window =
gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);
g_signal_connect(window, "expose-event",
G_CALLBACK(on_expose_event), NULL); g_signal_connect(window,
"destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window, "button-press-event",
G_CALLBACK(clicked), NULL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window), "lines");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
gtk_widget_set_app_paintable(window, TRUE);
gtk_widget_show_all(window); gtk_main();
return 0; } 璇ョず渚嬩細鍒涘緩涓涓敮鎸侀紶鏍囦氦浜掔粯鍒剁洿綰挎鐨?GTK+
紿楀彛銆傚湪紿楀彛涓嬌鐢ㄩ紶鏍囧乏閿殢渚跨偣鍑犱笅錛屾瘡涓嬈$偣鍑繪椂錛屽厜鏍囦綅緗殑鍧愭爣閮戒細琚鍏ラ暱搴︿負 100
鐨勬暟緇勶紱鐒跺悗鐐瑰嚮榧犳爣鍙抽敭錛屾墍鏈夌敱榧犳爣宸﹂敭鐐瑰嚮鎵寰楀埌鐨勭偣浼氳褰兼榪炴帴褰㈡垚鐩寸嚎孌碉紱鍦ㄧ獥鍙d腑鍐嶆鐐瑰嚮榧犳爣鍙抽敭鏃訛紝浼氬紿楀彛緇樺浘鍖哄煙榪涜娓呴櫎銆?br>涓嬮潰瀵硅紺轟緥紼嬪簭浠g爜榪涜鍒嗘瀽錛?br>
cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_line_width (cr,
0.5); 璁劇疆棰滆壊涓洪粦鑹詫紝綰垮涓?0.5pt 涓哄弬鏁幫紝緇樺埗鐩寸嚎孌點?br> int i, j; for ( i =
0; i 1; i++ ) { for ( j = 0; j -1; j++ ) {
cairo_move_to(cr, coordx, coordy);
cairo_line_to(cr, coordx[j], coordy[j]);
} } 鐢?cairo_move_to() 鍜?cairo_line_to() 鍑芥暟鍦?cr 涓畾涔夌粯鍥捐礬寰?(path)錛岃繛鎺?
coordx[] 鍜?coordy[] 鎵璁板綍鐨勬瘡涓偣銆?br>
cairo_stroke(cr); cairo_stroke() 鍑芥暟浼氬皢 cr 涓殑璺緞緇樺埗鍑烘潵銆?br>
g_signal_connect(window, "button-press-event",
G_CALLBACK(clicked), NULL); 璁懼畾 button-press-event 浜嬩歡鐨勫洖璋冨嚱鏁頒負 clicked ()銆?br>
if (event->button == 1) { coordx[count]
= event->x; coordy[count++] = event->y;
} 鍦?clicked () 鍑芥暟涓紝褰撻紶鏍囧乏閿偣鍑諱簨浠跺彂鐢熸椂錛岃鍏夋爣鎵鍦ㄤ綅緗殑 x 鍜?y 鍧愭爣鍒嗗埆璁板叆鏁扮粍
coordx 鍜?coordy銆?br> if (event->button == 3) {
gtk_widget_queue_draw(widget); } 鍦?clicked ()
鍑芥暟涓紝褰撻紶鏍囧彸閿崟鍑繪椂錛岃皟鐢?gtk_widget_queue_draw () 鍑芥暟閲嶇粯紿楀彛鍖哄煙銆?br> 鎻忕粯 (Stroke) 涓庡~鍏?(Fill) 鎻忕粯 (Stroke) 鍙互緇樺埗褰㈢姸鐨勮疆寤擄紝濉厖 (Fill)
鍒欑敤浜庡悜褰㈢姸鍐呴儴鐏屾敞棰滆壊銆? #include #include #include static
gboolean on_expose_event (GtkWidget * widget,
GdkEventExpose * event, gpointer data) { cairo_t *cr;
cr = gdk_cairo_create (widget->window); int width, height;
gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
cairo_set_line_width (cr, 9); cairo_set_source_rgb (cr, 0.69,
0.19, 0); cairo_arc (cr, width / 2, height / 2,
(width ) / 2 - 10, 0, 2 * M_PI);
cairo_stroke_preserve (cr); cairo_set_source_rgb (cr, 0.3, 0.4,
0.6); cairo_fill (cr); cairo_destroy (cr);
return FALSE; } int main (int argc, char *argv[]) {
GtkWidget *window; gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect
(G_OBJECT (window), "expose-event", G_CALLBACK
(on_expose_event), NULL); g_signal_connect (G_OBJECT (window),
"destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_window_set_position (GTK_WINDOW (window),
GTK_WIN_POS_CENTER); gtk_window_set_default_size (GTK_WINDOW
(window), 200, 150); gtk_widget_set_app_paintable (window,
TRUE); gtk_widget_show_all (window); gtk_main ();
return 0; } 榪欎釜紺轟緥緇樺埗涓涓唴閮ㄥ~鍏呯伆鑹茬殑鍦嗐?br>涓嬮潰瀵逛唬鐮佽繘琛岃В鏋愶細 #include
涔嬫墍浠ュ紩鍏ヨ繖涓ご鏂囦歡錛屾槸鍥犱負紼嬪簭涓嬌鐢ㄤ簡鍦嗗懆鐜囧父閲?M_PI銆?br> int width, height;
gtk_window_get_size (GTK_WINDOW (widget), &width,
&height); 鑾峰彇紿楀彛鐨勫搴︿笌楂樺害灝哄銆傜▼搴忎腑灝嗕嬌鐢ㄨ繖浜涘間綔涓虹粯鍒跺渾褰㈢殑鍙傝冨昂瀵革紝浠ュ疄鐜扮獥鍙e昂瀵稿彉鍖栨椂錛屾墍緇樺埗鐨勫渾鐨勫昂瀵鎬篃浼氱浉搴斿彉鍖栥?br>
cairo_set_source_rgb (cr, 0.69, 0.19, 0); cairo_arc (cr, width
/ 2, height / 2, (width ) / 2 - 10, 0,
2 * M_PI); cairo_stroke_preserve (cr); 鎻忕粯鍦嗙殑杞粨銆傝繖閲岃娉ㄦ剰涓涓?
cairo_stroke_preserve () 鍑芥暟涓?cairo_stroke ()
鍑芥暟鐨勫尯鍒紙鏈濂界殑鍔炴硶鏄敤鍚庤呮浛鎹竴涓嬪墠鑰咃紝鐪嬬湅紼嬪簭鎵ц鏁堟灉錛夈俢airo_stroke_preserve () 鍑芥暟浼氬皢瀹冪粯鍒剁殑璺緞渚濈劧淇濆瓨鍦?cairo
鐜涓紝鑰?cairo_stroke () 鎵緇樺埗鐨勮礬寰勶紝鍦ㄧ粯鍒跺畬鎴愬悗錛屽氨浠?cairo鐨勭幆澧冧腑娓呴櫎浜嗐?br>
cairo_set_source_rgb (cr, 0.3, 0.4, 0.6); cairo_fill (cr); 瀵逛嬌鐢?
cairo_stroke_preserve () 鍑芥暟緇樺埗鐨勮礬寰勮繘琛岃摑鑹插~鍏呫?br> 铏氱嚎 (Dash) 姣忔潯綰塊兘鍙互鐢ㄤ笉鍚岀殑铏氱嚎絎?(dash pen) 鏉ョ敾銆傝櫄綰挎ā寮忔槸閫氳繃 cairo_set_dash ()
鍑芥暟鏉ヨ瀹氥傛ā寮忕被鍨嬮氳繃涓涓暟緇勬潵瀹氫箟錛屾暟緇勪腑鐨勫煎潎涓烘鏁幫紝瀹冧滑鐢ㄤ簬璁劇疆铏氱嚎鐨勮櫄閮ㄥ垎涓庡疄閮ㄥ垎銆傛暟緇勭殑闀垮害涓庡亸縐婚噺鍙互鍦ㄧ▼搴忎腑璁懼畾銆傚鏋滄暟緇勭殑闀垮害 涓?
0錛岃櫄綰挎ā寮忓氨鏄紱佹浜嗭紝閭f墍緇樺埗鐨勭嚎鏄疄綰褲傚鏋滄暟緇勯暱搴︿負
1錛屽垯瀵瑰簲鐫铏氬疄鍧囧寑鍒嗗竷鐨勮櫄綰挎ā寮忋傚亸縐婚噺鏄敤鏉ヨ緗湪铏氱嚎鐨勫绔湪涓涓櫄綰垮懆鏈燂紙鍖呭惈涓涓疄閮ㄥ崟鍏冨拰涓涓櫄閮ㄥ崟鍏冿級鍐呯殑璧峰浣嶇疆銆?br>#include
#include static gboolean on_expose_event (GtkWidget * widget,
GdkEventExpose * event, gpointer data) { cairo_t
*cr; cr = gdk_cairo_create (widget->window);
cairo_set_source_rgba (cr, 0, 0, 0, 1); static const double
dashed1[] = { 4.0, 1.0 }; static int len1 = sizeof (dashed1) / sizeof
(dashed1[0]); static const double dashed2[] = { 4.0, 10.0, 4.0
}; static int len2 = sizeof (dashed2) / sizeof (dashed2[0]);
static const double dashed3[] = { 1.0 }; cairo_set_line_width (cr,
1.5); cairo_set_dash (cr, dashed1, len1, 0); cairo_move_to
(cr, 40, 60); cairo_line_to (cr, 360, 60); cairo_stroke
(cr); cairo_set_dash (cr, dashed2, len2, 10);
cairo_move_to (cr, 40, 120); cairo_line_to (cr, 360, 120);
cairo_stroke (cr); cairo_set_dash (cr, dashed3, 1, 0);
cairo_move_to (cr, 40, 180); cairo_line_to (cr, 360, 180);
cairo_stroke (cr); cairo_destroy (cr); return
FALSE; } int main (int argc, char *argv[]) { GtkWidget
*window; GtkWidget *darea; gtk_init (&argc,
&argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new (); gtk_container_add (GTK_CONTAINER
(window), darea); g_signal_connect (darea, "expose-event",
G_CALLBACK (on_expose_event), NULL);
g_signal_connect (window, "destroy", G_CALLBACK
(gtk_main_quit), NULL); gtk_window_set_position (GTK_WINDOW
(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
gtk_widget_show_all (window); gtk_main (); return
0; } 璇ョず渚嬫紨紺轟簡涓夌铏氱嚎妯″紡鐨勮緗強緇樺埗銆?br>涓嬮潰鍒嗘瀽涓涓嬪叧閿唬鐮併?br> static const double
dashed1[] = { 4.0, 1.0 }; 璁懼畾絎竴鏉¤櫄綰跨殑妯″紡錛屽畠鐨勫疄閮ㄦ槸 4 涓儚绱狅紝铏氶儴鏄?1 涓儚绱犮?br> static
int len1 = sizeof (dashed1) / sizeof (dashed1[0]); 璁$畻鏁扮粍 dashed1 鐨勯暱搴︺?br>
cairo_set_dash (cr, dashed1, len1, 0); 璁劇疆铏氱嚎妯″紡銆?br> darea =
gtk_drawing_area_new (); gtk_container_add (GTK_CONTAINER (window),
darea); 榪欐錛屾垜浠槸鍦?drawing_area 閮ㄤ歡涓婄粯鍥撅紝涓嶅啀鏄獥鍙e尯鍩熶簡銆?br> 綰垮附 (Line caps) 綰垮附鏄拡瀵圭洿綰挎鐨勭鐐瑰艦鐘惰岃█鐨勶紝鍒嗕負涓夌錛?br>
- CAIRO_LINE_CAP_SQUARE
- CAIRO_LINE_CAP_ROUND
- CAIRO_LINE_CAP_BUTT
瀵瑰簲褰㈢姸濡備笅鍥炬墍紺猴細
 鍚屼竴鏉$洿綰挎錛孋AIRO_LINE_CAP_SQUARE 綰垮附涓?CAIRO_LINE_CAP_BUTT
綰垮附浼氬鑷寸洿綰挎闀垮害鏈夋墍宸埆錛屽墠鑰呬細姣斿悗鑰呴暱涓涓嚎瀹藉昂瀵搞?br>#include #include static
gboolean on_expose_event (GtkWidget * widget,
GdkEventExpose * event, gpointer data) { cairo_t *cr;
cr = gdk_cairo_create (widget->window); cairo_set_source_rgba
(cr, 0, 0, 0, 1); cairo_set_line_width (cr, 10);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); cairo_move_to (cr,
40, 60); cairo_line_to (cr, 360, 60); cairo_stroke
(cr); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
cairo_move_to (cr, 40, 150); cairo_line_to (cr, 360, 150);
cairo_stroke (cr); cairo_set_line_cap (cr,
CAIRO_LINE_CAP_SQUARE); cairo_move_to (cr, 40, 240);
cairo_line_to (cr, 360, 240); cairo_stroke (cr);
cairo_set_line_width (cr, 1.5); cairo_move_to (cr, 40, 40);
cairo_line_to (cr, 40, 260); cairo_stroke (cr);
cairo_move_to (cr, 360, 40); cairo_line_to (cr, 360, 260);
cairo_stroke (cr); cairo_move_to (cr, 365, 40);
cairo_line_to (cr, 365, 260); cairo_stroke (cr);
cairo_destroy (cr); return
FALSE; } 璇ョず渚嬬粯鍒朵笁鏉″叿鏈変笉鍚岀嚎甯界殑鐩寸嚎孌碉紝鍚屾椂涔熷睍紺轟簡涓嶅悓綰垮附瀵圭嚎鐨勯暱搴︾殑褰卞搷銆?br>涓嬮潰瀵瑰叧閿唬鐮佽繘琛岀畝鍗曞垎鏋愶細
cairo_set_line_width (cr, 10); 璁劇疆綰跨殑瀹藉害涓?10px銆?br> cairo_set_line_cap
(cr, CAIRO_LINE_CAP_ROUND); cairo_move_to (cr, 40, 150);
cairo_line_to (cr, 360, 150); cairo_stroke (cr); 鐢諱簡涓鏉$嚎甯戒負
CAIRO_LINE_CAP_ROUND 鐨勭洿綰挎銆?br> cairo_move_to (cr, 40, 40);
cairo_line_to (cr, 40, 260); cairo_stroke
(cr); 榪欐槸涓夋潯绔栫嚎涔嬩竴錛岀敤浜庤〃鐜扮嚎甯藉綰跨殑闀垮害鐨勫獎鍝嶃?br> 綰跨殑浜ゅ悎 (Line joins) 綰跨殑浜ゅ悎瀛樺湪浠ヤ笅涓夌椋庢牸錛?br>
- CAIRO_LINE_JOIN_MITER
- CAIRO_LINE_JOIN_BEVEL
- CAIRO_LINE_JOIN_ROUND
瀵瑰簲褰㈢姸濡備笅鍥炬墍紺恒?br> #include #include static gboolean on_expose_event
(GtkWidget * widget, GdkEventExpose * event, gpointer
data) { cairo_t *cr; cr = gdk_cairo_create
(widget->window); cairo_set_source_rgb (cr, 0.1, 0, 0);
cairo_rectangle (cr, 30, 30, 100, 100); cairo_set_line_width (cr,
14); cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
cairo_stroke (cr); cairo_rectangle (cr, 160, 30, 100, 100);
cairo_set_line_width (cr, 14); cairo_set_line_join (cr,
CAIRO_LINE_JOIN_BEVEL); cairo_stroke (cr); cairo_rectangle
(cr, 100, 160, 100, 100); cairo_set_line_width (cr, 14);
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); cairo_stroke
(cr); cairo_destroy (cr); return
FALSE; } int main (int argc, char *argv[]) { GtkWidget
*window; GtkWidget *darea; gtk_init (&argc,
&argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new (); gtk_container_add (GTK_CONTAINER
(window), darea); g_signal_connect (darea, "expose-event",
G_CALLBACK (on_expose_event), NULL);
g_signal_connect (window, "destroy", G_CALLBACK
(gtk_main_quit), NULL); gtk_window_set_position (GTK_WINDOW
(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW (window), 300, 280);
gtk_widget_show_all (window); gtk_main (); return
0; }
璇ョず渚嬮噰鐢ㄤ笉鍚岀殑浜ゅ悎綾誨瀷緇樺埗浜嗕笁涓煩褰€?br>涓嬮潰瀵瑰叧閿唬鐮佽繘琛岀畝鍗曞垎鏋愶細 cairo_rectangle
(cr, 30, 30, 100, 100); cairo_set_line_width (cr, 14);
cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); cairo_stroke
(cr); 緇樺埗浜嗕竴涓嚎瀹戒負 14px錛屼氦鍚堢被鍨嬩負 CAIRO_LINE_JOIN_MITER 鐨勭煩褰€?br>
鏈枃鏉ヨ嚜ChinaUnix鍗氬錛屽鏋滄煡鐪嬪師鏂囪鐐癸細 |