$-1$ if the process couldn't be started and typically 0 if the process
terminated successfully. Also, while waiting for the process to
terminate, wxExecute will call \helpref{wxYield}{wxyield}. The caller
-should ensure that this can cause no recursion, in the simples case by
+should ensure that this can cause no recursion, in the simplest case by
calling \helpref{wxEnableTopLevelWindows(FALSE)}{wxenabletoplevelwindows}.
For asynchronous execution, however, the return value is the process id and
\helpref{wxProcess::OnTerminate}{wxprocessonterminate} will be called when
the process finishes.
-See also \helpref{wxShell}{wxshell}, \helpref{wxProcess}{wxprocess}.
+See also \helpref{wxShell}{wxshell}, \helpref{wxProcess}{wxprocess},
+\helpref{Exec sample}{sampleexec}.
\wxheading{Include files}
Executes a command in an interactive shell window. If no command is
specified, then just the shell is spawned.
-See also \helpref{wxExecute}{wxexecute}.
+See also \helpref{wxExecute}{wxexecute}, \helpref{Exec sample}{sampleexec}.
\wxheading{Include files}
languge that would work as a wrapper for wxWindows or programs where
forms or similar datagrams can be created by the uses.
+\subsection{Exec sample}\label{sampleexec}
+
+The exec sample demonstrates the \helpref{wxExecute}{wxexecute} and
+\helpref{wxShell}{wxshell} functions. Both of them are used to execute the
+external programs and the sample shows how to do this synchronously (waiting
+until the program terminates) or asynchronously (notification will come later).
+
\subsection{Scroll subwindow sample}\label{samplescrollsub}
This sample demonstrates the use of the \helpref{wxScrolledWindow}{wxscrolledwindow}
going on (of course, this only works in debug builds) and may be helpful to see
the sequence of steps of data transfer.
-Finally, the last part is used for two things: you can drag text from it to
-either one of the listboxes (only one will accept it) or another application
-and, also, bitmap pasted from clipboard will be shown there.
+Finally, the last part is used for dragging text from it to either one of the
+listboxes (only one will accept it) or another application. The last
+functionality available from the main frame is to paste a bitmap from the
+clipboard (or, in the case of Windows version, also a metafile) - it will be
+shown in a new frame.
So far, everything we mentioned was implemented with minimal amount of code
using standard wxWindows classes. The more advanced features are demonstrated
paste it or drag and drop (between one and the same or different shapes) from
one sample instance to another (or the same). However, chances are that no
other program supports this format and so shapes can also be rendered as
-bitmaps which allows them to be pasted/dropped in many other applications.
+bitmaps which allows them to be pasted/dropped in many other applications
+(and, under Windows, also as metafiles which are supported by most of Windows
+programs as well - try Write/Wordpad, for example).
Take a look at DnDShapeDataObject class to see how you may use
\helpref{wxDataObject}{wxdataobject} to achieve this.
-
\subsection{HTML samples}\label{samplehtml}
Eight HTML samples (you can find them in directory {\tt samples/html})
wxClientData *wxWindowBase::DoGetClientObject() const
{
- wxASSERT_MSG( m_clientDataType == ClientData_Object,
+ // it's not an error to call GetClientObject() on a window which doesn't
+ // have client data at all - NULL will be returned
+ wxASSERT_MSG( m_clientDataType != ClientData_Void,
wxT("this window doesn't have object client data") );
return m_clientObject;
void *wxWindowBase::DoGetClientData() const
{
- wxASSERT_MSG( m_clientDataType == ClientData_Void,
+ // it's not an error to call GetClientData() on a window which doesn't have
+ // client data at all - NULL will be returned
+ wxASSERT_MSG( m_clientDataType != ClientData_Object,
wxT("this window doesn't have void client data") );
return m_clientData;
if (found)
return;
- node = wxDDEServerObjects.First();
+ node = wxDDEClientObjects.First();
while (node && !found)
{
wxDDEClient *object = (wxDDEClient *)node->Data();
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#endif
#ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/defs.h"
-#include "wx/utils.h"
-#include "wx/dialog.h"
-#include "wx/msgdlg.h"
+ #include "wx/defs.h"
+ #include "wx/utils.h"
+ #include "wx/dialog.h"
+ #include "wx/msgdlg.h"
#endif
#include "wx/msw/private.h"
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define wxDIALOG_DEFAULT_X 300
-#define wxDIALOG_DEFAULT_Y 300
-
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
- long style, const wxPoint& pos)
+wxMessageDialog::wxMessageDialog(wxWindow *parent,
+ const wxString& message,
+ const wxString& caption,
+ long style,
+ const wxPoint& WXUNUSED(pos))
{
m_caption = caption;
m_message = message;
m_parent = parent;
}
-int wxMessageDialog::ShowModal(void)
+int wxMessageDialog::ShowModal()
{
- HWND hWnd = 0;
- if (m_parent) hWnd = (HWND) m_parent->GetHWND();
- unsigned int msStyle = MB_OK;
- if (m_dialogStyle & wxYES_NO)
- {
- if (m_dialogStyle & wxCANCEL)
- msStyle = MB_YESNOCANCEL;
- else
- msStyle = MB_YESNO;
+ if ( !wxTheApp->GetTopWindow() )
+ {
+ // when the message box is shown from wxApp::OnInit() (i.e. before the
+ // message loop is entered), this must be done or the next message box
+ // will never be shown - just try putting 2 calls to wxMessageBox() in
+ // OnInit() to see it
+ while ( wxTheApp->Pending() )
+ wxTheApp->Dispatch();
+ }
- if (m_dialogStyle & wxNO_DEFAULT)
- msStyle |= MB_DEFBUTTON2;
- }
+ HWND hWnd = 0;
+ if (m_parent) hWnd = (HWND) m_parent->GetHWND();
+ unsigned int msStyle = MB_OK;
+ if (m_dialogStyle & wxYES_NO)
+ {
+ if (m_dialogStyle & wxCANCEL)
+ msStyle = MB_YESNOCANCEL;
+ else
+ msStyle = MB_YESNO;
- if (m_dialogStyle & wxOK)
- {
- if (m_dialogStyle & wxCANCEL)
- msStyle = MB_OKCANCEL;
- else
- msStyle = MB_OK;
- }
- if (m_dialogStyle & wxICON_EXCLAMATION)
- msStyle |= MB_ICONEXCLAMATION;
- else if (m_dialogStyle & wxICON_HAND)
- msStyle |= MB_ICONHAND;
- else if (m_dialogStyle & wxICON_INFORMATION)
- msStyle |= MB_ICONINFORMATION;
- else if (m_dialogStyle & wxICON_QUESTION)
- msStyle |= MB_ICONQUESTION;
+ if (m_dialogStyle & wxNO_DEFAULT)
+ msStyle |= MB_DEFBUTTON2;
+ }
+
+ if (m_dialogStyle & wxOK)
+ {
+ if (m_dialogStyle & wxCANCEL)
+ msStyle = MB_OKCANCEL;
+ else
+ msStyle = MB_OK;
+ }
+ if (m_dialogStyle & wxICON_EXCLAMATION)
+ msStyle |= MB_ICONEXCLAMATION;
+ else if (m_dialogStyle & wxICON_HAND)
+ msStyle |= MB_ICONHAND;
+ else if (m_dialogStyle & wxICON_INFORMATION)
+ msStyle |= MB_ICONINFORMATION;
+ else if (m_dialogStyle & wxICON_QUESTION)
+ msStyle |= MB_ICONQUESTION;
- if (hWnd)
- msStyle |= MB_APPLMODAL;
- else
- msStyle |= MB_TASKMODAL;
+ if (hWnd)
+ msStyle |= MB_APPLMODAL;
+ else
+ msStyle |= MB_TASKMODAL;
- int msAns = MessageBox(hWnd, (LPCTSTR)(const wxChar *)m_message, (LPCTSTR)(const wxChar *)m_caption, msStyle);
- int ans = wxOK;
- switch (msAns)
- {
- case IDCANCEL:
- ans = wxID_CANCEL;
- break;
- case IDOK:
- ans = wxID_OK;
- break;
- case IDYES:
- ans = wxID_YES;
- break;
- case IDNO:
- ans = wxID_NO;
- break;
- }
- return ans;
+ int msAns = MessageBox(hWnd, (LPCTSTR)m_message.c_str(),
+ (LPCTSTR)m_caption.c_str(), msStyle);
+ int ans = wxOK;
+ switch (msAns)
+ {
+ case IDCANCEL:
+ ans = wxID_CANCEL;
+ break;
+ case IDOK:
+ ans = wxID_OK;
+ break;
+ case IDYES:
+ ans = wxID_YES;
+ break;
+ case IDNO:
+ ans = wxID_NO;
+ break;
+ }
+ return ans;
}
// the id is probably invalid?
wxLogLastError("TB_SETBUTTONINFO");
}
-
}
else
#endif // comctl32.dll 4.71
TBBUTTON tbb;
wxZeroMemory(tbb);
tbb.idCommand = 0;
- tbb.fsState = TBSTATE_ENABLED;
+ tbb.fsState = TBSTATE_ENABLED | TBSTATE_HIDDEN;
tbb.fsStyle = TBSTYLE_SEP;
size_t nSeparators = size.x / widthSep;
void wxToolBar::UpdateSize()
{
- // we must refresh the frame after the toolbar size (possibly) changed
+ // the toolbar size changed
+ SendMessage(GetHwnd(), TB_AUTOSIZE, 0, 0);
+
+ // we must also refresh the frame after the toolbar size (possibly) changed
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
if ( frame )
{
(void)::SendMessage(GetHwndOf(frame), WM_SIZE, SIZE_RESTORED,
MAKELPARAM(r.right - r.left, r.bottom - r.top));
}
-
}
// ----------------------------------------------------------------------------
cmd.Printf(wxT("%s /c %s"), shell, command.c_str());
}
- return wxExecute(cmd, FALSE) != 0;
+ return wxExecute(cmd, TRUE /* sync */) != 0;
}
// ----------------------------------------------------------------------------
// asynchronous execution - we should do the clean up
delete data;
}
- }
- return 0;
+ return 0;
+ }
+ else
+ {
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
}
#endif
NULL, // security attributes: defaults for both
NULL, // the process and its main thread
FALSE, // don't inherit handles
- CREATE_DEFAULT_ERROR_MODE, // flags
+ CREATE_DEFAULT_ERROR_MODE |
+ CREATE_SUSPENDED, // flags
NULL, // environment (use the same)
NULL, // current directory (use the same)
&si, // startup info (unused here)
return 0;
}
- // close unneeded handle
- if ( !::CloseHandle(pi.hThread) )
- wxLogLastError("CloseHandle(hThread)");
-
+ // register the class for the hidden window used for the notifications
if ( !gs_classForHiddenWindow )
{
gs_classForHiddenWindow = _T("wxHiddenWindow");
if ( !::RegisterClass(&wndclass) )
{
wxLogLastError("RegisterClass(hidden window)");
-
- return FALSE;
}
}
// create a hidden window to receive notification about process
// termination
HWND hwnd = ::CreateWindow(gs_classForHiddenWindow, NULL,
- 0, 0, 0, 0, 0, NULL,
+ WS_OVERLAPPEDWINDOW,
+ 0, 0, 0, 0, NULL,
(HMENU)NULL, wxGetInstance(), 0);
wxASSERT_MSG( hwnd, wxT("can't create a hidden window for wxExecute") );
0,
&tid);
+ // resume process we created now - whether the thread creation succeeded or
+ // not
+ if ( ::ResumeThread(pi.hThread) == (DWORD)-1 )
+ {
+ // ignore it - what can we do?
+ wxLogLastError("ResumeThread in wxExecute");
+ }
+
+ // close unneeded handle
+ if ( !::CloseHandle(pi.hThread) )
+ wxLogLastError("CloseHandle(hThread)");
+
if ( !hThread )
{
wxLogLastError("CreateThread in wxExecute");
return pi.dwProcessId;
}
- // waiting until command executed
+ // waiting until command executed (disable everything while doing it)
+#if wxUSE_GUI
+ wxBeginBusyCursor();
+ wxEnableTopLevelWindows(FALSE);
+#endif // wxUSE_GUI
+
while ( data->state )
wxYield();
+#if wxUSE_GUI
+ wxEnableTopLevelWindows(TRUE);
+ wxEndBusyCursor();
+#endif // wxUSE_GUI
+
DWORD dwExitCode = data->dwExitCode;
delete data;