X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5c33522fca7cddc441a316f5b9fb50d7685435ba..43c5b6e808f083617eb42cb48e77366844f8fb5c:/src/msw/filedlg.cpp?ds=sidebyside diff --git a/src/msw/filedlg.cpp b/src/msw/filedlg.cpp index c618fe3629..c553328fb4 100644 --- a/src/msw/filedlg.cpp +++ b/src/msw/filedlg.cpp @@ -86,6 +86,16 @@ wxFileDialogHookFunction(HWND hDlg, { switch ( iMsg ) { +#ifndef __WXWINCE__ + case WM_INITDIALOG: + { + OPENFILENAME* ofn = reinterpret_cast(lParam); + reinterpret_cast(ofn->lCustData) + ->MSWOnInitDialogHook((WXHWND)hDlg); + } + break; +#endif // __WXWINCE__ + case WM_NOTIFY: { OFNOTIFY *pNotifyCode = reinterpret_cast(lParam); @@ -167,7 +177,7 @@ void wxFileDialog::GetFilenames(wxArrayString& files) const void wxFileDialog::SetPath(const wxString& path) { wxString ext; - wxSplitPath(path, &m_dir, &m_fileName, &ext); + wxFileName::SplitPath(path, &m_dir, &m_fileName, &ext); if ( !ext.empty() ) m_fileName << _T('.') << ext; } @@ -360,6 +370,17 @@ static bool ShowCommFileDialog(OPENFILENAME *of, long style) return true; } +#ifndef __WXWINCE__ +void wxFileDialog::MSWOnInitDialogHook(WXHWND hwnd) +{ + SetHWND(hwnd); + + CreateExtraControl(); + + SetHWND(NULL); +} +#endif // __WXWINCE__ + int wxFileDialog::ShowModal() { HWND hWnd = 0; @@ -385,7 +406,7 @@ int wxFileDialog::ShowModal() in the upper left of the frame, it does not center automatically. */ - if (m_bMovedWindow) // we need these flags. + if (m_bMovedWindow || HasExtraControlCreator()) // we need these flags. { msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK; #ifndef __WXWINCE__ @@ -421,6 +442,36 @@ int wxFileDialog::ShowModal() of.lpstrFileTitle = titleBuffer; of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; +#ifndef __WXWINCE__ + GlobalPtr hgbl; + if ( HasExtraControlCreator() ) + { + msw_flags |= OFN_ENABLETEMPLATEHANDLE; + + hgbl.Init(256, GMEM_ZEROINIT); + GlobalPtrLock hgblLock(hgbl); + LPDLGTEMPLATE lpdt = static_cast(hgblLock.Get()); + + // Define a dialog box. + + lpdt->style = DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS; + lpdt->cdit = 0; // Number of controls + lpdt->x = 0; + lpdt->y = 0; + + // convert the size of the extra controls to the dialog units + const wxSize extraSize = GetExtraControlSize(); + const LONG baseUnits = ::GetDialogBaseUnits(); + lpdt->cx = ::MulDiv(extraSize.x, 4, LOWORD(baseUnits)); + lpdt->cy = ::MulDiv(extraSize.y, 8, HIWORD(baseUnits)); + + // after the DLGTEMPLATE there are 3 additional WORDs for dialog menu, + // class and title, all three set to zeros. + + of.hInstance = (HINSTANCE)lpdt; + } +#endif // __WXWINCE__ + // Convert forward slashes to backslashes (file selector doesn't like // forward slashes) and also squeeze multiple consecutive slashes into one // as it doesn't like two backslashes in a row neither @@ -494,8 +545,7 @@ int wxFileDialog::ShowModal() //=== Setting defaultFileName >>========================================= - wxStrncpy(fileNameBuffer, m_fileName, wxMAXPATH-1); - fileNameBuffer[ wxMAXPATH-1 ] = wxT('\0'); + wxStrlcpy(fileNameBuffer, m_fileName.c_str(), WXSIZEOF(fileNameBuffer)); of.lpstrFile = fileNameBuffer; // holds returned filename of.nMaxFile = wxMAXPATH; @@ -596,8 +646,7 @@ int wxFileDialog::ShowModal() extension = extension + wxStrlen( extension ) + 1; m_fileName = AppendExtension(fileNameBuffer, extension); - wxStrncpy(fileNameBuffer, m_fileName.c_str(), wxMin(m_fileName.length(), wxMAXPATH-1)); - fileNameBuffer[wxMin(m_fileName.length(), wxMAXPATH-1)] = wxT('\0'); + wxStrlcpy(fileNameBuffer, m_fileName.c_str(), WXSIZEOF(fileNameBuffer)); } m_path = fileNameBuffer;