イベントが呼び出されたときに に設定され、関数が呼び出されたときに に_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
また、.NET フォームのレイヤーとして機能するネイティブ C++ クラスも呼び出しています。このクラスはメイン ループのフレームごとに更新され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()
すべてのフレームを呼び出すメイン ループを使用します。ループのスレッドがこの関数に入り、メイン ウィンドウのサイズが変更されると、フリーズします。この問題を回避する方法はありますか。