Files
wxWidgets/src/msw/msgdlg.cpp
Vadim Zeitlin 2afb9e1690 1. Derive wxMessageDialogBase from wxDialog (why did we use multiple
inheritance here?), moved more wxMessageDialog fields into the base class
2. Added functions to set the text of message box buttons (patch 1700393,
   currently only implemented for wxMac)
3. Added wxMessageDialog::SetMessage() and SetExtendedMessage() and
   implemented them for wxMac (part of the patch), wxGTK 2.4+ and in
   a generic way for everybody else
4. Allow changing the dialog attributes between creating and showing it,
   for this the real dialog creation is now done on in ShowModal() in all
   ports


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46199 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2007-05-24 12:50:42 +00:00

135 lines
3.6 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/msw/msgdlg.cpp
// Purpose: wxMessageDialog
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/msgdlg.h"
#ifndef WX_PRECOMP
#include "wx/app.h"
#include "wx/utils.h"
#include "wx/dialog.h"
#endif
#include "wx/msw/private.h"
// For MB_TASKMODAL
#ifdef __WXWINCE__
#include "wx/msw/wince/missing.h"
#endif
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
int wxMessageDialog::ShowModal()
{
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();
}
// use the top level window as parent if none specified
if ( !m_parent )
m_parent = FindSuitableParent();
HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL;
// translate wx style in MSW
unsigned int msStyle = MB_OK;
const long wxStyle = GetMessageDialogStyle();
if (wxStyle & wxYES_NO)
{
#if !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
if (wxStyle & wxCANCEL)
msStyle = MB_YESNOCANCEL;
else
#endif // !(__SMARTPHONE__ && __WXWINCE__)
msStyle = MB_YESNO;
if (wxStyle & wxNO_DEFAULT)
msStyle |= MB_DEFBUTTON2;
}
if (wxStyle & wxOK)
{
if (wxStyle & wxCANCEL)
msStyle = MB_OKCANCEL;
else
msStyle = MB_OK;
}
if (wxStyle & wxICON_EXCLAMATION)
msStyle |= MB_ICONEXCLAMATION;
else if (wxStyle & wxICON_HAND)
msStyle |= MB_ICONHAND;
else if (wxStyle & wxICON_INFORMATION)
msStyle |= MB_ICONINFORMATION;
else if (wxStyle & wxICON_QUESTION)
msStyle |= MB_ICONQUESTION;
if ( wxStyle & wxSTAY_ON_TOP )
msStyle |= MB_TOPMOST;
#ifndef __WXWINCE__
if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft )
msStyle |= MB_RTLREADING | MB_RIGHT;
#endif
if (hWnd)
msStyle |= MB_APPLMODAL;
else
msStyle |= MB_TASKMODAL;
// per MSDN documentation for MessageBox() we can prefix the message with 2
// right-to-left mark characters to tell the function to use RTL layout
// (unfortunately this only works in Unicode builds)
wxString message = GetFullMessage();
#if wxUSE_UNICODE
if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft )
{
// NB: not all compilers support \u escapes
static const wchar_t wchRLM = 0x200f;
message.Prepend(wxString(wchRLM, 2));
}
#endif // wxUSE_UNICODE
// do show the dialog
int msAns = MessageBox(hWnd, message, m_caption, msStyle);
int ans;
switch (msAns)
{
default:
wxFAIL_MSG(_T("unexpected ::MessageBox() return code"));
// fall through
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;
}