Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1005
  • Last Modified:

Windows 2000 style File Dialog box

I'm just starting out with MFC and I'm wondering if there is a way to display the Win 2000 style dialog box instead of using the older style.

Here is the code I am using now:


void CSTUploadDoc::OnDataImport()
{
     TCHAR buffer[] = _T("Dat Files (*.dat)|*.dat|All Files (*.*)|*.*||");
     CFileDialog dlg(TRUE, _T("dat"), _T("*dat"), OFN_FILEMUSTEXIST, buffer);

     if (dlg.DoModal() == IDOK) {
          try {
               CStdioFile f(dlg.GetPathName(),CFile::modeReadWrite);
               LoadData(f);
          }
          catch (CFileException *e) {
               e->ReportError();
               e->Delete();
          }
     }
}




Any help would be greatly appreciated.
Thx.
0
boomshanker
Asked:
boomshanker
  • 2
  • 2
1 Solution
 
migelCommented:
Hi!
To use Win2K style dialog you have to set correct CFileDialog.m_ofn.lStructSize = sizeof(lStructSize)+3*sizeof(DWORD);
before calling DoModal;
I assume that your project doesn`t contain defines such as
_WIN32_WINNT = 0x0500;
0
 
boomshankerAuthor Commented:
Thanks for your response.

Could you possibly show me how to implement that with the code I have?

If I use the code you supplied as follows:

dlg.m_ofn.lStructSize = sizeof(lStructSize)+3*sizeof(DWORD);

I get an "lStructSize Undeclared Identifier" error upon compile.

How do I declare lStructSize?  Do I have to set any other data members of the struct?

Thank you in advance for any further help you may offer.
0
 
migelCommented:
Hi!
excuse me for this dirty CRACKed code :-)
this method can arise Access Violation  error and ugly bechavior.
Here is true code.
///BOF
// FileDialogEx.h

#pragma once

// Windows 2000 version of OPENFILENAME.
// The new version has three extra members.
// This is copied from commdlg.h
struct OPENFILENAMEEX : public OPENFILENAME {
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
};

///////////////////////////////////////////////////////////////////////////
// CFileDialogEx: Encapsulate Windows-2000 style open dialog.
class CFileDialogEx : public CFileDialog {
      DECLARE_DYNAMIC(CFileDialogEx)
public:
      CFileDialogEx(BOOL bOpenFileDialog, // TRUE for open,
                                          // FALSE for FileSaveAs
      LPCTSTR lpszDefExt = NULL,
      LPCTSTR lpszFileName = NULL,
      DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
      LPCTSTR lpszFilter = NULL,
      CWnd* pParentWnd = NULL);

   // override
   virtual int DoModal();

protected:
   OPENFILENAMEEX m_ofnEx; // new Windows 2000 version of OPENFILENAME

   virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);

   // virtual fns that handle various notifications
   virtual BOOL OnFileNameOK();
   virtual void OnInitDone();
   virtual void OnFileNameChange();
   virtual void OnFolderChange();
   virtual void OnTypeChange();

   DECLARE_MESSAGE_MAP()
   //{{AFX_MSG(CFileDialogEx)
   //}}AFX_MSG
};
//EOF

///BOF
///FileDialogEx.cpp


#include "stdafx.h"
#include <afxpriv.h>
#include "FileDialogEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

static BOOL IsWin2000();

///////////////////////////////////////////////////////////////////////////
// CFileDialogEx

IMPLEMENT_DYNAMIC(CFileDialogEx, CFileDialog)

CFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt,
   LPCTSTR lpszFileName,
   DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
   CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
      dwFlags, lpszFilter, pParentWnd)
{
}

BEGIN_MESSAGE_MAP(CFileDialogEx, CFileDialog)
   //{{AFX_MSG_MAP(CFileDialogEx)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL IsWin2000()
{
   OSVERSIONINFOEX osvi;
   BOOL bOsVersionInfoEx;

   // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
   // which is supported on Windows 2000.
   //
   // If that fails, try using the OSVERSIONINFO structure.

   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
   {
      // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.

      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
      if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
         return FALSE;
   }

   switch (osvi.dwPlatformId)
   {
      case VER_PLATFORM_WIN32_NT:

         if ( osvi.dwMajorVersion >= 5 )
            return TRUE;

         break;
   }
   return FALSE;
}

int CFileDialogEx::DoModal()
{
   ASSERT_VALID(this);
   ASSERT(m_ofn.Flags & OFN_ENABLEHOOK);
   ASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook

   // zero out the file buffer for consistent parsing later
   ASSERT(AfxIsValidAddress(m_ofn.lpstrFile, m_ofn.nMaxFile));
   DWORD nOffset = lstrlen(m_ofn.lpstrFile)+1;
   ASSERT(nOffset <= m_ofn.nMaxFile);
   memset(m_ofn.lpstrFile+nOffset, 0,
         (m_ofn.nMaxFile-nOffset)*sizeof(TCHAR));

   // WINBUG: This is a special case for the file open/save dialog,
   //  which sometimes pumps while it is coming up but before it has
   //  disabled the main window.
   HWND hWndFocus = ::GetFocus();
   BOOL bEnableParent = FALSE;
   m_ofn.hwndOwner = PreModal();
   AfxUnhookWindowCreate();
   if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_ofn.hwndOwner))
   {
      bEnableParent = TRUE;
      ::EnableWindow(m_ofn.hwndOwner, FALSE);
   }

   _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
   ASSERT(pThreadState->m_pAlternateWndInit == NULL);

   if (m_ofn.Flags & OFN_EXPLORER)
      pThreadState->m_pAlternateWndInit = this;
   else
      AfxHookWindowCreate(this);

   memset(&m_ofnEx, 0, sizeof(m_ofnEx));
   memcpy(&m_ofnEx, &m_ofn, sizeof(m_ofn));
   if (IsWin2000())
      m_ofnEx.lStructSize = sizeof(m_ofnEx);

   int nResult;
   if (m_bOpenFileDialog)
      nResult = ::GetOpenFileName((OPENFILENAME*)&m_ofnEx);
   else
      nResult = ::GetSaveFileName((OPENFILENAME*)&m_ofnEx);

   memcpy(&m_ofn, &m_ofnEx, sizeof(m_ofn));
   m_ofn.lStructSize = sizeof(m_ofn);

   if (nResult)
      ASSERT(pThreadState->m_pAlternateWndInit == NULL);
   pThreadState->m_pAlternateWndInit = NULL;

   // WINBUG: Second part of special case for file open/save dialog.
   if (bEnableParent)
      ::EnableWindow(m_ofnEx.hwndOwner, TRUE);
   if (::IsWindow(hWndFocus))
      ::SetFocus(hWndFocus);

   PostModal();
   return nResult ? nResult : IDCANCEL;
}

BOOL CFileDialogEx::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   memcpy(&m_ofn, &m_ofnEx, sizeof(m_ofn));
   m_ofn.lStructSize = sizeof(m_ofn);

   return CFileDialog::OnNotify( wParam, lParam, pResult);
}

////////////////////////////////////////////////////////////////
// The following functions are provided just to demonstrate that they
// get called; ie, that MFC's internal dialog proc is in fact hooked
// up. You can delete them if you like.
//
BOOL CFileDialogEx::OnFileNameOK()
{
   TRACE(_T("CFileDialogEx::OnFileNameOK\n"));
   return CFileDialog::OnFileNameOK();
}

void CFileDialogEx::OnInitDone()
{
   TRACE(_T("CFileDialogEx::OnInitDone\n"));
   CFileDialog::OnInitDone();
}

void CFileDialogEx::OnFileNameChange()
{
   TRACE(_T("CFileDialogEx::OnFileNameChange\n"));
   CFileDialog::OnFileNameChange();
}

void CFileDialogEx::OnFolderChange()
{
   TRACE(_T("CFileDialogEx::OnFolderChange\n"));
   CFileDialog::OnFolderChange();
}

void CFileDialogEx::OnTypeChange()
{
   TRACE(_T("OnTypeChange(), index = %d\n"), m_ofn.nFilterIndex);
   CFileDialog::OnTypeChange();
}

// EOF
Just add these 2 files into the your project and

replace CFileDialog to the CFileDialogEx in the your code.
Good Luck!
0
 
boomshankerAuthor Commented:
That's great!

Thank you so much for your help, and your quick response.
Much appreciated.
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now