4

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

初めて CDialog が完全に表示 (描画) された直後に、何らかのメソッドを起動する必要がありますが、一度だけです。

これどうやってするの?.NET では、Form.Shownイベントを処理します。

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

4

4 に答える 4

4

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

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をマップする必要があります。詳細については、このCodeProjectの記事を参照してください。

于 2008-11-06T18:51:19.907 に答える
0

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

于 2008-11-07T03:27:30.053 に答える
0

コードを OnPaint() に入れ、クラスに bool m_fullyInitilized を追加します。私はタイマーも好きです..私は通常100msで行きますが. また、これらのケースでは、すべての初期化コードを oninit の外に移動します。そこでの処理が多すぎるのを防ぐためです。

于 2008-11-28T22:04:21.583 に答える