在调整大小期间未调用窗体属性

form properties not called during resize

本文关键字:调用 窗体 属性 调整      更新时间:2023-10-16

我有一个. net表单,具有布尔属性_isResized,当SizeChanged事件被调用时设置为true,当bool isResized()函数被调用时设置为false

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()。当循环的线程进入这个函数并且主窗口正在调整大小时,它会冻结。有没有办法避免这个问题?

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.

感谢汉斯·帕桑特