У меня есть форма .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
устанавливается истина, как только изменяется размер формы, но по какой-то причине нить основного цикла замирает каждый раз, когда класс окна использует функцию bool isResized()
, пока пользователь не освободит край формы и, таким образом, изменение размера закончится.
Невозможно получить доступ к значениям формы .NET при условии изменения размера. Есть ли альтернатива?
Благодаря
EDIT
Я использую основной цикл, который вызывает System::Windows::Forms::Application::DoEvents()
каждый кадр. Когда поток цикла входит в эту функцию, а главное окно изменяет размер, оно зависает. Есть ли способ избежать этой проблемы.
Если вы добавили код, это поможет нам лучше понять ваш вопрос. –
DoEvents снова наносит удар. Windows запускает модальный цикл сообщений, когда пользователь начинает перетаскивать край окна. Это означает, что цикл DoEvents больше не работает. Вместо этого используйте таймер, SetTimer с интервалом 15 или 31 мс примерно равен. Конечно, ваш код отвечает на событие Resize, конечно, очень предпочтительно. –
@ HansPassant Спасибо. Если вы включите его в ответ, я буду отмечать его как правильный ответ. – JMRC