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:
parent
7bef714caa
commit
0b11099dd6
@ -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:
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user