0

使用 wxperl 我想在将文件拖到我的窗口后启动一个持久的功能。这是我的 DropTarget 代码:

package FilesDropTarget;

use strict;
use Wx qw[:allclasses];
use base qw(Wx::FileDropTarget);

sub new {
  my $class = shift;
  my $caller = shift;
  my $fref = shift;
  my $this = $class->SUPER::new( @_ );
  $this->{caller} = $caller;
  $this->{fref} = $fref;
  return $this;
}

sub OnDropFiles {
  my( $this, $x, $y, $files ) = @_;

  &{$this->{fref}}($this->{caller},@$files);

  return 1;
}

该模块通过

$frame->{TextControl}->SetDropTarget( FilesDropTarget->new($frame,\&runner) );

(OnDropFiles 调用函数 &runner() 并将删除的文件作为参数。)一切都很好,除了 Windows 上的拖动源窗口在函数 &runner() 工作时被阻止,这可能是一个长期的操作。拖动源窗口在返回 1 后再次可用OnDropFiles,因此在 &runner() 准备好之后。

是否有机会在 &runner() 完成之前解除对拖动源的阻塞?

4

1 回答 1

-1

不要立即调用该函数,而是将其推迟到下一次事件循环迭代。如果 3.x CallAfter()被 wxPerl 包裹,你应该使用它。如果没有,请使用通常的wxEVT_IDLE技巧手动模拟它:让该事件的处理程序检查标志并在设置(并重置它)时调用您的函数,然后在您的OnDropFiles().

于 2014-03-12T12:57:07.710 回答