2016-11-01 13 views
0

MFCからwxWidgetsにいくつかのレガシーコードを変換しています。 私が変換しようとしているメニューシステムは、ダイアログを作成するための静的ファクトリメソッドを使用し、ポインタを削除して他のクリーンアップを実行するpostNcDestroyを使用します。wxWidgets PostNcDestroy相当の

wxWidgetsでこのクリーンアップを行う最良の方法は何ですか?

は、クラス定義は実装が、私はあなたがm_bOpen変数を必要とする理由はよく分からない

void CCustomDlg::Showdlg(CCustomDlg* pParent) 
{ 
    m_bOpen = true; 
... 
    CCustomDlg*pDlg = new CCustomDlg(pParent); 
    pDlg->Create(pParent); 
    pDlg->ShowWindow(SW_SHOW); 
} 
+0

'postNcDestroy'を意味しますか? –

+0

@RichardCrittenはい申し訳ありません – jhbh

+0

@jhbh、あなたはそのメッセージハンドラで使用するいくつかのコードを投稿できますか?そうすれば、提案をする方が簡単になります。また、PostNcDestroyメッセージはwxWidgetsによって処理されます。 – Igor

答えて

2

ある

//some static vars 
static bool m_bOpen; 
... 

//factory method 
static void Showdlg(CCustomDlg* pParent); 
virtual void PostNcDestroy() { m_bOpen = false; ... delete this; } 

を加えたCDialogExかなり標準ですが、私はあなたが持っていると仮定します理由。おおよそ同等のwxWidgetsのものは、次のようなものになります。宣言:

class CCustomDlg : public wxDialog 
{ 
    private: 
     static bool m_bOpen; 

    public: 
     CCustomDlg(wxWindow* parent, 
      wxWindowID id = wxID_ANY, 
      const wxString& title = wxEmptyString, 
      const wxPoint& pos = wxDefaultPosition, 
      const wxSize& size = wxDefaultSize, 
      long style = wxDEFAULT_DIALOG_STYLE); 
     ~CCustomDlg(); 
}; 

実装:

bool CCustomDlg::m_bOpen=false; 

CCustomDlg::CCustomDlg(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxDialog(parent, id, title, pos, size, style) 
{ 
    m_bOpen=true; 
... 
} 

CCustomDlg::~CCustomDlg() 
{ 
    m_bOpen=false; 
} 

次のように、そして(このコードを仮定して、メインアプリケーションフォームのコードから呼び出されている)、ダイアログのモーダルバージョンを作成することができます

CCustomDlg dlg(this); 
dlg.ShowModal(); 

dlgオブジェクトが有効範囲外になると、wxWidgetsはダイアログのクリーンアップをすべて処理します。 ShowModal()の戻り値をチェックして、OKボタンが押されたときにwxID_OK、キャンセルボタンが押されたときにwxID_CANCEL、コードでEndModal()の呼び出しを自分自身に与える他の値を確認することもできます。 CCustomDlg。

非モーダルバージョンのダイアログを希望する場合は、少し面倒です。その場合は、newを使用してダイアログへのポインタを作成し、ShowModal()の代わりにShow()を呼び出し、ダイアログが不要になったときに適切な時刻にDestroy()を呼び出す必要があります。詳細については、this pageの「Modal and Modeless」セクションを参照してください。

+0

(s)彼はダイアログが開いているかどうかを示す変数を使用しています。それはそれが何であるかということです。 – Igor

+0

さて、私は今それを得る。おそらく最も簡単なことは、可能であればモーダルバージョンを使用することでしょう。非モーダルでなければならない場合は、メインフレームのコンストラクタにインスタンスを作成し、メインフレームの実行中に必要に応じてShow()を呼び出し、メインフレームのデストラクタでDestroy()を呼び出します。その場合、IsShown()メソッドはおそらく、静的なm_bOpen変数の代わりになります。しかし、ダイアログが時々だけ存在するようにしたいのなら、私が言及したように物事はより厄介なものになります。 –