我有一个 .NET 表单,其中有一个名为 的布尔属性_isResized
,该属性设置为调用事件的时间,并设置为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;
}
};
我还有一个名为的原生 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()
每一帧的主循环。当循环的线程进入这个函数并且主窗口正在调整大小时,它会冻结。有没有办法避免这个问题。