在调整大小期间未调用的表单属性

时间:2013-04-08 13:24:10

标签: c++ .net c++-cli

我有一个带有名为_isResized的布尔属性的.NET表单,调用true事件时设置为SizeChanged,当false事件设置为bool 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; } }; 函数。

window

我还有一个名为bool isResized()的本机C ++类,它充当.NET表单的一个层。此类在主循环的每一帧都会更新,并使用表单的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的委托,因此只要表单大小发生更改,bool isResized()就会设置为true,但由于某种原因,主循环的线程会冻结只要窗口类使用System::Windows::Forms::Application::DoEvents()函数,直到用户释放窗体的边缘,从而调整大小完成。

只要调整其大小,就无法访​​问.NET表单值。还有其他选择吗?

由于

修改

我使用一个主循环,每个帧调用{{1}}。当循环的线程进入此功能并且主窗口正在调整大小时,它会冻结。有没有办法避免这个问题。

1 个答案:

答案 0 :(得分: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.

感谢Hans Passant