fixed bugs with moving/centering the file dialog (replaces patch 1825170)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49771 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-11-09 20:02:47 +00:00
parent 9a6ffa74e5
commit 0a7b022960
3 changed files with 81 additions and 17 deletions

View File

@@ -258,6 +258,7 @@ wxMSW:
- Return the restored window size from GetSize() when window is minimized. - Return the restored window size from GetSize() when window is minimized.
- wxCheckListBox now looks more native, especially under XP (Marcin Malich). - wxCheckListBox now looks more native, especially under XP (Marcin Malich).
- Allow tooltips longer than 64 (up to 128) characters in wxTaskBarIcon - Allow tooltips longer than 64 (up to 128) characters in wxTaskBarIcon
- Fix centering wxFileDialog
wxX11: wxX11:

View File

@@ -35,17 +35,28 @@ public:
virtual int ShowModal(); virtual int ShowModal();
// wxMSW-specific implementation from now on
// -----------------------------------------
// called from the hook procedure on CDN_INITDONE reception
virtual void MSWOnInitDone(WXHWND hDlg);
protected: protected:
#if !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) #if !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
virtual void DoMoveWindow(int x, int y, int width, int height); virtual void DoMoveWindow(int x, int y, int width, int height);
virtual void DoCentre(int dir);
virtual void DoGetSize( int *width, int *height ) const; virtual void DoGetSize( int *width, int *height ) const;
virtual void DoGetPosition( int *x, int *y ) const; virtual void DoGetPosition( int *x, int *y ) const;
#endif // !(__SMARTPHONE__ && __WXWINCE__) #endif // !(__SMARTPHONE__ && __WXWINCE__)
private: private:
wxArrayString m_fileNames; wxArrayString m_fileNames;
// remember if our SetPosition() or Centre() (which requires special
// treatment) was called
bool m_bMovedWindow; bool m_bMovedWindow;
int m_centreDir; // nothing to do if 0
DECLARE_DYNAMIC_CLASS(wxFileDialog) DECLARE_DYNAMIC_CLASS(wxFileDialog)
DECLARE_NO_COPY_CLASS(wxFileDialog) DECLARE_NO_COPY_CLASS(wxFileDialog)

View File

@@ -64,9 +64,16 @@
// globals // 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); static wxRect gs_rectDialog(0, 0, 428, 266);
// we have no way to retrieve the dialog size before it is shown so calling
// Centre() before ShowModal() doesn't work correctly (and we can't do it
// after), hence we set a special flag and recenter the dialog when it's about
// to be shown
static bool gs_centerDialog = false;
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -90,16 +97,9 @@ wxFileDialogHookFunction(HWND hDlg,
OFNOTIFY *pNotifyCode = wx_reinterpret_cast(OFNOTIFY *, lParam); OFNOTIFY *pNotifyCode = wx_reinterpret_cast(OFNOTIFY *, lParam);
if ( pNotifyCode->hdr.code == CDN_INITDONE ) if ( pNotifyCode->hdr.code == CDN_INITDONE )
{ {
// note that we need to move the parent window: hDlg is a wx_reinterpret_cast(wxFileDialog *,
// child of it when OFN_EXPLORER is used pNotifyCode->lpOFN->lCustData)
::SetWindowPos ->MSWOnInitDone((WXHWND)hDlg);
(
::GetParent(hDlg),
HWND_TOP,
gs_rectDialog.x, gs_rectDialog.y,
0, 0,
SWP_NOZORDER | SWP_NOSIZE
);
} }
} }
break; break;
@@ -138,14 +138,15 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
// NB: all style checks are done by wxFileDialogBase::Create // NB: all style checks are done by wxFileDialogBase::Create
m_bMovedWindow = false; m_bMovedWindow = false;
m_centreDir = 0;
// Must set to zero, otherwise the wx routines won't size the window // 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 // the second time you call the file dialog, because it thinks it is
// already at the requested size.. (when centering) // already at the requested size.. (when centering)
gs_rectDialog.x = gs_rectDialog.x =
gs_rectDialog.y = 0; gs_rectDialog.y = 0;
} }
void wxFileDialog::GetPaths(wxArrayString& paths) const void wxFileDialog::GetPaths(wxArrayString& paths) const
{ {
paths.Empty(); paths.Empty();
@@ -185,7 +186,6 @@ void wxFileDialog::DoGetPosition(int *x, int *y) const
*y = gs_rectDialog.y; *y = gs_rectDialog.y;
} }
void wxFileDialog::DoGetSize(int *width, int *height) const void wxFileDialog::DoGetSize(int *width, int *height) const
{ {
if ( width ) if ( width )
@@ -196,13 +196,64 @@ void wxFileDialog::DoGetSize(int *width, int *height) const
void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(w), int WXUNUSED(h)) void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(w), int WXUNUSED(h))
{ {
m_bMovedWindow = true;
gs_rectDialog.x = x; gs_rectDialog.x = x;
gs_rectDialog.y = y; gs_rectDialog.y = y;
// size of the dialog can't be changed because the controls are not laid // our HWND is only set when we're called from MSWOnInitDone(), test if
// out correctly then // 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 // helper used below in ShowModal(): style is used to determine whether to show
@@ -367,6 +418,7 @@ int wxFileDialog::ShowModal()
of.Flags = msw_flags; of.Flags = msw_flags;
of.lpfnHook = wxFileDialogHookFunction; of.lpfnHook = wxFileDialogHookFunction;
of.lCustData = (LPARAM)this;
wxArrayString wildDescriptions, wildFilters; wxArrayString wildDescriptions, wildFilters;