我有一个.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;
}
};
我还有一个称为window
的本地C++类,它作为.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()
。当循环线程进入此函数并且主窗口正在调整大小时,它会冻结。是否有办法避免这个问题?