MFC - ダイアログが表示された直後にコードを実行します (Form.Shown と同等の .NET)

StackOverflow https://stackoverflow.com/questions/269462

  •  06-07-2019
  •  | 
  •  

質問

C++ MFC プロジェクトにいくつかの小さな変更を加えています。私は .NET 開発者なので、Windows プログラミングは初めてです。

CDialog が初めて完全に表示 (ペイント) された直後に、何らかのメソッドを起動する必要がありますが、これは 1 回だけです。

これどうやってするの?.NETでは私は扱います フォーム.表示 イベント。

何らかのメッセージを処理する必要がありますか?どれの?CDialog メソッドをオーバーライドする必要がありますか?それとも簡単な方法はないのでしょうか?WM_ACTIVATE を処理してから、フラグを使用して別のメソッドを 1 回だけ呼び出すことを考えています。

役に立ちましたか?

解決

ここで答えが見つかりました: ダイアログボックスが表示されるまで待ってから何かを実行する

Short story:
INT_PTR CALLBACK
DlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uiMsg) {

  case WM_INITDIALOG:
    return TRUE;

  case WM_WINDOWPOSCHANGED:
    if ((((WINDOWPOS*)lParam)->flags & SWP_SHOWWINDOW) &&
        !g_fShown) {
      g_fShown = TRUE;
      PostMessage(hwnd, WM_APP, 0, 0);
    }
    break;


  case WM_APP:
      MessageBox(hwnd,
                 IsWindowVisible(hwnd) ? TEXT("Visible")
                                       : TEXT("Not Visible"),
                 TEXT("Title"), MB_OK);
      break;

  case WM_CLOSE:
   EndDialog(hwnd, 0);
   break;
  }

  return FALSE;
}

私と同じように MFC を使用している場合は、WM_WINDOWPOSCHANGED をマップしてから、ON_MESSAGE を使用して WM_APP をマップする必要があります。見る このコードプロジェクトの記事 詳細については。

他のヒント

私が何度も使用して成功した別のアプローチは、タイマーを使用することです。 10m0sに設定します。ダイアログが表示された後にのみ起動します。

地獄はOnPaint()にコードを入れて、クラスでbool m_fullyInitilizedを実行します。 私もタイマーが好きです。また、これらの場合、すべての初期化コードをoninitから移動します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top