Внедрение стандартного диалога
От: Lakmus  
Дата: 02.08.02 20:42
Оценка:
Доброго времени суток!
У меня такой вопрос: как внедрить в свою диалог-форму стандартный диалог(например CFileDialog)?
Re: Внедрение стандартного диалога
От: CooLer Россия http://bestsoft.far.ru
Дата: 04.08.02 18:15
Оценка: 31 (4)
Здравствуйте 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();
    }
}


ЗЫ: Это кусок прямо из реального приложения, поэтому не может иметь какие-нибудь особенности. Если что не стыкуется — сообщи, помогу.
"Выше голову" — сказл палач, надевая петлю
Re: Внедрение стандартного диалога
От: PSP Беларусь  
Дата: 05.08.02 06:40
Оценка:
Здравствуйте Lakmus, Вы писали:

L>Доброго времени суток!

L>У меня такой вопрос: как внедрить в свою диалог-форму стандартный диалог(например CFileDialog)?

Статьи в MFC -- пол поиску найдёшь:

Directory Picker Sample Using Modified CFileDialog
How to Show a Custom Common Dialog using CFileDialog
HOWTO: OfnKing Demonstrates CFileDialog Customization
Figure 3 Common Dialog Messages and Notifications
HOWTO: Enhance File Open Dialog with Multiple Extension Filters
HOWTO: Change the Background Color of a Common Dialog

Q I'm using the Windows 95 File Open and File Save common dialogs in my program, but since I'm using them for things other than opening and saving files (like creating, compacting, and repairing a database), I would like to replace the caption of the IDOK button. First I tried to use templates, but for some reason I couldn't manage to do it; my program kept crashing. So I thought I could get a CMyFileDialog class and use OnInitialUpdate to get the IDOK button and replace its caption. But whenever I try to get the button, MFC returns NULL. This is the last pesky detail left on a huge six-month project. What should I do?
Всегда Ваш, PSP.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.