【问题标题】:How to let a DigitalMicrograph script object be notified when an image is closed如何在关闭图像时通知 DigitalMicrograph 脚本对象
【发布时间】:2015-01-03 00:32:55
【问题描述】:

我们可以通过 ImageAddEventListener() 和 ImageDisplayAddEventListener() 将 DM 脚本对象附加到图像事件和 imageDisplay 事件。是否有支持“图像关闭”事件的事件映射消息?我尝试了“image_about_to_close”和“imagedisplay_about_to_close”,但它们似乎不起作用。

【问题讨论】:

    标签: dm-script


    【解决方案1】:

    DigitalMicrograph 区分 Images(数据对象)、ImageDisplays(呈现数据的对象)、ImageDocuments(表示的对象由保存的文件)和 DocumentWindows(显示 ImageDisplay 的窗口对象)。

    您要求的事件属于DocumentWindows,而不属于Images 或ImageDisplays。因此,您需要使用 DocumentWindow 对象注册它。这是通过命令WindowAddWindowListener 完成的。

    顺便说一句,您可以捕获两个类似的事件,一个是window_closed,另一个是window_about_to_close。后者在 before 提示用户保存未保存的数据时触发,另一个 after 这样的提示但 - 不一致 - before 窗口是实际从内存中删除。 (当时还有一个指向它的指针。)

    以下脚本附加了这两个事件。我已将其放入后台线程以便于测试。

    // $BACKGROUND$
    Class MyWindowListenerClass
    {
        MyWindowListenerClass( object self )    Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" created.")
        ~MyWindowListenerClass( object self )   Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" destroyed.")
    
        Void HandleAboutToClosedAction( object self, number e_fl, DocumentWindow Win )
        {
            Result(GetTime(1)+": Window about-to-closed message : 0x" + Hex(e_fl,8) + "\n" )
        }
    
        Void HandleClosedAction(object self, number e_fl, DocumentWindow Win)
        {
            Result(GetTime(1)+": Window closed message : 0x" + Hex(e_fl,8) + "\n" )
        }
    }
    
    
    Void main()
    {
        Object          objListener
        Image           img
        DocumentWindow  win
        String          messagemap
        Number          ListenerID
    
        img:=RealImage("Test",4,100,100)
        img.ShowImage()
        win = img.imageGetOrCreateImageDocument().ImageDocumentGetWindow()
        messagemap      += "window_closed:HandleClosedAction;"
        messagemap      += "window_about_to_close:HandleAboutToClosedAction;"
    
        objListener = Alloc(MyWindowListenerClass)
        ListenerID  = win.WindowAddWindowListener( objListener, messagemap)
    
        While(!ShiftDown()) 1==2
        win.WindowRemoveWindowListener(ListenerID)
    }
    
    main()
    

    最后一点:关闭 DocumentWindow 并不一定意味着您也释放了 图像。只要某些脚本或其他代码保留对 Image 的引用,它就会保留在内存中!确保不要这样做,否则您可能会在脚本中看到内存泄漏。在这种情况下,通常将 ImageID 作为成员变量“存储”为成员变量而不是图像对象,因为它们不会“锁定”图像。

    【讨论】:

    • 谢谢。过去,我们可以通过 ImageDisplayAddKeyListener() 将键侦听器添加到 ImageDisplay,所以我假设 ImageDisplay 在对象中被“显示”。一个后续问题,我们如何捕捉 3D 图像的“切片更改”(即显示的图层更改)事件? ImageAddEventListener() 的消息映射“slice_changed:”曾经在 GMS 1.8 中工作,但现在在 GMS 2.3 中不再工作。
    • 是的,发生了变化。该事件现在带有图像显示并且事件消息是“slice_property_changed”。 [此处的书](dmscript.tavernmaker.de/) 在教程如何在 3D 图像中显示特定于图层的 ROI 中有一个示例。如果您需要更多帮助。请作为单独的问题发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2019-12-08
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多