3

我有一个 .NET 表单,其中有一个名为 的布尔属性_isResized,该属性设置为调用事件的时间,并设置为true调用函数的时间。SizeChangedfalsebool isResized()

ref class net_window : public System::Windows::Forms::Form
{
private:
    bool _isResized;
public:
    net_window(void)
        : _isResized(false){
        InitializeComponent();
    }

    void InitializeComponent(void){
        this->SizeChanged += gcnew EventHandler(this, &net_window::eventResized);
    }

    bool isResized(void){
        bool temp = _isResized;
        _isResized = false;
        return temp;
    }

    Void eventResized(Object^ sender, EventArgs^ e){
        _isResized = true;
    }
};

我还有一个名为的原生 C++ 类window,它充当 .NET 表单周围的一层。这个类在主循环的每一帧都会更新,并使用bool isResized()表单的函数来查看大小是否发生了变化。

class Window
{
private:
    void* _net_window_handle;
    Window(){
        _net_window_handle = new gcroot<net_window^>;
        (*(gcroot<net_window^>*)_net_window_handle) = gcnew net_window;
    }
    ~Window(){
        delete _net_window_handle;
    }

    void update(void)//Called every frame.
    {
        if( (*(gcroot<net_window^>*)_element)->isResized() )
            //Do stuff.
    }
};

SizeChanged每当调整表单大小时,都会调用添加到的委托,因此_isResized一旦表单大小发生变化,就会将其设置为 true,但由于某种原因,每当窗口类使用该bool isResized()函数时,主循环的线程就会冻结,直到用户释放窗体的边缘,因此调整大小已完成。

只要调整大小,就无法访​​问 .NET 表单值。有替代方案吗?

谢谢

编辑

我使用一个调用System::Windows::Forms::Application::DoEvents()每一帧的主循环。当循环的线程进入这个函数并且主窗口正在调整大小时,它会冻结。有没有办法避免这个问题。

4

1 回答 1

1

DoEvents strikes again. Windows pumps a modal message loop when the user starts dragging a window edge. Which means that your DoEvents loop isn't running anymore. Use a timer instead, SetTimer with a 15 or 31 msec interval is about right. Having your code respond to the Resize event directly of course highly preferred.

谢谢汉斯帕桑特

于 2013-04-09T17:51:49.670 回答