C++/VS2008を使用してXP用のカスタムファイル保存ダイアログを作成しようとしています。私のダイアログには3つのドロップダウンと1つの編集ボックスがあります。ドロップダウンの内容は、他のドロップダウンで選択が行われたときに動的に更新する必要があります。したがって、私はCBN_事件を捕らえる必要があります。CFileDialogを拡張するときにON_CBN_SELCHANGEと他のドロップダウンイベントをキャッチ
私は、CFileDialogを拡張するクラスとCComboBoxを拡張するクラスを作成しました。表示するカスタムダイアログ(コンボで)を取得できますが、CBN_イベントをトラップすることはできません。
VS 'Create MFC DLL'ウィザードを使用して、appクラスとカスタムファイル保存ダイアログクラスの2つのクラスを取得しました。メッセージ/イベントトラップコードを追加できるように、派生したCComboBoxクラスを作成しました。ダイアログ・クラスのメッセージ・マップ、DoDataExchangeおよびイベント・トラッピング・コードを入れました。
以下のコードは、私が作業しているものの要約版です。 1つのドロップダウンリストでも作業ができないときに、3つのドロップダウンを作成する必要はありません。エディットボックスのコードも入れていませんでした。私はそれに問題がないからです。
いくつかのコード:アプリクラスから - にDoModalを呼び出して、カスタムダイアログのインスタンスを作成:ここで
BOOL CSaveAsApp::InitInstance()
{
CWinApp::InitInstance();
// Parse the command line to get the defaultExtension and the file filter
CString cmdLineAsString = CString(theApp.m_lpCmdLine);
int curPos = 0 ;
CString fileExtension = cmdLineAsString.Tokenize(" ", curPos) ;
CString fileFilter = cmdLineAsString.Tokenize(" ", curPos) ; ;
MyFileDialog dlg(FALSE, fileExtension.GetBuffer(), "Enter File Name Here",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
fileFilter.GetBuffer(), m_pMainWnd) ;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
...
}
else if (nResponse == IDCANCEL)
...
return FALSE;
}
は保存ダイアログカスタムファイルからいくつかのコードは次のとおりです。
IMPLEMENT_DYNAMIC(MyFileDialog, CFileDialog)
// LJM Put in last two parms: DWORD dwSize, BOOL bVistaStyle (0, 0)
// bVistaStyle = 0 ==> XP-Style dialog
MyFileDialog::MyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt,
LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter,
CWnd* pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags,
lpszFilter, pParentWnd, 0, 0)
{ }
MyFileDialog::~MyFileDialog() { }
void MyFileDialog::DoDataExchange(CDataExchange* pDX)
{
CFileDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(MyFileDialog)
//DDX_Control(pDX, IDC_CONTEXT_COMBO, m_ComboContext);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(MyFileDialog, CFileDialog)
ON_CBN_SELCHANGE(IDC_CONTEXT_COMBO, &MyFileDialog::OnCbnSelchangeUniqueNumber)
ON_CBN_SELENDOK(IDC_CONTEXT_COMBO, &MyFileDialog::OnCbnSelchangeUniqueNumber)
END_MESSAGE_MAP()
BOOL MyFileDialog::OnInitDialog()
{
CFileDialog::OnInitDialog();
//AfxEnableControlContainer();
const UINT iExtraSize = 300;
// Get a pointer to the original dialog box.
CWnd *wndDlg = GetParent();
RECT Rect;
wndDlg->GetWindowRect(&Rect);
// Change the size of FileOpen dialog
wndDlg->SetWindowPos(NULL, 0, 0,
Rect.right - Rect.left,
Rect.bottom - Rect.top + iExtraSize,
SWP_NOMOVE);
CWnd *wndComboCtrl = wndDlg->GetDlgItem(cmb1);
wndComboCtrl->GetWindowRect(&Rect);
wndDlg->ScreenToClient(&Rect); // Remember it is child controls
Rect.top += 60;
Rect.bottom += 120;
Rect.left += 50;
m_ComboContext.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP, Rect, wndDlg, IDC_CONTEXT_COMBO);
m_ComboContext.SetFont(wndComboCtrl->GetFont(), TRUE);
m_ComboContext.AddString(_T("Lou1"));
m_ComboContext.AddString(_T("L432"));
m_ComboContext.AddString(_T("Lou2"));
m_ComboContext.AddString(_T("Lou3"));
return true ;
}
void MyFileDialog::OnCbnSelchangeUniqueNumber()
{
AfxMessageBox(_T("OnCbnSelchangeUniqueNumber"), 0, 0) ;
}
そして、ここですCComboBoxの派生クラス:
IMPLEMENT_DYNAMIC(LouComboBox, CComboBox)
LouComboBox::LouComboBox() { }
LouComboBox::~LouComboBox() { }
BEGIN_MESSAGE_MAP(LouComboBox, CComboBox)
ON_CONTROL_REFLECT(CBN_SELCHANGE, &LouComboBox::OnCbnSelchange)
ON_CONTROL_REFLECT(CBN_KILLFOCUS, &LouComboBox::OnCbnKillfocus)
ON_CONTROL_REFLECT(CBN_SELENDCANCEL, &LouComboBox::OnCbnSelendcancel)
ON_CBN_SELCHANGE(IDC_CONTEXT_COMBO, &LouComboBox::OnCbnSelchangeUniqueNumber)
END_MESSAGE_MAP()
void LouComboBox::OnCbnSelchange()
{
// TODO: Add your control notification handler code here
AfxMessageBox(_T("Menu selected"), 0, 0) ;
}
void LouComboBox::OnCbnKillfocus()
{
// TODO: Add your control notification handler code here
AfxMessageBox(_T("Lost focus"), 0, 0) ;
}
void LouComboBox::OnCbnSelendcancel()
{
AfxMessageBox(_T("OnCbnSelendcancel"), 0, 0) ;
}
void LouComboBox::OnCbnSelchangeUniqueNumber()
{
// TODO: Add your control notification handler code here
AfxMessageBox(_T("OnCbnSelchangeUniqueNumber"), 0, 0) ;
}
私はダイアログクラスに彼はmessagemap/DoDataExchange、ComboBoxクラスはそれらを持っています、両方のクラスはそれらを持っています..
私はCComboBoxでいくつかのイベントを捕まえることができます。私は、ON_NOTIFY、ON_WM_DESTROYに応答するダイアログを得ることができ、エディットボックスはON_WM_KILLFOCUSに応答します。
私はこれが額にうんざりだと思っています。私はこれに近すぎて、明らかに見えません。
助け、援助、指示をいただければ幸いです。
私はCFileDialogをサブクラス化できるように、これをMFC DLLとして作成したことを述べる必要があります。私は、アプリケーションを作成しようとすると、私はCFileDialogをサブクラス化できませんでした。その後、VS2008リンカーオプションを変更して実行可能ファイルを作成しました。それは実行されますが、私はドロップダウンイベントをトラップすることはできません。 – Lou