X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c9f7896861f734ce044ee8601ba2d8a6959c9d9e..180b5b4827d08f1ac13bbb5eca03f775ab35a0b1:/src/msw/filedlg.cpp diff --git a/src/msw/filedlg.cpp b/src/msw/filedlg.cpp index e1c40bf3a5..7ed1c81362 100644 --- a/src/msw/filedlg.cpp +++ b/src/msw/filedlg.cpp @@ -64,7 +64,8 @@ // globals // ---------------------------------------------------------------------------- -// standard dialog size +// standard dialog size for the old Windows systems where the dialog wasn't +// resizeable static wxRect gs_rectDialog(0, 0, 428, 266); // ============================================================================ @@ -90,16 +91,9 @@ wxFileDialogHookFunction(HWND hDlg, OFNOTIFY *pNotifyCode = wx_reinterpret_cast(OFNOTIFY *, lParam); if ( pNotifyCode->hdr.code == CDN_INITDONE ) { - // note that we need to move the parent window: hDlg is a - // child of it when OFN_EXPLORER is used - ::SetWindowPos - ( - ::GetParent(hDlg), - HWND_TOP, - gs_rectDialog.x, gs_rectDialog.y, - 0, 0, - SWP_NOZORDER | SWP_NOSIZE - ); + wx_reinterpret_cast(wxFileDialog *, + pNotifyCode->lpOFN->lCustData) + ->MSWOnInitDone((WXHWND)hDlg); } } break; @@ -138,14 +132,15 @@ wxFileDialog::wxFileDialog(wxWindow *parent, // NB: all style checks are done by wxFileDialogBase::Create m_bMovedWindow = false; + m_centreDir = 0; // Must set to zero, otherwise the wx routines won't size the window // the second time you call the file dialog, because it thinks it is // already at the requested size.. (when centering) gs_rectDialog.x = gs_rectDialog.y = 0; - } + void wxFileDialog::GetPaths(wxArrayString& paths) const { paths.Empty(); @@ -185,7 +180,6 @@ void wxFileDialog::DoGetPosition(int *x, int *y) const *y = gs_rectDialog.y; } - void wxFileDialog::DoGetSize(int *width, int *height) const { if ( width ) @@ -196,13 +190,64 @@ void wxFileDialog::DoGetSize(int *width, int *height) const void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(w), int WXUNUSED(h)) { - m_bMovedWindow = true; - gs_rectDialog.x = x; gs_rectDialog.y = y; - // size of the dialog can't be changed because the controls are not laid - // out correctly then + // our HWND is only set when we're called from MSWOnInitDone(), test if + // this is the case + HWND hwnd = GetHwnd(); + if ( hwnd ) + { + // size of the dialog can't be changed because the controls are not + // laid out correctly then + ::SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + } + else // just remember that we were requested to move the window + { + m_bMovedWindow = true; + + // if Centre() had been called before, it shouldn't be taken into + // account now + m_centreDir = 0; + } +} + +void wxFileDialog::DoCentre(int dir) +{ + m_centreDir = dir; + m_bMovedWindow = true; + + // it's unnecessary to do anything else at this stage as we'll redo it in + // MSWOnInitDone() anyhow +} + +void wxFileDialog::MSWOnInitDone(WXHWND hDlg) +{ + // note the the dialog is the parent window: hDlg is a child of it when + // OFN_EXPLORER is used + HWND hFileDlg = ::GetParent((HWND)hDlg); + + // set HWND so that our DoMoveWindow() works correctly + SetHWND((WXHWND)hFileDlg); + + if ( m_centreDir ) + { + // now we have the real dialog size, remember it + RECT rect; + GetWindowRect(hFileDlg, &rect); + gs_rectDialog = wxRectFromRECT(rect); + + // and position the window correctly: notice that we must use the base + // class version as our own doesn't do anything except setting flags + wxFileDialogBase::DoCentre(m_centreDir); + } + else // need to just move it to the correct place + { + SetPosition(gs_rectDialog.GetPosition()); + } + + // we shouldn't destroy this HWND + SetHWND(NULL); } // helper used below in ShowModal(): style is used to determine whether to show @@ -320,7 +365,7 @@ int wxFileDialog::ShowModal() of.lStructSize = gs_ofStructSize; of.hwndOwner = hWnd; - of.lpstrTitle = WXSTRINGCAST m_message; + of.lpstrTitle = m_message.wx_str(); of.lpstrFileTitle = titleBuffer; of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; @@ -367,6 +412,7 @@ int wxFileDialog::ShowModal() of.Flags = msw_flags; of.lpfnHook = wxFileDialogHookFunction; + of.lCustData = (LPARAM)this; wxArrayString wildDescriptions, wildFilters; @@ -396,7 +442,7 @@ int wxFileDialog::ShowModal() //=== Setting defaultFileName >>========================================= - wxStrncpy( fileNameBuffer, (const wxChar *)m_fileName, wxMAXPATH-1 ); + wxStrncpy(fileNameBuffer, m_fileName, wxMAXPATH-1); fileNameBuffer[ wxMAXPATH-1 ] = wxT('\0'); of.lpstrFile = fileNameBuffer; // holds returned filename @@ -409,7 +455,7 @@ int wxFileDialog::ShowModal() wxString defextBuffer; // we need it to be alive until GetSaveFileName()! if (HasFdFlag(wxFD_SAVE)) { - const wxChar* extension = filterBuffer; + const wxChar* extension = filterBuffer.wx_str(); int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension @@ -511,7 +557,7 @@ int wxFileDialog::ShowModal() (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) ) { // User has typed a filename without an extension: - const wxChar* extension = filterBuffer; + const wxChar* extension = filterBuffer.wx_str(); int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension