« 時計をつくる8 | トップページ | Twitterクライアントをつくる1 »

2010年10月 8日 (金)

時計をつくる9

せっかく作ったのでrubyのない環境でも使えるようにexe化しようとおもいます。Windows限定ですけど。

今回はOCRAというものを使ってみます。

exe化といえばRubyScript2ExeやExerbが頭に浮かぶのですがruby1.8系しかサポートしていないようなのでどうしようかなと思っていたら1.9系もサポートしているこちらが見つかったのでこれにしようと思います。

OCRAを探している過程で、過去にExerbを使ってexe化にトライして失敗したその回避方法が出ていたのでちょっとメモ。昔は、どうしてもうまくいかずRubyScript2Exeを使用していたのですが1.8系の場合は日本語の情報が多いExerbでもイケルよと。

で、OCRAなんですが、使ってみるとどうやら仕組みはRubyScript2Exeに似ているようです。使ったことがある方はすんなり馴染めるのではなかろうか。

では、インストール。gemから

gem install ocra --remote

exe化の為に下記のようにちょこっと変更

  1. if not defined?(Ocra)
  2.   App.new.main_loop
  3. end

exe化したいrubyのファイルや関連ファイルを指定して実行

ocra --windows RubyThroughClock.rb noname.xrc ruby.png RTC.rb

おっとエラーがでました。いくつか修正しないとexeになりませんでした。

1つめ。
exe実行するとすぐ終了。メインのRubyThroughClock.rbからxrciseで生成したRTC.rbを呼び出しているのですが、exe化すると場所が分からなくなるようで上手く実行されません。これはrequireで場所をFile.dirname(__FILE__)に指定することで解決できました。iconファイルの指定も同様に修正しておきます。

  1. # require './RTC.rb'
  2. require File.join( File.dirname(__FILE__), 'RTC.rb')

2つめ。
これもPATH関連。RTC.rbのなかでXRCファイルを読み込んでおりexe実行時に見つからなくてエラーになりました。これも解決方法は同じ。

  1.     # xml.load("noname.xrc")
  2.     xml.load(File.join( File.dirname(__FILE__), "noname.xrc"))

エラーが起きたらPATH関連をチェック!がポイントなのかな。再びOCRAを実行したらexeが出来上がりました。約6.5MB。

とりあえず時計ネタはこれで終わりにしておこう。まだ、ルックスが貧弱すぎるのでSVGやビットマップファイルから針をつくりたいとか若干ちらつく場合があるので直したいとか毎回描画しないで使い回せばよくね?とかいろいろおもうところがありますが。やはり画像をいじりだすと数学のスキルが必要になってくるなあ。

最後にソースを晒しておきます。

  1. begin
  2.   require 'rubygems'
  3. rescue LoadError
  4. end
  5. require 'yaml'
  6. require 'wx'
  7. # require './RTC.rb'
  8. require File.join( File.dirname(__FILE__), 'RTC.rb')
  9.  
  10. CONFIG_FILENAME = 'rtc_config'
  11.  
  12. # Configuration Management
  13. class RTC_config
  14.   attr_accessor :clock_size, :time_text_color, :time_text_pos_offset,
  15.   :circle_offset, :circle_color, :circle_pen_width,
  16.   :hour_hand, :min_hand, :tick_mark_size, :escape,
  17.   :stay_on_top, :position, :font, :font_data
  18.  
  19.   # Struct for configuration value
  20.   Color = Struct.new('Color', :r, :g, :b)
  21.   Point = Struct.new('Point', :x, :y)
  22.   Hand  = Struct.new('Hand', :polygon, :pen_color, :pen_width, :brush_color, :basis)
  23.   FontData  = Struct.new('FontData', :color, :size, :name, :style, :weight)
  24.  
  25.   def initialize
  26.     # If configuration file is invalid, set default value as below
  27.     # Clock app default value
  28.     @clock_size ||= 300
  29.     @time_text_color ||= get_Color(Wx::GREEN)
  30.     @time_text_pos_offset ||= Point.new(@clock_size / 2, @clock_size / 2)
  31.     @tick_mark_size ||= 10
  32.     @circle_offset ||= @clock_size / 2
  33.     @circle_color ||= get_Color(Wx::RED)
  34.     @circle_pen_width ||= 3
  35.     @stay_on_top ||= true
  36.     @position ||= Point.new(0,0)
  37.     @escape ||= Point.new(50,50)
  38.  
  39.     # Hour Hand default value
  40.     @hour_hand ||= Hand.new
  41.     @hour_hand.polygon ||= [ [0, @clock_size / 30], [-5, 0], [0, - @clock_size / 4], [5, 0] ]
  42.     @hour_hand.pen_color ||= Color.new(1, 1, 1)
  43.     @hour_hand.pen_width ||= 1
  44.     @hour_hand.brush_color ||= get_Color(Wx::CYAN)
  45.     @hour_hand.basis ||= @clock_size # for scaling
  46.  
  47.     # Minites Hand default value
  48.     @min_hand ||= Hand.new
  49.     @min_hand.polygon ||= [ [0, @clock_size / 30], [-5, 0], [0, - @clock_size * 2 / 5], [5, 0] ]
  50.     @min_hand.pen_color ||= Color.new(1, 1, 1)
  51.     @min_hand.pen_width ||= 1
  52.     @min_hand.brush_color ||= get_Color(Wx::BLUE)
  53.     @min_hand.basis ||= @clock_size # for scaling
  54.  
  55.     # Font default value
  56.     # Wx::Font.set_native_font_info doesn't work
  57.     # Font info stored to FontData structure
  58.     @font_data ||= FontData.new
  59.     @font_data.color ||= get_Color(Wx::GREEN)
  60.     @font_data.size ||= 18
  61.     @font_data.name ||= ''
  62.     @font_data.style ||= Wx::FONTSTYLE_NORMAL
  63.     @font_data.weight ||= Wx::FONTWEIGHT_NORMAL
  64.     init()
  65.   end
  66.  
  67.   def init
  68.     # initialize Font
  69.     @font = Wx::Font.new
  70.     @font.set_point_size(@font_data.size)
  71.     @font.set_face_name(@font_data.name)
  72.     @font.set_style(@font_data.style)
  73.     @font.set_weight(@font_data.weight)
  74.   end
  75.  
  76.   def get_Color(obj)
  77.     return Color.new(obj.red, obj.green, obj.blue)
  78.   end
  79.  
  80.   def get_Colour(obj)
  81.     return Wx::Colour.new(obj.r, obj.g, obj.b)
  82.   end
  83.  
  84.   def to_yaml_properties
  85.     arr = self.instance_variables
  86.     # Remove Font info from YAML decoded data
  87.     # Avoid to fail creating this object when made from YAML data
  88.     arr.delete(:@font)
  89.     return arr
  90.   end
  91. end
  92.  
  93. # Application Frame
  94. class RubyThroughClock < RTC
  95.   attr_accessor :rtc_config
  96.  
  97.   def initialize(parent = nil)
  98.     super()
  99.  
  100.     # ruby need pre-load to make RTC_config objects probably
  101.     # To avoid configuration loading error, make RTC_config object
  102.     RTC_config.new
  103.  
  104.     # Load configuration file
  105.     begin
  106.       File.open(CONFIG_FILENAME,'r') do |f|
  107.         @rtc_config = YAML.load(f)
  108.       end
  109.     rescue => e
  110.       puts 'config err: ', e
  111.       @rtc_config = RTC_config.new
  112.     end
  113.     @rtc_config.init
  114.  
  115.     # Set transparent color
  116.     set_background_colour(Wx::BLACK)
  117.  
  118.     # Create taskbar icon
  119.     @tbicon = RTC_TaskBarIcon.new(self)
  120.  
  121.     @prev_time = Time.now
  122.     @prev_position = []
  123.  
  124.     # Create Buffer Bitmap
  125.     create_Buffer()
  126.  
  127.     # Event handler
  128.     evt_paint(){|event| on_draw_Clock()}
  129.     evt_size(){|event| on_Size(event)}
  130.     evt_close(){|event| on_Close(event)}
  131.     evt_enter_window(){|event| on_Entering(event)}
  132.  
  133.     @m_timer = Wx::Timer.new(self)
  134.     evt_timer(@m_timer.get_id()) { |event| on_Timer(event)}
  135.     @m_timer.start(500)
  136.  
  137.     # Frame size
  138.     set_size(Wx::Size.new(@rtc_config.clock_size, @rtc_config.clock_size))
  139.     move(@rtc_config.position.x, @rtc_config.position.y)
  140.   end
  141.  
  142.   def create_Buffer()
  143.     size = get_client_size()
  144.     @img = Wx::Image.new(size.get_width, size.get_height)
  145.     @img.init_alpha
  146.     @buffer = @img.convert_to_bitmap
  147.   end
  148.  
  149.   def draw_Time(gc, dc, time_str, position)
  150.     mt   = gc.get_transform
  151.  
  152.     # Draw the current time
  153.     colour = @rtc_config.get_Colour(@rtc_config.time_text_color)
  154.     dc.set_text_foreground(colour)
  155.     dc.draw_text(time_str, position.x, position.y)
  156.  
  157.     gc.set_transform(mt)
  158.   end
  159.  
  160.   def draw_Hand(gc, hand, radians)
  161.     path = gc.create_path
  162.     mt   = gc.get_transform
  163.  
  164.     # Set Hand Polygon
  165.     hand.polygon.each do |xy|
  166.       path.add_line_to_point(xy[0], xy[1])
  167.     end
  168.     path.close_subpath
  169.  
  170.     # Change the scale
  171.     scale_xy = @rtc_config.clock_size.to_f / hand.basis.to_f
  172.     gc.scale(scale_xy, scale_xy)
  173.     # Move Hand
  174.     gc.rotate(radians)
  175.  
  176.     # Pen Setting
  177.     color = hand.pen_color
  178.     colour = Wx::Colour.new(color.r, color.g, color.b)
  179.     gc.set_pen(Wx::Pen.new(colour, hand.pen_width))
  180.  
  181.     # Brush Setting
  182.     color = hand.brush_color
  183.     colour = Wx::Colour.new(color.r, color.g, color.b)
  184.     gc.set_brush(Wx::Brush.new(colour))
  185.  
  186.     # Drawing
  187.     gc.draw_path(path)
  188.  
  189.     gc.set_transform(mt)
  190.   end
  191.  
  192.   def draw_Circle(gc, rtc_cfg)
  193.     path = gc.create_path
  194.     mt   = gc.get_transform
  195.     rotate_agl = Math::PI * 30  / 180
  196.  
  197.     # Font setting
  198.     font = rtc_cfg.font
  199.     colour = rtc_cfg.get_Colour(rtc_cfg.font_data.color)
  200.     gc.set_font(font,colour)
  201.     # Calculate Radius
  202.     radius = rtc_cfg.clock_size - rtc_cfg.circle_offset
  203.     radius_len = radius * 4 / 5 # adjusted length
  204.     # Set Path
  205.     path.add_circle(0, 0, radius_len - font.get_point_size)
  206.     # Pen Setting
  207.     colour = rtc_cfg.get_Colour(rtc_cfg.circle_color)
  208.     pen = (Wx::Pen.new(colour, rtc_cfg.circle_pen_width))
  209.     gc.set_pen(pen)
  210.  
  211.     # Draw Circle
  212.     gc.draw_path(path)
  213.  
  214.     # Offset X Y position
  215.     gc.translate(-font.get_point_size / 2, -font.get_point_size / 2 - 5)
  216.     gc.rotate(Math::PI)
  217.  
  218.     # Set the number of hour
  219.     for hour in 1..12
  220.       gc.rotate(rotate_agl)
  221.       # Drawing the number of hour
  222.       gc.draw_text(hour.to_s, 0, radius_len, Math::PI * (30 * hour + 180)  / 180)
  223.     end
  224.  
  225.     gc.set_transform(mt)
  226.   end
  227.  
  228.   # If mouse not on the Frame, Frame will back to old position
  229.   def check_mouse_position
  230.     mouse_position = Wx::get_mouse_position # Screen centered position
  231.     client_area = get_screen_rect           # Screen centered position
  232.     # client_area = get_rect
  233.  
  234.     unless client_area.contains(mouse_position)
  235.       position = @prev_position.shift
  236.       move(position) if position
  237.       @prev_position = []
  238.     end
  239.   end
  240.  
  241.   #
  242.   # Event processing
  243.   #
  244.   def on_draw_Clock()
  245.     @buffer.draw do |dc|
  246.       # Create Graphics Context from Memory DC
  247.       gc = Wx::GraphicsContext.create(dc)
  248.       dc.set_background(Wx::TRANSPARENT_BRUSH)
  249.  
  250.       # Clear DC
  251.       dc.clear
  252.  
  253.       # Offset X Y position
  254.       gc.translate(@rtc_config.clock_size / 2, @rtc_config.clock_size / 2)
  255.  
  256.       # Get current time
  257.       time = Time.now
  258.       time_str = "%02d" % time.hour.to_s + ':' + "%02d" % time.min.to_s
  259.  
  260.       # Draw Circle
  261.       draw_Circle(gc, @rtc_config)
  262.  
  263.       # Draw Hour hand
  264.       hour_offset = Math::PI * 6 * (time.min / 12) / 180
  265.       draw_Hand(gc, @rtc_config.hour_hand, Math::PI * ( 30 * (time.hour % 12)) / 180 + hour_offset)
  266.  
  267.       # Draw Min hand
  268.       draw_Hand(gc, @rtc_config.min_hand, Math::PI * ( 6 * time.min ) / 180)
  269.       draw_Time(gc, dc, time_str, @rtc_config.time_text_pos_offset)
  270.     end
  271.  
  272.     # Shape frame
  273.     r = Wx::Region.new(@buffer)
  274.     set_shape(r)
  275.     paint do |dc|
  276.       dc.draw_bitmap(@buffer, 0, 0, true)
  277.     end
  278.   end
  279.  
  280.   def on_Timer(event)
  281.     # Check if mouse on the clock
  282.     check_mouse_position()
  283.  
  284.     unless @prev_time.min == Time.now.min
  285.       @prev_time = Time.now
  286.       refresh
  287.     end
  288.   end
  289.  
  290.   def on_Size(event)
  291.     create_Buffer()
  292.     refresh
  293.   end
  294.  
  295.   def on_Close(event)
  296.     File.open(CONFIG_FILENAME,'w') do |f|
  297.       YAML.dump(@rtc_config,f)
  298.     end
  299.     @tbicon.remove_icon
  300.     @tbicon.destroy
  301.     event.skip
  302.   end
  303.  
  304.   def on_showOption(event)
  305.     # Store old configuration
  306.     prev_rtc_config = @rtc_config.to_yaml
  307.  
  308.     opt = RTC_OptionDiag.new(self)
  309.  
  310.     case opt.show_modal
  311.     when Wx::ID_OK # user clicked ok
  312.       @rtc_config.init
  313.     when Wx::ID_APPLY # user clicked apply
  314.       prev_rtc_config = @rtc_config.to_yaml
  315.       @rtc_config.init
  316.       refresh
  317.     when Wx::ID_CANCEL # user clicked cancel or closed the dialog
  318.       @rtc_config = YAML.load(prev_rtc_config)
  319.       @rtc_config.init
  320.       set_size(Wx::Size.new(@rtc_config.clock_size, @rtc_config.clock_size))
  321.     end
  322.     refresh
  323.  
  324.     opt.destroy
  325.     # opt.close
  326.   end
  327.  
  328.   def on_Stay_on_top(event)
  329.     flag = get_window_style_flag
  330.     if event.is_checked
  331.       flag = flag | Wx::STAY_ON_TOP
  332.     else
  333.       flag = flag ^ Wx::STAY_ON_TOP
  334.     end
  335.     set_window_style_flag(flag)
  336.     @rtc_config.stay_on_top = event.is_checked
  337.     refresh
  338.   end
  339.  
  340.   # Move window to Right-Upper position
  341.   def on_move_RU(event)
  342.     rect = Wx::Display.new.get_client_area
  343.     width = get_screen_rect.get_width
  344.     point = rect.get_top_right
  345.     @rtc_config.position.x = point.x - width
  346.     @rtc_config.position.y = point.y
  347.     move(@rtc_config.position.x, @rtc_config.position.y)
  348.   end
  349.  
  350.   # Move window to Right-Bottom position
  351.   def on_move_RB(event)
  352.     rect = Wx::Display.new.get_client_area
  353.     width = get_screen_rect.get_width
  354.     height = get_screen_rect.get_height
  355.     point = rect.get_bottom_right
  356.     @rtc_config.position.x = point.x - width
  357.     @rtc_config.position.y = point.y - height
  358.     move(@rtc_config.position.x, @rtc_config.position.y)
  359.   end
  360.  
  361.   # Move window to Left-Upper position
  362.   def on_move_LU(event)
  363.     rect = Wx::Display.new.get_client_area
  364.     point = rect.get_top_left
  365.     @rtc_config.position.x = point.x
  366.     @rtc_config.position.y = point.y
  367.     move(@rtc_config.position.x, @rtc_config.position.y)
  368.   end
  369.  
  370.   # Move window to Left-Bottom position
  371.   def on_move_LB(event)
  372.     rect = Wx::Display.new.get_client_area
  373.     height = get_screen_rect.get_height
  374.     point = rect.get_bottom_left
  375.     @rtc_config.position.x = point.x
  376.     @rtc_config.position.y = point.y - height
  377.     move(@rtc_config.position.x, @rtc_config.position.y)
  378.   end
  379.  
  380.   # Mouse on Frame
  381.   def on_Entering(event)
  382.     mouse_position = event.get_position # Mouse position with Frame centered
  383.     position       = get_position       # Frame position with screen centered
  384.     client_area    = get_client_rect    # Frame position with Frame centered
  385.  
  386.     # Store current Frame position
  387.     @prev_position.push(position)
  388.  
  389.     # Delta X,Y
  390.     dx = @rtc_config.escape.x
  391.     dy = @rtc_config.escape.y
  392.     # Center XY of Frame
  393.     centre_x = client_area.x + client_area.width  / 2
  394.     centre_y = client_area.y + client_area.height / 2
  395.  
  396.     if (centre_x - mouse_position.x) < 0
  397.       dx = -dx
  398.     end
  399.     if (centre_y - mouse_position.y) < 0
  400.       dy = -dy
  401.     end
  402.     move(position.x + dx, position.y + dy)
  403.   end
  404. end
  405.  
  406.  
  407. # Option Dialog called by Task bar icon
  408. class RTC_OptionDiag < RTC_Option
  409.   def initialize(frame)
  410.     super()
  411.     @frame = frame
  412.     @rtc_config = frame.rtc_config
  413.  
  414.     # Set value from configuration
  415.     stay_on_top.set_value(@rtc_config.stay_on_top)
  416.     clock_size_sldr.set_value(@rtc_config.clock_size)
  417.     circle_offset_sldr.set_value(@rtc_config.circle_offset)
  418.     circle_offset_sldr.set_range(clock_size_sldr.get_min, clock_size_sldr.get_value)
  419.     clock_size_sldr.set_tick_freq(clock_size_sldr.get_max / 10,1)
  420.     circle_offset_sldr.set_tick_freq(circle_offset_sldr.get_max / 10,1)
  421.     fontname.set_value(@rtc_config.font_data.name)
  422.     font_size.set_value(@rtc_config.font_data.size)
  423.     time_pos_x.set_value(@rtc_config.time_text_pos_offset.x)
  424.     time_pos_x.set_range(0, clock_size_sldr.get_value)
  425.     time_pos_y.set_value(@rtc_config.time_text_pos_offset.y)
  426.     time_pos_y.set_range(0, clock_size_sldr.get_value)
  427.  
  428.     escape_x.set_value(@rtc_config.escape.x)
  429.     escape_y.set_value(@rtc_config.escape.y)
  430.  
  431.     # Event handler
  432.     stay_on_top.evt_checkbox(stay_on_top.get_id()){|event| on_Stay_on_top(event)}
  433.     pos_ru.evt_button(pos_ru.get_id()){|event| @frame.on_move_RU(event)}
  434.     pos_lu.evt_button(pos_lu.get_id()){|event| @frame.on_move_LU(event)}
  435.     pos_rb.evt_button(pos_rb.get_id()){|event| @frame.on_move_RB(event)}
  436.     pos_lb.evt_button(pos_lb.get_id()){|event| @frame.on_move_LB(event)}
  437.     clock_size_sldr.evt_slider(clock_size_sldr.get_id()){|event| on_Slider_clock_size()}
  438.     circle_offset_sldr.evt_slider(circle_offset_sldr.get_id()){|event| @rtc_config.circle_offset = circle_offset_sldr.get_value; @frame.refresh}
  439.     font_browse.evt_button(font_browse.get_id()){|event| on_choose_Font(event)}
  440.     font_size.evt_spinctrl(font_size.get_id()){|event| on_change_Fontsize(event)}
  441.     time_pos_x.evt_spinctrl(time_pos_x.get_id()){|event| on_change_TimePosX(event)}
  442.     time_pos_y.evt_spinctrl(time_pos_y.get_id()){|event| on_change_TimePosY(event)}
  443.     escape_x.evt_spinctrl(escape_x.get_id()){|event| on_change_EscapeX(event)}
  444.     escape_y.evt_spinctrl(escape_y.get_id()){|event| on_change_EscapeY(event)}
  445.   end
  446.  
  447.   # Modify Clock Size
  448.   def on_Slider_clock_size()
  449.     size = clock_size_sldr.get_value
  450.     circle_offset_sldr.set_range(clock_size_sldr.get_min, size)
  451.  
  452.     # Change maximum for each related controle
  453.     if circle_offset_sldr.get_max < circle_offset_sldr.get_value
  454.       circle_offset_sldr.set_value(circle_offset_sldr.get_max)
  455.     end
  456.     time_pos_x.set_range(time_pos_x.get_min, size)
  457.     if time_pos_x.get_max < time_pos_x.get_value
  458.       time_pos_x.set_value(time_pos_x.get_max)
  459.     end
  460.     time_pos_y.set_range(time_pos_y.get_min, size)
  461.     if time_pos_y.get_max < time_pos_y.get_value
  462.       time_pos_y.set_value(time_pos_y.get_max)
  463.     end
  464.  
  465.     @rtc_config.clock_size = size
  466.     @frame.set_size(Wx::Size.new(size,size))
  467.   end
  468.  
  469.   def on_Stay_on_top(event)
  470.     # Call method on upper level class
  471.     @frame.on_Stay_on_top(event)
  472.   end
  473.  
  474.   # Font Dialog
  475.   def on_choose_Font(event)
  476.     font = @rtc_config.font
  477.     fontdata = Wx::FontData.new
  478.     fontdata.set_initial_font(font)
  479.     fontdata.set_chosen_font(font)
  480.     colour = @rtc_config.get_Colour(@rtc_config.font_data.color)
  481.     fontdata.set_colour(colour)
  482.  
  483.     fontname.set_value(font.get_face_name)
  484.     font_size.set_value(font.get_point_size)
  485.     fontdiag = Wx::FontDialog.new(self, fontdata);
  486.  
  487.     case fontdiag.show_modal
  488.     when Wx::ID_OK # user clicked ok
  489.       fontdata = fontdiag.get_font_data
  490.       font = fontdata.get_chosen_font
  491.       fontname.set_value(font.get_face_name)
  492.       font_size.set_value(font.get_point_size)
  493.  
  494.       # Store FontData to config
  495.       @rtc_config.font = font
  496.       color =  @rtc_config.get_Color(fontdata.get_colour)
  497.       @rtc_config.font_data.color  = color
  498.       @rtc_config.font_data.size   = font.get_point_size
  499.       @rtc_config.font_data.name   = font.get_face_name
  500.       @rtc_config.font_data.style  = font.get_style
  501.       @rtc_config.font_data.weight = font.get_weight
  502.       @frame.refresh
  503.     when Wx::ID_CANCEL # user clicked cancel or closed the dialog
  504.     end
  505.  
  506.     fontdiag.close
  507.     # fontdiag.destroy
  508.   end
  509.  
  510.   def on_change_Fontsize(event)
  511.     size = event.get_position
  512.     @rtc_config.font.set_point_size(size)
  513.     @rtc_config.font_data.size = size
  514.     @frame.refresh
  515.   end
  516.  
  517.   def on_change_TimePosX(event)
  518.     x = event.get_position
  519.     @rtc_config.time_text_pos_offset.x = x
  520.     @frame.refresh
  521.   end
  522.  
  523.   def on_change_TimePosY(event)
  524.     y = event.get_position
  525.     @rtc_config.time_text_pos_offset.y = y
  526.     @frame.refresh
  527.   end
  528.  
  529.   def on_change_EscapeX(event)
  530.     x = event.get_position
  531.     @rtc_config.escape.x = x
  532.   end
  533.  
  534.   def on_change_EscapeY(event)
  535.     y = event.get_position
  536.     @rtc_config.escape.y = y
  537.   end
  538. end
  539.  
  540. # Task bar icon
  541. class RTC_TaskBarIcon < Wx::TaskBarIcon
  542.   # Event ID
  543.   TBMENU_OPTION      = Wx::ID_HIGHEST + 1
  544.   TBMENU_STAY_ON_TOP = Wx::ID_HIGHEST + 2
  545.   TBMENU_MOVE_RU     = Wx::ID_HIGHEST + 3
  546.   TBMENU_MOVE_RB     = Wx::ID_HIGHEST + 4
  547.   TBMENU_MOVE_LU     = Wx::ID_HIGHEST + 5
  548.   TBMENU_MOVE_LB     = Wx::ID_HIGHEST + 6
  549.   TBMENU_EXIT        = Wx::ID_HIGHEST + 7
  550.  
  551.   def initialize(frame)
  552.     super()
  553.     @frame = frame
  554.     @stay_on_top = @frame.rtc_config.stay_on_top
  555.  
  556.     # Icon image
  557.     icon = make_icon('ruby.png')
  558.     set_icon(icon, 'RubyThroughClock')
  559.  
  560.     # Menu Event
  561.     evt_menu(TBMENU_OPTION)      {|event| @frame.on_showOption(event) }
  562.     evt_menu(TBMENU_STAY_ON_TOP) {|event| on_TB_stay_on_top(event) }
  563.     evt_menu(TBMENU_MOVE_RU)     {|event| @frame.on_move_RU(event) }
  564.     evt_menu(TBMENU_MOVE_RB)     {|event| @frame.on_move_RB(event) }
  565.     evt_menu(TBMENU_MOVE_LU)     {|event| @frame.on_move_LU(event) }
  566.     evt_menu(TBMENU_MOVE_LB)     {|event| @frame.on_move_LB(event) }
  567.     evt_menu(TBMENU_EXIT)        {|event| @frame.close }
  568.   end
  569.  
  570.   def on_TB_stay_on_top(event)
  571.     @stay_on_top = event.is_checked
  572.     @frame.on_Stay_on_top(event)
  573.   end
  574.  
  575.   # Make Task bar icon that made from fixed image file
  576.   def make_icon(img_name)
  577.     # Different platforms have different requirements for the
  578.     #  taskbar icon size
  579.     filename = File.join( File.dirname(__FILE__), img_name )
  580.     img = Wx::Image.new(filename, Wx::BITMAP_TYPE_PNG)
  581.     img.set_mask
  582.     if Wx::PLATFORM == "WXMSW"
  583.       img = img.scale(16, 16)
  584.     elsif Wx::PLATFORM == "WXGTK"
  585.       img = img.scale(22, 22)
  586.     end
  587.     # WXMAC can be any size up to 128x128, so don't scale
  588.     icon = Wx::Icon.new
  589.     icon.copy_from_bitmap(Wx::Bitmap.new(img))
  590.     return icon
  591.   end
  592.  
  593.   def create_popup_menu
  594.     # Called by the base class when it needs to popup the menu
  595.     #  (the default evt_right_down event).  Create and return
  596.     #  the menu to display.
  597.     @stay_on_top = @frame.rtc_config.stay_on_top
  598.     menu = Wx::Menu.new
  599.     menu.append(TBMENU_OPTION,     "Option")
  600.     menu.append_check_item(TBMENU_STAY_ON_TOP,"Stay On Top")
  601.     menu.check(TBMENU_STAY_ON_TOP, @stay_on_top)
  602.     submenu = Wx::Menu.new
  603.     submenu.append(TBMENU_MOVE_RU, "Right Upper")
  604.     submenu.append(TBMENU_MOVE_RB, "Right Bottom")
  605.     submenu.append(TBMENU_MOVE_LU, "Left Upper")
  606.     submenu.append(TBMENU_MOVE_LB, "Left Bottom")
  607.     menu.append_menu(Wx::ID_ANY,   "Move",submenu)
  608.     menu.append(TBMENU_EXIT,       "Exit")
  609.     return menu
  610.   end
  611. end
  612.  
  613. class App < Wx::App
  614.   def on_init
  615.     f =  ::RubyThroughClock.new
  616.     f.show
  617.   end
  618. end
  619. if not defined?(Ocra)
  620.   App.new.main_loop
  621. end

  1.  
  2. # This class was automatically generated from XRC source. It is not
  3. # recommended that this file is edited directly; instead, inherit from
  4. # this class and extend its behaviour there. 
  5. #
  6. # Source file: noname.xrc
  7. # Generated at: 2010-10-07 08:33:05 +0900
  8.  
  9. class RTC < Wx::Frame
  10.  
  11.   def initialize(parent = nil)
  12.     super()
  13.     xml = Wx::XmlResource.get
  14.     xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
  15.     xml.init_all_handlers
  16.     # xml.load("noname.xrc")
  17.     xml.load(File.join( File.dirname(__FILE__), "noname.xrc"))
  18.     xml.load_frame_subclass(self, parent, "MyFrame1")
  19.  
  20.     finder = lambda do | x |
  21.       int_id = Wx::xrcid(x)
  22.       begin
  23.         Wx::Window.find_window_by_id(int_id, self) || int_id
  24.       # Temporary hack to work around regression in 1.9.2; remove
  25.       # begin/rescue clause in later versions
  26.       rescue RuntimeError
  27.         int_id
  28.       end
  29.     end
  30.  
  31.     if self.class.method_defined? "on_init"
  32.       self.on_init()
  33.     end
  34.   end
  35. end
  36.  
  37.  
  38.  
  39. # This class was automatically generated from XRC source. It is not
  40. # recommended that this file is edited directly; instead, inherit from
  41. # this class and extend its behaviour there. 
  42. #
  43. # Source file: noname.xrc
  44. # Generated at: 2010-10-07 08:33:05 +0900
  45.  
  46. class RTC_Option < Wx::Dialog
  47.  
  48.   attr_reader :m_notebook1, :m_panel2, :pos_lu, :pos_ru, :pos_lb,
  49.               :pos_rb, :stay_on_top, :m_panel3, :m_statictext3,
  50.               :clock_size_sldr, :m_statictext31, :circle_offset_sldr,
  51.               :m_panel4, :m_statictext5, :fontname, :font_browse,
  52.               :m_statictext6, :font_size, :m_panel5, :m_statictext32,
  53.               :m_statictext12, :time_pos_x, :m_statictext121,
  54.               :time_pos_y, :m_panel6, :m_statictext321,
  55.               :m_statictext122, :escape_x, :m_statictext1211,
  56.               :escape_y
  57.  
  58.   def initialize(parent = nil)
  59.     super()
  60.     xml = Wx::XmlResource.get
  61.     xml.flags = 2 # Wx::XRC_NO_SUBCLASSING
  62.     xml.init_all_handlers
  63.     xml.load(File.join( File.dirname(__FILE__), "noname.xrc"))
  64.     # xml.load("noname.xrc")
  65.     xml.load_dialog_subclass(self, parent, "MyDialog1")
  66.  
  67.     finder = lambda do | x |
  68.       int_id = Wx::xrcid(x)
  69.       begin
  70.         Wx::Window.find_window_by_id(int_id, self) || int_id
  71.       # Temporary hack to work around regression in 1.9.2; remove
  72.       # begin/rescue clause in later versions
  73.       rescue RuntimeError
  74.         int_id
  75.       end
  76.     end
  77.  
  78.     @m_notebook1 = finder.call("m_notebook1")
  79.     @m_panel2 = finder.call("m_panel2")
  80.     @pos_lu = finder.call("pos_lu")
  81.     @pos_ru = finder.call("pos_ru")
  82.     @pos_lb = finder.call("pos_lb")
  83.     @pos_rb = finder.call("pos_rb")
  84.     @stay_on_top = finder.call("stay_on_top")
  85.     @m_panel3 = finder.call("m_panel3")
  86.     @m_statictext3 = finder.call("m_staticText3")
  87.     @clock_size_sldr = finder.call("clock_size_sldr")
  88.     @m_statictext31 = finder.call("m_staticText31")
  89.     @circle_offset_sldr = finder.call("circle_offset_sldr")
  90.     @m_panel4 = finder.call("m_panel4")
  91.     @m_statictext5 = finder.call("m_staticText5")
  92.     @fontname = finder.call("fontname")
  93.     @font_browse = finder.call("font_browse")
  94.     @m_statictext6 = finder.call("m_staticText6")
  95.     @font_size = finder.call("font_size")
  96.     @m_panel5 = finder.call("m_panel5")
  97.     @m_statictext32 = finder.call("m_staticText32")
  98.     @m_statictext12 = finder.call("m_staticText12")
  99.     @time_pos_x = finder.call("time_pos_x")
  100.     @m_statictext121 = finder.call("m_staticText121")
  101.     @time_pos_y = finder.call("time_pos_y")
  102.     @m_panel6 = finder.call("m_panel6")
  103.     @m_statictext321 = finder.call("m_staticText321")
  104.     @m_statictext122 = finder.call("m_staticText122")
  105.     @escape_x = finder.call("escape_x")
  106.     @m_statictext1211 = finder.call("m_staticText1211")
  107.     @escape_y = finder.call("escape_y")
  108.     if self.class.method_defined? "on_init"
  109.       self.on_init()
  110.     end
  111.   end
  112. end

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  2. <resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
  3.   <object class="wxFrame" name="MyFrame1" subclass="RTC">
  4.     <style>wxFRAME_NO_TASKBAR|wxFRAME_SHAPED|wxSTAY_ON_TOP|wxTAB_TRAVERSAL</style>
  5.     <size>500,300</size>
  6.     <title></title>
  7.     <object class="wxBoxSizer">
  8.       <orient>wxHORIZONTAL</orient>
  9.     </object>
  10.   </object>
  11.   <object class="wxDialog" name="MyDialog1" subclass="RTC_Option">
  12.     <style>wxDEFAULT_DIALOG_STYLE</style>
  13.     <size>350,250</size>
  14.     <title>Option</title>
  15.     <object class="wxBoxSizer">
  16.       <orient>wxVERTICAL</orient>
  17.       <object class="sizeritem">
  18.         <option>1</option>
  19.         <flag>wxALL|wxEXPAND</flag>
  20.         <border>5</border>
  21.         <object class="wxNotebook" name="m_notebook1">
  22.           <object class="notebookpage">
  23.             <label>Position</label>
  24.             <selected>1</selected>
  25.             <object class="wxPanel" name="m_panel2">
  26.               <style>wxTAB_TRAVERSAL</style>
  27.               <object class="wxBoxSizer">
  28.                 <orient>wxVERTICAL</orient>
  29.                 <object class="sizeritem">
  30.                   <option>1</option>
  31.                   <flag>wxEXPAND</flag>
  32.                   <border>0</border>
  33.                   <object class="wxGridSizer">
  34.                     <rows>2</rows>
  35.                     <cols>2</cols>
  36.                     <vgap>0</vgap>
  37.                     <hgap>0</hgap>
  38.                     <object class="sizeritem">
  39.                       <option>0</option>
  40.                       <flag>wxALL|wxEXPAND</flag>
  41.                       <border>0</border>
  42.                       <object class="wxButton" name="pos_lu">
  43.                         <label>Left _ Top</label>
  44.                         <default>0</default>
  45.                       </object>
  46.                     </object>
  47.                     <object class="sizeritem">
  48.                       <option>0</option>
  49.                       <flag>wxALL|wxEXPAND</flag>
  50.                       <border>0</border>
  51.                       <object class="wxButton" name="pos_ru">
  52.                         <label>Right _ Top</label>
  53.                         <default>0</default>
  54.                       </object>
  55.                     </object>
  56.                     <object class="sizeritem">
  57.                       <option>0</option>
  58.                       <flag>wxALL|wxEXPAND</flag>
  59.                       <border>0</border>
  60.                       <object class="wxButton" name="pos_lb">
  61.                         <label>Left _ Bottom</label>
  62.                         <default>0</default>
  63.                       </object>
  64.                     </object>
  65.                     <object class="sizeritem">
  66.                       <option>0</option>
  67.                       <flag>wxALL|wxEXPAND</flag>
  68.                       <border>0</border>
  69.                       <object class="wxButton" name="pos_rb">
  70.                         <label>Right _ Bottom</label>
  71.                         <default>0</default>
  72.                       </object>
  73.                     </object>
  74.                   </object>
  75.                 </object>
  76.                 <object class="sizeritem">
  77.                   <option>0</option>
  78.                   <flag>wxALL</flag>
  79.                   <border>5</border>
  80.                   <object class="wxCheckBox" name="stay_on_top">
  81.                     <label>Stay on Top</label>
  82.                     <checked>0</checked>
  83.                   </object>
  84.                 </object>
  85.               </object>
  86.             </object>
  87.           </object>
  88.           <object class="notebookpage">
  89.             <label>Size</label>
  90.             <selected>0</selected>
  91.             <object class="wxPanel" name="m_panel3">
  92.               <style>wxTAB_TRAVERSAL</style>
  93.               <object class="wxBoxSizer">
  94.                 <orient>wxVERTICAL</orient>
  95.                 <object class="sizeritem">
  96.                   <option>1</option>
  97.                   <flag>wxEXPAND</flag>
  98.                   <border>5</border>
  99.                   <object class="wxBoxSizer">
  100.                     <orient>wxHORIZONTAL</orient>
  101.                     <object class="sizeritem">
  102.                       <option>0</option>
  103.                       <flag>wxALL</flag>
  104.                       <border>5</border>
  105.                       <object class="wxStaticText" name="m_staticText3">
  106.                         <label>clock size</label>
  107.                         <wrap>-1</wrap>
  108.                       </object>
  109.                     </object>
  110.                     <object class="spacer">
  111.                       <option>1</option>
  112.                       <flag>wxEXPAND</flag>
  113.                       <border>5</border>
  114.                       <size>0,0</size>
  115.                     </object>
  116.                     <object class="sizeritem">
  117.                       <option>0</option>
  118.                       <flag>wxALL</flag>
  119.                       <border>5</border>
  120.                       <object class="wxSlider" name="clock_size_sldr">
  121.                         <style>wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS</style>
  122.                         <value>100</value>
  123.                         <min>50</min>
  124.                         <max>500</max>
  125.                       </object>
  126.                     </object>
  127.                   </object>
  128.                 </object>
  129.                 <object class="sizeritem">
  130.                   <option>1</option>
  131.                   <flag>wxEXPAND</flag>
  132.                   <border>5</border>
  133.                   <object class="wxBoxSizer">
  134.                     <orient>wxHORIZONTAL</orient>
  135.                     <object class="sizeritem">
  136.                       <option>0</option>
  137.                       <flag>wxALL</flag>
  138.                       <border>5</border>
  139.                       <object class="wxStaticText" name="m_staticText31">
  140.                         <label>circle offset</label>
  141.                         <wrap>-1</wrap>
  142.                       </object>
  143.                     </object>
  144.                     <object class="spacer">
  145.                       <option>1</option>
  146.                       <flag>wxEXPAND</flag>
  147.                       <border>5</border>
  148.                       <size>0,0</size>
  149.                     </object>
  150.                     <object class="sizeritem">
  151.                       <option>0</option>
  152.                       <flag>wxALL</flag>
  153.                       <border>5</border>
  154.                       <object class="wxSlider" name="circle_offset_sldr">
  155.                         <style>wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_LABELS</style>
  156.                         <value>100</value>
  157.                         <min>50</min>
  158.                         <max>500</max>
  159.                       </object>
  160.                     </object>
  161.                   </object>
  162.                 </object>
  163.               </object>
  164.             </object>
  165.           </object>
  166.           <object class="notebookpage">
  167.             <label>Font</label>
  168.             <selected>0</selected>
  169.             <object class="wxPanel" name="m_panel4">
  170.               <style>wxTAB_TRAVERSAL</style>
  171.               <object class="wxBoxSizer">
  172.                 <orient>wxVERTICAL</orient>
  173.                 <object class="sizeritem">
  174.                   <option>0</option>
  175.                   <flag>wxEXPAND</flag>
  176.                   <border>5</border>
  177.                   <object class="wxBoxSizer">
  178.                     <orient>wxHORIZONTAL</orient>
  179.                     <object class="sizeritem">
  180.                       <option>0</option>
  181.                       <flag>wxALL</flag>
  182.                       <border>5</border>
  183.                       <object class="wxStaticText" name="m_staticText5">
  184.                         <label>Font</label>
  185.                         <wrap>0</wrap>
  186.                       </object>
  187.                     </object>
  188.                     <object class="sizeritem">
  189.                       <option>1</option>
  190.                       <flag>wxALL</flag>
  191.                       <border>5</border>
  192.                       <object class="wxTextCtrl" name="fontname">
  193.                         <style>wxTE_READONLY</style>
  194.                         <value></value>
  195.                         <maxlength>0</maxlength>
  196.                       </object>
  197.                     </object>
  198.                     <object class="sizeritem">
  199.                       <option>0</option>
  200.                       <flag>wxALL</flag>
  201.                       <border>5</border>
  202.                       <object class="wxButton" name="font_browse">
  203.                         <label>Browse</label>
  204.                         <default>0</default>
  205.                       </object>
  206.                     </object>
  207.                   </object>
  208.                 </object>
  209.                 <object class="sizeritem">
  210.                   <option>1</option>
  211.                   <flag>wxEXPAND</flag>
  212.                   <border>5</border>
  213.                   <object class="wxBoxSizer">
  214.                     <orient>wxHORIZONTAL</orient>
  215.                     <object class="sizeritem">
  216.                       <option>1</option>
  217.                       <flag>wxALL</flag>
  218.                       <border>5</border>
  219.                       <object class="wxStaticText" name="m_staticText6">
  220.                         <label>Font Size</label>
  221.                         <wrap>-1</wrap>
  222.                       </object>
  223.                     </object>
  224.                     <object class="sizeritem">
  225.                       <option>0</option>
  226.                       <flag>wxALL</flag>
  227.                       <border>5</border>
  228.                       <object class="wxSpinCtrl" name="font_size">
  229.                         <style>wxSP_ARROW_KEYS</style>
  230.                         <value>1</value>
  231.                         <min>1</min>
  232.                         <max>30</max>
  233.                       </object>
  234.                     </object>
  235.                   </object>
  236.                 </object>
  237.               </object>
  238.             </object>
  239.           </object>
  240.           <object class="notebookpage">
  241.             <label>Time Text</label>
  242.             <selected>0</selected>
  243.             <object class="wxPanel" name="m_panel5">
  244.               <style>wxTAB_TRAVERSAL</style>
  245.               <object class="wxBoxSizer">
  246.                 <orient>wxVERTICAL</orient>
  247.                 <object class="sizeritem">
  248.                   <option>1</option>
  249.                   <flag>wxEXPAND</flag>
  250.                   <border>5</border>
  251.                   <object class="wxBoxSizer">
  252.                     <orient>wxHORIZONTAL</orient>
  253.                     <object class="sizeritem">
  254.                       <option>0</option>
  255.                       <flag>wxALL</flag>
  256.                       <border>5</border>
  257.                       <object class="wxStaticText" name="m_staticText32">
  258.                         <label>&apos;Time&apos; Text Position</label>
  259.                         <wrap>-1</wrap>
  260.                       </object>
  261.                     </object>
  262.                     <object class="spacer">
  263.                       <option>1</option>
  264.                       <flag>wxEXPAND</flag>
  265.                       <border>5</border>
  266.                       <size>0,0</size>
  267.                     </object>
  268.                     <object class="sizeritem">
  269.                       <option>0</option>
  270.                       <flag></flag>
  271.                       <border>5</border>
  272.                       <object class="wxBoxSizer">
  273.                         <orient>wxVERTICAL</orient>
  274.                         <object class="sizeritem">
  275.                           <option>1</option>
  276.                           <flag>wxEXPAND</flag>
  277.                           <border>5</border>
  278.                           <object class="wxBoxSizer">
  279.                             <orient>wxHORIZONTAL</orient>
  280.                             <object class="sizeritem">
  281.                               <option>0</option>
  282.                               <flag>wxALL</flag>
  283.                               <border>5</border>
  284.                               <object class="wxStaticText" name="m_staticText12">
  285.                                 <label>x</label>
  286.                                 <wrap>-1</wrap>
  287.                               </object>
  288.                             </object>
  289.                             <object class="sizeritem">
  290.                               <option>0</option>
  291.                               <flag>wxALL</flag>
  292.                               <border>5</border>
  293.                               <object class="wxSpinCtrl" name="time_pos_x">
  294.                                 <style>wxSP_ARROW_KEYS</style>
  295.                                 <value>0</value>
  296.                                 <min>0</min>
  297.                                 <max>999</max>
  298.                               </object>
  299.                             </object>
  300.                           </object>
  301.                         </object>
  302.                         <object class="sizeritem">
  303.                           <option>1</option>
  304.                           <flag>wxEXPAND</flag>
  305.                           <border>5</border>
  306.                           <object class="wxBoxSizer">
  307.                             <orient>wxHORIZONTAL</orient>
  308.                             <object class="sizeritem">
  309.                               <option>0</option>
  310.                               <flag>wxALL</flag>
  311.                               <border>5</border>
  312.                               <object class="wxStaticText" name="m_staticText121">
  313.                                 <label>y</label>
  314.                                 <wrap>-1</wrap>
  315.                               </object>
  316.                             </object>
  317.                             <object class="sizeritem">
  318.                               <option>0</option>
  319.                               <flag>wxALL</flag>
  320.                               <border>5</border>
  321.                               <object class="wxSpinCtrl" name="time_pos_y">
  322.                                 <style>wxSP_ARROW_KEYS</style>
  323.                                 <value>0</value>
  324.                                 <min>0</min>
  325.                                 <max>999</max>
  326.                               </object>
  327.                             </object>
  328.                           </object>
  329.                         </object>
  330.                       </object>
  331.                     </object>
  332.                   </object>
  333.                 </object>
  334.               </object>
  335.             </object>
  336.           </object>
  337.           <object class="notebookpage">
  338.             <label>Escape</label>
  339.             <selected>0</selected>
  340.             <object class="wxPanel" name="m_panel6">
  341.               <style>wxTAB_TRAVERSAL</style>
  342.               <object class="wxBoxSizer">
  343.                 <orient>wxVERTICAL</orient>
  344.                 <object class="sizeritem">
  345.                   <option>1</option>
  346.                   <flag>wxEXPAND</flag>
  347.                   <border>5</border>
  348.                   <object class="wxBoxSizer">
  349.                     <orient>wxHORIZONTAL</orient>
  350.                     <object class="sizeritem">
  351.                       <option>0</option>
  352.                       <flag>wxALL</flag>
  353.                       <border>5</border>
  354.                       <object class="wxStaticText" name="m_staticText321">
  355.                         <label>Escape from Mouse</label>
  356.                         <wrap>-1</wrap>
  357.                       </object>
  358.                     </object>
  359.                     <object class="spacer">
  360.                       <option>1</option>
  361.                       <flag>wxEXPAND</flag>
  362.                       <border>5</border>
  363.                       <size>0,0</size>
  364.                     </object>
  365.                     <object class="sizeritem">
  366.                       <option>0</option>
  367.                       <flag></flag>
  368.                       <border>5</border>
  369.                       <object class="wxBoxSizer">
  370.                         <orient>wxVERTICAL</orient>
  371.                         <object class="sizeritem">
  372.                           <option>1</option>
  373.                           <flag>wxEXPAND</flag>
  374.                           <border>5</border>
  375.                           <object class="wxBoxSizer">
  376.                             <orient>wxHORIZONTAL</orient>
  377.                             <object class="sizeritem">
  378.                               <option>0</option>
  379.                               <flag>wxALL</flag>
  380.                               <border>5</border>
  381.                               <object class="wxStaticText" name="m_staticText122">
  382.                                 <label>x</label>
  383.                                 <wrap>-1</wrap>
  384.                               </object>
  385.                             </object>
  386.                             <object class="sizeritem">
  387.                               <option>0</option>
  388.                               <flag>wxALL</flag>
  389.                               <border>5</border>
  390.                               <object class="wxSpinCtrl" name="escape_x">
  391.                                 <style>wxSP_ARROW_KEYS</style>
  392.                                 <value>50</value>
  393.                                 <min>1</min>
  394.                                 <max>99</max>
  395.                               </object>
  396.                             </object>
  397.                           </object>
  398.                         </object>
  399.                         <object class="sizeritem">
  400.                           <option>1</option>
  401.                           <flag>wxEXPAND</flag>
  402.                           <border>5</border>
  403.                           <object class="wxBoxSizer">
  404.                             <orient>wxHORIZONTAL</orient>
  405.                             <object class="sizeritem">
  406.                               <option>0</option>
  407.                               <flag>wxALL</flag>
  408.                               <border>5</border>
  409.                               <object class="wxStaticText" name="m_staticText1211">
  410.                                 <label>y</label>
  411.                                 <wrap>-1</wrap>
  412.                               </object>
  413.                             </object>
  414.                             <object class="sizeritem">
  415.                               <option>0</option>
  416.                               <flag>wxALL</flag>
  417.                               <border>5</border>
  418.                               <object class="wxSpinCtrl" name="escape_y">
  419.                                 <style>wxSP_ARROW_KEYS</style>
  420.                                 <value>50</value>
  421.                                 <min>1</min>
  422.                                 <max>99</max>
  423.                               </object>
  424.                             </object>
  425.                           </object>
  426.                         </object>
  427.                       </object>
  428.                     </object>
  429.                   </object>
  430.                 </object>
  431.               </object>
  432.             </object>
  433.           </object>
  434.         </object>
  435.       </object>
  436.       <object class="sizeritem">
  437.         <option>0</option>
  438.         <flag>wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT</flag>
  439.         <border>2</border>
  440.         <object class="wxStdDialogButtonSizer">
  441.           <object class="button">
  442.             <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag>
  443.             <border>5</border>
  444.             <object class="wxButton" name="wxID_OK">
  445.               <label>&amp;OK</label>
  446.             </object>
  447.           </object>
  448.           <object class="button">
  449.             <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag>
  450.             <border>5</border>
  451.             <object class="wxButton" name="wxID_APPLY">
  452.               <label>&amp;Apply</label>
  453.             </object>
  454.           </object>
  455.           <object class="button">
  456.             <flag>wxALIGN_CENTER_HORIZONTAL|wxALL</flag>
  457.             <border>5</border>
  458.             <object class="wxButton" name="wxID_CANCEL">
  459.               <label>&amp;Cancel</label>
  460.             </object>
  461.           </object>
  462.         </object>
  463.       </object>
  464.     </object>
  465.   </object>
  466. </resource>
  467.  

|

« 時計をつくる8 | トップページ | Twitterクライアントをつくる1 »

時計をつくる」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1201593/37132280

この記事へのトラックバック一覧です: 時計をつくる9:

« 時計をつくる8 | トップページ | Twitterクライアントをつくる1 »