0

私のアプリケーションには、標準の MFC モーダル ダイアログがあります。ユーザーがダイアログ ウィンドウの外側をクリックしたときに、そのダイアログを閉じたいと思います。その目的のためON_MESSAGE(WM_KILLFOCUS, OnKillFocus)に、ダイアログのメッセージ マップ hy を手動で入力します (クラス ウィザードにはそのオプションがありません)。

BEGIN_MESSAGE_MAP(CTestTreeCtrlDlg, CDialog)
//{{AFX_MSG_MAP(CTestTreeCtrlDlg)
   ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree)
//}}AFX_MSG_MAP
   ON_MESSAGE(WM_KILLFOCUS, OnKillFocus)
END_MESSAGE_MAP()
...
void CTestTreeCtrlDlg::OnKillFocus() 
{
  ...
}

ダイアログの外側をクリックすると、もちろん後者はフォーカスを失いますが、OnKillFocus メソッドは何らかの理由で呼び出されません。

4

2 に答える 2

1

愛国者ありがとう!

WM_ACTIVATEは次の役割を果たします。

BEGIN_MESSAGE_MAP(CTestTreeCtrlDlg, CDialog)
//{{AFX_MSG_MAP(CTestTreeCtrlDlg)
  ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree)
//}}AFX_MSG_MAP
  ON_WM_ACTIVATE()
END_MESSAGE_MAP()
...
void CTestTreeCtrlDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
  CDialog::OnActivate(nState, pWndOther, bMinimized);

  if (nState == WA_INACTIVE)
    OnOK() ;
}
于 2013-02-19T13:58:56.610 に答える
0

クイック検索 -> http://www.itlisting.org/5-windows/964b01901673b4b0.aspx これを行う方が良い方法だと確信しています。

于 2013-02-18T12:30:14.860 に答える