0

デスクトップの異なる位置に画像を複数回表示しようとしていますが、どうすればよいかわかりません。今、私は Wxruby を試していますが、それを行う別の方法がないかどうか疑問に思っています。

これまでのところ、サンプルの 1 つから wxruby を使用して 1 つの画像を 1 つの位置に表示することができます。

require 'wx'
include Wx

class Warning < Wx::App
  include Wx
  def on_init(x = 300, y = 300)
    @frame = Frame.new( nil, -1, "Application", Point.new(x,y), Size.new(50,50), FRAME_SHAPED|SIMPLE_BORDER|FRAME_NO_TASKBAR|STAY_ON_TOP)
    @frame.show
    @has_shape = false
    @delta = [0,0]

    evt_paint {on_paint}

    shape = File.join( 'pathToImage' )
    @bmp = Bitmap.new( Image.new(shape) )
    @frame.set_client_size(@bmp.width, @bmp.height)

    if PLATFORM == 'WXGTK'
      # wxGTK requires that the window be created before you can
      # set its shape, so delay the call to SetWindowShape until
      # this event.
      evt_window_create { set_window_shape }
    else
      # On wxMSW and wxMac the window has already been created, so go for it.
      set_window_shape
    end

    #@frame.paint { | dc | dc.draw_bitmap(@bmp, 0, 0, true) }
  end

  def set_window_shape
    r = Region.new(@bmp)
    @has_shape = @frame.set_shape(r)
  end

  def on_paint
    @frame.paint { | dc | dc.draw_bitmap(@bmp, 0, 0, true) }
  end
end

app = Warning.new
app.main_loop
4

1 に答える 1

0

私はついにそれを理解しました!この Ruby スクリプトは、wx gem を使用して整形されたウィンドウを表示し、いくつかのウィンドウを使用して現在の画面解像度を取得します (プライマリ モニターを想定しています)。

解像度を取得してから、デスクトップ全体に表示する画像の幅/高さを取得します。画像に関する 1 つの注意点として、wx が画像を表示するとき (成形されたウィンドウ用かどうかはわかりません)、画像の黒一色の部分は表示されませんが、代わりにウィンドウの背後にあるものが表示されます。 .

これが後で誰かのトラブルを救うことを願っています。

require 'wx'
require 'dl/import'
require 'dl/struct'
include Wx

class Warning < Wx::Frame
  include Wx
    @@x = 0
    @@y = 0
  def setXY(x = 0, y = 0)
    @@x = x
    @@y = y
  end
  def initialize(parent, bmp)
    super(nil, -1, '', pos = [@@x,@@y], size = DEFAULT_SIZE, style = FRAME_SHAPED|SIMPLE_BORDER|FRAME_NO_TASKBAR|STAY_ON_TOP)
    @has_shape = false
    @delta = [0,0]
    @bmp = bmp

    evt_paint {on_paint}
    self.set_client_size(@bmp.width, @bmp.height)

    if PLATFORM == 'WXGTK'
      # wxGTK requires that the window be created before you can
      # set its shape, so delay the call to SetWindowShape until
      # this event.
      evt_window_create { set_window_shape }
    else
      # On wxMSW and wxMac the window has already been created, so go for it.
      set_window_shape
    end
    self.paint { | dc | dc.draw_bitmap(@bmp, 0, 0, true) }
  end

  def set_window_shape
    r = Region.new(@bmp)
    @has_shape = self.set_shape(r)
  end

  def on_paint
    self.paint { | dc | dc.draw_bitmap(@bmp, 0, 0, true) }
  end
end # of Warning

class WarnTest < Wx::App
  def on_init
    @frame = Frame.new()
    warnings = []
    resolution = getScreenResolution()
    shape = File.join( 'image you want' )
    @bmp = Bitmap.new( Image.new(shape) )
    imageWidth = @bmp.get_width
    imageHeight = @bmp.get_height

    imagesAcross = resolution[0] / imageWidth
    imagesDown = resolution[1] / imageHeight

    j = 0
    (1..imagesDown).each do |y|
      i = 0
      (1..imagesAcross).each do |x|
        warnings << [(imageWidth * i), (imageHeight * j)]
        i = i + 1
      end
      j = j + 1
    end

    warnings << [resolution[0], resolution[1]]

    # Create a new window for each xy in warnings array
    warnings.each do |x|
      win = Warning.new(self, @bmp)
      win.setXY(x[0], x[1])
      win.show(true)
      win.update
      sleep 0.01
    end
  end # of on_init

  def getScreenResolution
    sM_CXSCREEN =   0
    sM_CYSCREEN =   1
    user32 = DL.dlopen("user32")

    get_system_metrics = user32['GetSystemMetrics', 'ILI']
    x, tmp = get_system_metrics.call(sM_CXSCREEN,0)
    y, tmp = get_system_metrics.call(sM_CYSCREEN,0)
    res = [x, y]
    return res
  end # of getScreenResolution
end # of WarnTest

app = WarnTest.new
app.main_loop
于 2013-05-09T13:03:51.243 に答える