0

'カスケードで表示される一連のモードレスダイアログウィンドウを作成するアプリがあります。ユーザーは、任意のウィンドウをクリックして上部に表示し、操作できるようになっています。

これがスクリーンショットで、これが意図したとおりに機能していることを示しています。ユーザーは下から3番目のウィンドウをクリックし、上に移動しました。

ここに画像の説明を入力してください

ユーザーがこれを実行し、隠されたウィンドウの1つをクリックすると、ウィンドウが一番上に表示されないことを報告します。

これは、発生している問題を示すビデオです。これは、ノートブックウィンドウの通常のカスケードを示しており、期待どおりに動作します。次に、アプリケーションウィンドウのカスケードが表示されますが、ユーザーは選択したウィンドウを一番上に表示できません。選択したウィンドウの外観が変わり、選択されたことを示しますが、表示されないままになります。(ビデオは、関連する問題を示すことで終了しますが、今のところ無視することができます)

ユーザーは、この問題が自分が試した他のPCで発生したと報告しています。問題を再現できません。

私は完全に困惑していて、これを引き起こしている可能性があるものを推測することさえできません。

(私が持っていた理論の1つは、アプリがフリーズし、ペイントメッセージに応答しなくなったというものでした。ただし、ビデオでは、ユーザーが隠されたウィンドウをカスケードからドラッグすると、ウィンドウが正常にペイントされます。ウィンドウが選択されている場合、アプリはペイントメッセージを受け取らないか、無視します)

アプリはC++とwxWidgets2.9.4を使用して作成されており、Windows7で実行されます。

これはwxWidgets2.9の問題のようです。v2.8.12ライブラリを使用してビルドすると、ユーザーは正常に動作することを報告します。

これがウィンドウを作成するためのコードです。親がNULLであることに注意してください。(これにより、カスケードウィンドウを最小化せずにメインアプリケーションウィンドウを最小化できます。これは必須の機能です。)

cNewDataPopup::cNewDataPopup(  cPatDataset& data )
    : wxDialog(NULL,-1,L"New data",wxPoint(200,200),wxSize(570,242),
        wxDEFAULT_DIALOG_STYLE|wxSTAY_ON_TOP )
    , myData( data )
{
4

2 に答える 2

1

いくつかの実験の結果、wxSTAY_ON_TOPにwxDIALOG_NO_PARENTを追加すると問題が解決することがわかりました。

(以下の説明はVZによるものです。)

どうやら、ウィンドウの親をNULLとして指定するだけでは、wxWidgetsに親が必要ないことを納得させるのに十分ではありません。それは先に進み、とにかく、多かれ少なかれランダムに親を割り当てます。これが、奇妙で予期せぬ再現不可能な動作が観察される理由です。親を割り当てるためのアルゴリズムはv2.9.xで変更されました。そのため、wxWidgetsをアップグレードすると、奇妙で​​予期しない動作が変化します。はい、実際にはウィンドウの親が必要ないことをwxWidgetsに納得させるには、NULLの親とwxDIALOG_NO_PARENTスタイルの両方を指定する必要があります。

于 2012-08-20T20:49:43.553 に答える
0

の使用wxSTAY_ON_TOPはほぼ間違いなく原因です。ウィンドウを親ウィンドウの上に配置するだけでよい場合は、このスタイルを使用しないでください。親フレームでオーバーライドすることにより、処理を使用wxFRAME_TOOL_WINDOWまたはオーバーライドします。WM_SIZEMSWWindowProc()

于 2012-08-19T16:11:12.400 に答える