2013-05-07 4 views
0

Я пытаюсь показать изображение несколько раз на рабочем столе в разных положениях, но я не уверен, как это сделать. Прямо сейчас я пробовал Wxruby, но мне интересно, есть ли другой способ сделать это, что мне не хватает.Показать несколько экземпляров форматированного окна/изображения на рабочем столе?

До сих пор я в состоянии отображать одно изображение на одной позиции с wxruby в значительной степени от одного из образцов:

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 

ответ

0

я, наконец, понял это! Этот скрипт ruby ​​использует жемчужину wx для отображения форменных окон и использует некоторые материалы для Windows, чтобы получить текущее разрешение экрана (я предполагаю, что на основном мониторе).

Он получает разрешение, а затем ширину/высоту изображения, которое вы хотите отображать на рабочем столе. Одна заметка на изображении, похоже, что когда 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