3

イベントが呼び出されたときに に設定され、関数が呼び出されたときに に_isResized設定される というブール値プロパティを持つ .NET フォームがあります。trueSizeChangedfalsebool 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()すべてのフレームを呼び出すメイン ループを使用します。ループのスレッドがこの関数に入り、メイン ウィンドウのサイズが変更されると、フリーズします。この問題を回避する方法はありますか。

4

1 に答える 1

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.

ありがとうハンス・パッサント

于 2013-04-09T17:51:49.670 に答える