implemented moving the dialog (patch 996448)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28492 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2004-07-25 16:56:00 +00:00
parent 7bef714caa
commit 0b11099dd6
3 changed files with 118 additions and 5 deletions

View File

@ -254,6 +254,7 @@ wxMSW:
- fixed UNC paths handling in wxFileSystem (Daniel Nash)
- set wxKeyEvent::m_uniChar in Unicode build
- support for alpha channel in toolbar bitmaps (Jurgen Doornik)
- wxFileDialog can now be moved and centered (Randall Fox)
wxWinCE:

View File

@ -37,8 +37,14 @@ public:
virtual int ShowModal();
protected:
virtual void DoMoveWindow(int x, int y, int width, int height);
virtual void DoGetSize( int *width, int *height ) const;
virtual void DoGetPosition( int *x, int *y ) const;
private:
wxArrayString m_fileNames;
bool m_bMovedWindow;
DECLARE_DYNAMIC_CLASS(wxFileDialog)
DECLARE_NO_COPY_CLASS(wxFileDialog)

View File

@ -71,12 +71,65 @@
# define wxMAXEXT 5
// ----------------------------------------------------------------------------
// globals
// ----------------------------------------------------------------------------
// standard dialog size
static wxRect gs_rectDialog(0, 0, 428, 266);
// ============================================================================
// implementation
// ============================================================================
IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
// ----------------------------------------------------------------------------
// hook function for moving the dialog
// ----------------------------------------------------------------------------
UINT APIENTRY
wxFileDialogHookFunction(HWND hDlg,
UINT iMsg,
WPARAM WXUNUSED(wParam),
LPARAM lParam)
{
HWND hwndDialog;
hwndDialog = ::GetParent( hDlg );
switch (iMsg)
{
case WM_DESTROY:
{
RECT dlgRect;
GetWindowRect( hwndDialog, & dlgRect );
gs_rectDialog.x = dlgRect.left;
gs_rectDialog.y = dlgRect.top;
gs_rectDialog.width = dlgRect.right - dlgRect.left;
gs_rectDialog.height = dlgRect.bottom - dlgRect.top;
}
break;
case WM_NOTIFY:
{
OFNOTIFY * pNotifyCode;
pNotifyCode = (LPOFNOTIFY) lParam;
if (CDN_INITDONE == (pNotifyCode->hdr).code)
{
SetWindowPos( hwndDialog, HWND_TOP,
gs_rectDialog.x,
gs_rectDialog.y,
gs_rectDialog.width,
gs_rectDialog.height,
SWP_NOZORDER|SWP_NOSIZE);
}
}
break;
}
// do the default processing
return 0;
}
// ----------------------------------------------------------------------------
// wxFileDialog
// ----------------------------------------------------------------------------
@ -88,13 +141,22 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
const wxString& wildCard,
long style,
const wxPoint& pos)
:wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos)
: wxFileDialogBase(parent, message, defaultDir, defaultFileName,
wildCard, style, pos)
{
if ( ( m_dialogStyle & wxMULTIPLE ) && ( m_dialogStyle & wxSAVE ) )
m_dialogStyle &= ~wxMULTIPLE;
}
m_bMovedWindow = false;
// 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();
@ -126,6 +188,34 @@ void wxFileDialog::SetPath(const wxString& path)
m_fileName << _T('.') << ext;
}
void wxFileDialog::DoGetPosition( int *x, int *y ) const
{
*x = gs_rectDialog.x;
*y = gs_rectDialog.y;
}
void wxFileDialog::DoGetSize(int *width, int *height) const
{
*width = gs_rectDialog.width;
*height = gs_rectDialog.height;
}
void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(width), int WXUNUSED(height))
{
m_bMovedWindow = true;
gs_rectDialog.x = x;
gs_rectDialog.y = y;
/*
The width and height can not be set by the programmer
its just not possible. But the program can get the
size of the Dlg after it has been shown, in case they need
that data.
*/
}
int wxFileDialog::ShowModal()
{
HWND hWnd = 0;
@ -149,6 +239,21 @@ int wxFileDialog::ShowModal()
if ( m_dialogStyle & wxFILE_MUST_EXIST )
msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
/*
If the window has been moved the programmer is probably
trying to center or position it. Thus we set the callback
or hook function so that we can actually adjust the position.
Without moving or centering the dlg, it will just stay
in the upper left of the frame, it does not center
automatically.. One additional note, when the hook is
enabled, the PLACES BAR in the dlg (shown on later versions
of windows (2000 and XP) will automatically be turned off
according to the MSDN docs. This is normal. If the
programmer needs the PLACES BAR (left side of dlg) they
just shouldn't move or center the dlg.
*/
if (m_bMovedWindow) // we need the these flags.
msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK|OFN_ENABLESIZING;
if (m_dialogStyle & wxMULTIPLE )
{
@ -216,7 +321,7 @@ int wxFileDialog::ShowModal()
if (i > 0)
i++;
else
break;
break;
}
// fall through
@ -229,6 +334,7 @@ int wxFileDialog::ShowModal()
of.lpstrInitialDir = dir.c_str();
of.Flags = msw_flags;
of.lpfnHook = wxFileDialogHookFunction;
wxArrayString wildDescriptions, wildFilters;
@ -285,7 +391,7 @@ int wxFileDialog::ShowModal()
of.lpstrDefExt = defextBuffer.c_str();
}
}
//== Execute FileDialog >>=================================================
//== Execute FileDialog >>=================================================
@ -362,7 +468,7 @@ int wxFileDialog::ShowModal()
m_filterIndex = (int)of.nFilterIndex - 1;
if ( !of.nFileExtension ||
if ( !of.nFileExtension ||
(of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
{
// User has typed a filename without an extension: