⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x2859.html

📁 gtk 开发手册和参考文档。 包括gtk glib gdk等
💻 HTML
📖 第 1 页 / 共 2 页
字号:
  points[0].x = xc + s*dial-&#62;pointer_width/2;  points[0].y = yc + c*dial-&#62;pointer_width/2;  points[1].x = xc + c*dial-&#62;radius;  points[1].y = yc - s*dial-&#62;radius;  points[2].x = xc - s*dial-&#62;pointer_width/2;  points[2].y = yc - c*dial-&#62;pointer_width/2;  points[3].x = xc - c*dial-&#62;radius/10;  points[3].y = yc + s*dial-&#62;radius/10;  points[4].x = points[0].x;  points[4].y = points[0].y;  blankstyle = gtk_style_new ();  blankstyle-&#62;bg_gc[GTK_STATE_NORMAL] =                widget-&#62;style-&#62;bg_gc[GTK_STATE_NORMAL];  blankstyle-&#62;dark_gc[GTK_STATE_NORMAL] =                widget-&#62;style-&#62;bg_gc[GTK_STATE_NORMAL];  blankstyle-&#62;light_gc[GTK_STATE_NORMAL] =                widget-&#62;style-&#62;bg_gc[GTK_STATE_NORMAL];  blankstyle-&#62;black_gc =                widget-&#62;style-&#62;bg_gc[GTK_STATE_NORMAL];  gtk_paint_polygon (blankstyle,                    widget-&#62;window,                    GTK_STATE_NORMAL,                    GTK_SHADOW_OUT,	            NULL,                    widget,                    NULL,                    points, 5,                    FALSE);  g_object_unref (blankstyle);  /* 绘制刻度 */  if ((upper - lower) == 0)    return FALSE;  increment = (100*M_PI) / (dial-&#62;radius*dial-&#62;radius);  inc = (upper - lower);  while (inc &#60; 100) inc *= 10;  while (inc &#62;= 1000) inc /= 10;  last = -1;  for (i = 0; i &#60;= inc; i++)    {      theta = ((gfloat)i*M_PI / (18*inc/24.) - M_PI/6.);      if ((theta - last) &#60; (increment))	continue;           last = theta;      s = sin (theta);      c = cos (theta);      tick_length = (i%(inc/10) == 0) ? dial-&#62;pointer_width : dial-&#62;pointer_width / 2;      gdk_draw_line (widget-&#62;window,                     widget-&#62;style-&#62;fg_gc[widget-&#62;state],                     xc + c*(dial-&#62;radius - tick_length),                     yc - s*(dial-&#62;radius - tick_length),                     xc + c*dial-&#62;radius,                     yc - s*dial-&#62;radius);    }  /* 绘制指针 */  s = sin (dial-&#62;angle);  c = cos (dial-&#62;angle);  dial-&#62;last_angle = dial-&#62;angle;  points[0].x = xc + s*dial-&#62;pointer_width/2;  points[0].y = yc + c*dial-&#62;pointer_width/2;  points[1].x = xc + c*dial-&#62;radius;  points[1].y = yc - s*dial-&#62;radius;  points[2].x = xc - s*dial-&#62;pointer_width/2;  points[2].y = yc - c*dial-&#62;pointer_width/2;  points[3].x = xc - c*dial-&#62;radius/10;  points[3].y = yc + s*dial-&#62;radius/10;  points[4].x = points[0].x;  points[4].y = points[0].y;  gtk_paint_polygon (widget-&#62;style,		    widget-&#62;window,		    GTK_STATE_NORMAL,		    GTK_SHADOW_OUT,	            NULL,                    widget,                    NULL,		    points, 5,		    TRUE);  return FALSE;}static gintgtk_dial_button_press (GtkWidget      *widget,		       GdkEventButton *event){  GtkDial *dial;  gint dx, dy;  double s, c;  double d_parallel;  double d_perpendicular;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  /* 判断按钮是否是在表盘指针里按下 - 我们通过计算鼠标按下     点到表盘指针中线的水平和垂直距离来判断。 */    dx = event-&#62;x - widget-&#62;allocation.width / 2;  dy = widget-&#62;allocation.height / 2 - event-&#62;y;    s = sin (dial-&#62;angle);  c = cos (dial-&#62;angle);    d_parallel = s*dy + c*dx;  d_perpendicular = fabs (s*dx - c*dy);    if (!dial-&#62;button &#38;&#38;      (d_perpendicular &#60; dial-&#62;pointer_width/2) &#38;&#38;      (d_parallel &#62; - dial-&#62;pointer_width))    {      gtk_grab_add (widget);      dial-&#62;button = event-&#62;button;      gtk_dial_update_mouse (dial, event-&#62;x, event-&#62;y);    }  return FALSE;}static gintgtk_dial_button_release (GtkWidget      *widget,			  GdkEventButton *event){  GtkDial *dial;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  if (dial-&#62;button == event-&#62;button)    {      gtk_grab_remove (widget);      dial-&#62;button = 0;      if (dial-&#62;policy == GTK_UPDATE_DELAYED)	gtk_timeout_remove (dial-&#62;timer);            if ((dial-&#62;policy != GTK_UPDATE_CONTINUOUS) &#38;&#38;	  (dial-&#62;old_value != dial-&#62;adjustment-&#62;value))	g_signal_emit_by_name (GTK_OBJECT (dial-&#62;adjustment), "value_changed");    }  return FALSE;}static gintgtk_dial_motion_notify (GtkWidget      *widget,			 GdkEventMotion *event){  GtkDial *dial;  GdkModifierType mods;  gint x, y, mask;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  if (dial-&#62;button != 0)    {      x = event-&#62;x;      y = event-&#62;y;      if (event-&#62;is_hint || (event-&#62;window != widget-&#62;window))	gdk_window_get_pointer (widget-&#62;window, &#38;x, &#38;y, &#38;mods);      switch (dial-&#62;button)	{	case 1:	  mask = GDK_BUTTON1_MASK;	  break;	case 2:	  mask = GDK_BUTTON2_MASK;	  break;	case 3:	  mask = GDK_BUTTON3_MASK;	  break;	default:	  mask = 0;	  break;	}      if (mods &#38; mask)	gtk_dial_update_mouse (dial, x,y);    }  return FALSE;}static gintgtk_dial_timer (GtkDial *dial){  g_return_val_if_fail (dial != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (dial), FALSE);  if (dial-&#62;policy == GTK_UPDATE_DELAYED)    g_signal_emit_by_name (GTK_OBJECT (dial-&#62;adjustment), "value_changed");  return FALSE;}static voidgtk_dial_update_mouse (GtkDial *dial, gint x, gint y){  gint xc, yc;  gfloat old_value;  g_return_if_fail (dial != NULL);  g_return_if_fail (GTK_IS_DIAL (dial));  xc = GTK_WIDGET(dial)-&#62;allocation.width / 2;  yc = GTK_WIDGET(dial)-&#62;allocation.height / 2;  old_value = dial-&#62;adjustment-&#62;value;  dial-&#62;angle = atan2(yc-y, x-xc);  if (dial-&#62;angle &#60; -M_PI/2.)    dial-&#62;angle += 2*M_PI;  if (dial-&#62;angle &#60; -M_PI/6)    dial-&#62;angle = -M_PI/6;  if (dial-&#62;angle &#62; 7.*M_PI/6.)    dial-&#62;angle = 7.*M_PI/6.;  dial-&#62;adjustment-&#62;value = dial-&#62;adjustment-&#62;lower + (7.*M_PI/6 - dial-&#62;angle) *    (dial-&#62;adjustment-&#62;upper - dial-&#62;adjustment-&#62;lower) / (4.*M_PI/3.);  if (dial-&#62;adjustment-&#62;value != old_value)    {      if (dial-&#62;policy == GTK_UPDATE_CONTINUOUS)	{	  g_signal_emit_by_name (GTK_OBJECT (dial-&#62;adjustment), "value_changed");	}      else	{	  gtk_widget_queue_draw (GTK_WIDGET (dial));	  if (dial-&#62;policy == GTK_UPDATE_DELAYED)	    {	      if (dial-&#62;timer)		gtk_timeout_remove (dial-&#62;timer);	      dial-&#62;timer = gtk_timeout_add (SCROLL_DELAY_LENGTH,					     (GtkFunction) gtk_dial_timer,					     (gpointer) dial);	    }	}    }}static voidgtk_dial_update (GtkDial *dial){  gfloat new_value;    g_return_if_fail (dial != NULL);  g_return_if_fail (GTK_IS_DIAL (dial));  new_value = dial-&#62;adjustment-&#62;value;    if (new_value &#60; dial-&#62;adjustment-&#62;lower)    new_value = dial-&#62;adjustment-&#62;lower;  if (new_value &#62; dial-&#62;adjustment-&#62;upper)    new_value = dial-&#62;adjustment-&#62;upper;  if (new_value != dial-&#62;adjustment-&#62;value)    {      dial-&#62;adjustment-&#62;value = new_value;      g_signal_emit_by_name (GTK_OBJECT (dial-&#62;adjustment), "value_changed");    }  dial-&#62;angle = 7.*M_PI/6. - (new_value - dial-&#62;adjustment-&#62;lower) * 4.*M_PI/3. /    (dial-&#62;adjustment-&#62;upper - dial-&#62;adjustment-&#62;lower);  gtk_widget_queue_draw (GTK_WIDGET (dial));}static voidgtk_dial_adjustment_changed (GtkAdjustment *adjustment,			      gpointer       data){  GtkDial *dial;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  dial = GTK_DIAL (data);  if ((dial-&#62;old_value != adjustment-&#62;value) ||      (dial-&#62;old_lower != adjustment-&#62;lower) ||      (dial-&#62;old_upper != adjustment-&#62;upper))    {      gtk_dial_update (dial);      dial-&#62;old_value = adjustment-&#62;value;      dial-&#62;old_lower = adjustment-&#62;lower;      dial-&#62;old_upper = adjustment-&#62;upper;    }}static voidgtk_dial_adjustment_value_changed (GtkAdjustment *adjustment,				    gpointer       data){  GtkDial *dial;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  dial = GTK_DIAL (data);  if (dial-&#62;old_value != adjustment-&#62;value)    {      gtk_dial_update (dial);      dial-&#62;old_value = adjustment-&#62;value;    }}</PRE></TD></TR></TABLE></DIV><DIVCLASS="SECT2"><H2CLASS="SECT2"><ANAME="AEN2867">dial_test.c</H2><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">&#13;#include &#60;stdio.h&#62;#include &#60;stdlib.h&#62;#include &#60;gtk/gtk.h&#62;#include "gtkdial.h"void value_changed( GtkAdjustment *adjustment,                    GtkWidget     *label ){  char buffer[16];  sprintf(buffer,"%4.2f",adjustment-&#62;value);  gtk_label_set_text (GTK_LABEL (label), buffer);}int main( int   argc,          char *argv[]){  GtkWidget *window;  GtkAdjustment *adjustment;  GtkWidget *dial;  GtkWidget *frame;  GtkWidget *vbox;  GtkWidget *label;    gtk_init (&#38;argc, &#38;argv);  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    gtk_window_set_title (GTK_WINDOW (window), "Dial");    g_signal_connect (G_OBJECT (window), "destroy",		    G_CALLBACK (exit), NULL);    gtk_container_set_border_width (GTK_CONTAINER (window), 10);  vbox = gtk_vbox_new (FALSE, 5);  gtk_container_add (GTK_CONTAINER (window), vbox);  gtk_widget_show (vbox);  frame = gtk_frame_new (NULL);  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);  gtk_container_add (GTK_CONTAINER (vbox), frame);  gtk_widget_show (frame);    adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 0.01, 0.1, 0));    dial = gtk_dial_new (adjustment);  gtk_dial_set_update_policy (GTK_DIAL (dial), GTK_UPDATE_DELAYED);  /*  gtk_widget_set_size_request (dial, 100, 100); */    gtk_container_add (GTK_CONTAINER (frame), dial);  gtk_widget_show (dial);  label = gtk_label_new ("0.00");  gtk_box_pack_end (GTK_BOX (vbox), label, 0, 0, 0);  gtk_widget_show (label);  g_signal_connect (G_OBJECT (adjustment), "value_changed",		    G_CALLBACK (value_changed), label);    gtk_widget_show (window);    gtk_main ();    return 0;}</PRE></TD></TR></TABLE></DIV></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="a2845.html"ACCESSKEY="P">&#60;&#60;&#60; Previous</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="book1.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="x2870.html"ACCESSKEY="N">Next &#62;&#62;&#62;</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">示例程序代码</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="a2845.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Scribble</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -