我有一个带有名为_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}}。当循环的线程进入此功能并且主窗口正在调整大小时,它会冻结。有没有办法避免这个问题。
答案 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