ラベル MFC の投稿を表示しています。 すべての投稿を表示
ラベル MFC の投稿を表示しています。 すべての投稿を表示

2007年2月23日金曜日

templateクラスでMFCのメッセージ処理

templateクラスでMFCのメッセージハンドラを使おうと思ったんですが、肝心のBEGIN_MESSAGE_MAPが書けない!

と思って調べてみたら色々出てきました。

MSDNのもヒットして、ちゃんとMSDNにも載ってるんだなーと思って読んでいたら、
VC8でちゃっかりBEGIN_TEMPLATE_MESSAGE_MAPなるマクロが追加されているではないですか!
やるなぁ。ありがたく使わせて頂きます。

How to: Create a Message Map for a Template Class

2006年4月13日木曜日

MFCダイアログでのON_UPDATE_COMMAND_UI

MFCのダイアログでUIコントロールをEnableにしたりDisableにしたりするのに
更新ハンドラの仕組みが使えたら便利なことがよくあります。

しかし単純に以下のように更新ハンドラを記述しても OnUpdateOKButton は呼ばれません。

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
  //{{AFX_MSG_MAP(CTestDlg)
  ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOKButton)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
  pCmdUI->Enable(条件);
}

ダイアログで更新ハンドラを使うには適切なタイミングで CWnd::UpdateDialogControls を呼んでやる必要があります。
適切なタイミングとしては WM_KICKIDLE メッセージというものがあります。WM_KICKIDLE メッセージはWindowsプライベートメッセージのため標準では使えませんが、afxpriv.h をインクルードすることで使えるようになります。
#include <afxpriv.h>

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
  //{{AFX_MSG_MAP(CTestDlg)
  ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
  ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOKButton)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

LRESULT CTestDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
// 更新ハンドラを呼び出してUIの状態を更新する
UpdateDialogControls(this, FALSE);
return FALSE;
}

void CTestDlg::OnUpdateOKButton(CCmdUI* pCmdUI)
{
  pCmdUI->Enable(条件);
}

2004年9月16日木曜日

MFCメモ

モードレスダイアログをつくるとき、newでインスタンスをつくったら
PostNcDestroyをオーバーライドしてその中でdelete thisする。
そうすると、ダイアログが閉じられたときに自動的にdeleteされる。

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP