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:
@@ -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:
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user