2013-04-08 5 views
3

У меня есть форма .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() каждый кадр. Когда поток цикла входит в эту функцию, а главное окно изменяет размер, оно зависает. Есть ли способ избежать этой проблемы.

+0

Если вы добавили код, это поможет нам лучше понять ваш вопрос. –

+4

DoEvents снова наносит удар. Windows запускает модальный цикл сообщений, когда пользователь начинает перетаскивать край окна. Это означает, что цикл DoEvents больше не работает. Вместо этого используйте таймер, SetTimer с интервалом 15 или 31 мс примерно равен. Конечно, ваш код отвечает на событие Resize, конечно, очень предпочтительно. –

+0

@ HansPassant Спасибо. Если вы включите его в ответ, я буду отмечать его как правильный ответ. – JMRC

ответ

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

Смежные вопросы