Здравствуйте Lakmus, Вы писали:
L>Доброго времени суток!
L>У меня такой вопрос: как внедрить в свою диалог-форму стандартный диалог(например CFileDialog)?
Ну для разных диалогов, насколько я знаю, разные подходы. А для CFileDialog есть свой подход. Вот, для примера, код, который встраивает в CFileDialog превьюшное окно.
Сначала "вырезка" из ресурсов:
IDD_PREFIEW_FILE_DIALOG DIALOG DISCARDABLE 0, 0, 406, 144
STYLE WS_CHILD | WS_CLIPSIBLINGS
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "",1119,0,0,290,144,NOT WS_VISIBLE
CONTROL "",IDC_PREVIEW_RECT,"Static",SS_BLACKFRAME,300,10,100,70
CONTROL "Preview",IDC_PREVIEW,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,300,85,41,10
END
Теперь к этому надо приляпать такой класс:
h:
#if !defined(AFX_PREVIEWFILEDIALOG_H__B7397C89_7459_417F_B8D3_4C24AC246490__INCLUDED_)
#define AFX_PREVIEWFILEDIALOG_H__B7397C89_7459_417F_B8D3_4C24AC246490__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// PreviewFileDialog.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CPreviewFileDialog dialog
class CPreviewFileDialog : public CFileDialog
{
DECLARE_DYNAMIC(CPreviewFileDialog)
public:
CPreviewFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
~CPreviewFileDialog();
void OnFileNameChange();
// Dialog Data
CxImage *m_previewImg;
//{{AFX_DATA(CPreviewFileDialog)
enum { IDD = IDD_PREFIEW_FILE_DIALOG };
CButton m_Preview;
CStatic m_PreviewRect;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPreviewFileDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
protected:
//{{AFX_MSG(CPreviewFileDialog)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnPreview();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_PREVIEWFILEDIALOG_H__B7397C89_7459_417F_B8D3_4C24AC246490__INCLUDED_)
cpp:
// PreviewFileDialog.cpp : implementation file
//
#include "stdafx.h"
#include "PreviewFileDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPreviewFileDialog
IMPLEMENT_DYNAMIC(CPreviewFileDialog, CFileDialog)
CString title;
CPreviewFileDialog::CPreviewFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_PREFIEW_FILE_DIALOG);
m_ofn.lpstrTitle = "Title";
m_previewImg = 0;
}
BEGIN_MESSAGE_MAP(CPreviewFileDialog, CFileDialog)
//{{AFX_MSG_MAP(CPreviewFileDialog)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_PREVIEW, OnPreview)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CPreviewFileDialog::~CPreviewFileDialog()
{
if (m_previewImg) delete m_previewImg;
}
void CPreviewFileDialog::DoDataExchange(CDataExchange* pDX)
{
CFileDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPreviewFileDialog)
DDX_Control(pDX, IDC_PREVIEW, m_Preview);
DDX_Control(pDX, IDC_PREVIEW_RECT, m_PreviewRect);
//}}AFX_DATA_MAP
}
BOOL CPreviewFileDialog::OnInitDialog()
{
CFileDialog::OnInitDialog();
m_Preview.SetCheck(AfxGetApp()->GetProfileInt("Settings","FileDialogPreview",1));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPreviewFileDialog::OnFileNameChange()
{
if (m_Preview.GetCheck())
{
CString s;
GetParent()->GetDlgItem(0x480)->GetWindowText(s);
if (s.GetLength() > 0)
{
if (s[0] == '"') s = s.Mid(1,s.Find('"',1) - 1);
CString path = GetPathName();
path = path.Left(path.ReverseFind('\\') + 1);
if (m_previewImg) delete m_previewImg;
m_previewImg = new CxImage;
if (!m_previewImg->ReadFile(path + s,GetCxImageFormat(s)))
{
delete m_previewImg;
m_previewImg = 0;
}
Invalidate();
}
}
}
void CPreviewFileDialog::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (m_previewImg)
{
CRect prevRect;
m_PreviewRect.GetWindowRect(&prevRect);
ScreenToClient(&prevRect);
CSize size = GetNewImageSize(CSize(m_previewImg->GetWidth(),
m_previewImg->GetHeight()),prevRect.Size());
m_previewImg->Stretch(dc,prevRect.left + (prevRect.Width() - size.cx) / 2,
prevRect.top + (prevRect.Height() - size.cy) / 2,size.cx,size.cy);
}
}
void CPreviewFileDialog::OnPreview()
{
int check = m_Preview.GetCheck();
AfxGetApp()->WriteProfileInt("Settings","FileDialogPreview",check);
if (!check)
{
if (m_previewImg) delete m_previewImg;
m_previewImg = 0;
Invalidate();
}
else
{
OnFileNameChange();
}
}
ЗЫ: Это кусок прямо из реального приложения, поэтому не может иметь какие-нибудь особенности. Если что не стыкуется — сообщи, помогу.