Toplevel window support
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13431 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
887
src/os2/toplevel.cpp
Normal file
887
src/os2/toplevel.cpp
Normal file
@@ -0,0 +1,887 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: msw/toplevel.cpp
|
||||
// Purpose: implements wxTopLevelWindow for MSW
|
||||
// Author: Vadim Zeitlin
|
||||
// Modified by:
|
||||
// Created: 30.12.01
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
|
||||
// License: wxWindows license
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "toplevel.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/app.h"
|
||||
#include "wx/toplevel.h"
|
||||
#include "wx/string.h"
|
||||
#include "wx/log.h"
|
||||
#include "wx/intl.h"
|
||||
#include "wx/frame.h"
|
||||
#endif //WX_PRECOMP
|
||||
|
||||
#include "wx/os2/private.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// stubs for missing functions under MicroWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// globals
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// list of all frames and modeless dialogs
|
||||
wxWindowList wxModelessWindows;
|
||||
|
||||
// the name of the default wxWindows class
|
||||
extern const wxChar* wxCanvasClassName;
|
||||
extern const wxChar* wxFrameClassName;
|
||||
|
||||
// ============================================================================
|
||||
// wxTopLevelWindowMSW implementation
|
||||
// ============================================================================
|
||||
|
||||
// Dialog window proc
|
||||
MRESULT EXPENTRY wxDlgProc( HWND WXUNUSED(hWnd)
|
||||
,UINT uMessage
|
||||
,MPARAM WXUNUSED(wParam)
|
||||
,MPARAM WXUNUSED(lParam)
|
||||
)
|
||||
{
|
||||
if (uMessage == WM_INITDLG)
|
||||
{
|
||||
//
|
||||
// For this message, returning TRUE tells system to set focus to the
|
||||
// first control in the dialog box.
|
||||
//
|
||||
return (MRESULT)TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// For all the other ones, FALSE means that we didn't process the
|
||||
// message
|
||||
//
|
||||
return (MRESULT)FALSE;
|
||||
}
|
||||
} // end of wxDlgProc
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 creation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxTopLevelWindowOS2::Init()
|
||||
{
|
||||
m_bIconized = m_bMaximizeOnShow = FALSE;
|
||||
|
||||
//
|
||||
// Unlike (almost?) all other windows, frames are created hidden
|
||||
//
|
||||
m_isShown = FALSE;
|
||||
|
||||
//
|
||||
// Data to save/restore when calling ShowFullScreen
|
||||
m_lFsStyle = 0;
|
||||
m_lFsOldWindowStyle = 0;
|
||||
m_bFsIsMaximized = FALSE;
|
||||
m_bFsIsShowing = FALSE;
|
||||
|
||||
m_hFrame = NULLHANDLE;
|
||||
memset(&m_vSwp, 0, sizeof(SWP));
|
||||
memset(&m_vSwpClient, 0, sizeof(SWP));
|
||||
} // end of wxTopLevelWindowIOS2::Init
|
||||
|
||||
long wxTopLevelWindowOS2::OS2GetCreateWindowFlags(
|
||||
long* plExflags
|
||||
) const
|
||||
{
|
||||
long lStyle = GetWindowStyle();
|
||||
long lMsflags = 0;
|
||||
|
||||
if (lStyle == wxDEFAULT_FRAME_STYLE)
|
||||
lMsflags = FCF_SIZEBORDER | FCF_TITLEBAR | FCF_SYSMENU |
|
||||
FCF_MINMAX | FCF_TASKLIST;
|
||||
else
|
||||
{
|
||||
if ((lStyle & wxCAPTION) == wxCAPTION)
|
||||
lMsflags = FCF_TASKLIST;
|
||||
else
|
||||
lMsflags = FCF_NOMOVEWITHOWNER;
|
||||
|
||||
if ((lStyle & wxVSCROLL) == wxVSCROLL)
|
||||
lMsflags |= FCF_VERTSCROLL;
|
||||
if ((lStyle & wxHSCROLL) == wxHSCROLL)
|
||||
lMsflags |= FCF_HORZSCROLL;
|
||||
if (lStyle & wxMINIMIZE_BOX)
|
||||
lMsflags |= FCF_MINBUTTON;
|
||||
if (lStyle & wxMAXIMIZE_BOX)
|
||||
lMsflags |= FCF_MAXBUTTON;
|
||||
if (lStyle & wxTHICK_FRAME)
|
||||
lMsflags |= FCF_DLGBORDER;
|
||||
if (lStyle & wxSYSTEM_MENU)
|
||||
lMsflags |= FCF_SYSMENU;
|
||||
if (lStyle & wxCAPTION)
|
||||
lMsflags |= FCF_TASKLIST;
|
||||
if (lStyle & wxCLIP_CHILDREN)
|
||||
{
|
||||
// Invalid for frame windows under PM
|
||||
}
|
||||
|
||||
if (lStyle & wxTINY_CAPTION_VERT)
|
||||
lMsflags |= FCF_TASKLIST;
|
||||
if (lStyle & wxTINY_CAPTION_HORIZ)
|
||||
lMsflags |= FCF_TASKLIST;
|
||||
|
||||
if ((lStyle & wxTHICK_FRAME) == 0)
|
||||
lMsflags |= FCF_BORDER;
|
||||
if (lStyle & wxFRAME_TOOL_WINDOW)
|
||||
*plExflags = kFrameToolWindow;
|
||||
|
||||
if (lStyle & wxSTAY_ON_TOP)
|
||||
lMsflags |= FCF_SYSMODAL;
|
||||
}
|
||||
return lMsflags;
|
||||
} // end of wxTopLevelWindowOS2::OS2GetCreateWindowFlags
|
||||
|
||||
bool wxTopLevelWindowOS2::CreateDialog(
|
||||
ULONG ulDlgTemplate
|
||||
, const wxString& rsTitle
|
||||
, const wxPoint& rPos
|
||||
, const wxSize& rSize
|
||||
)
|
||||
{
|
||||
wxWindow* pParent = GetParent();
|
||||
|
||||
//
|
||||
// For the dialogs without wxDIALOG_NO_PARENT style, use the top level
|
||||
// app window as parent - this avoids creating modal dialogs without
|
||||
// parent
|
||||
//
|
||||
if (!pParent && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT))
|
||||
{
|
||||
pParent = wxTheApp->GetTopWindow();
|
||||
|
||||
if (pParent)
|
||||
{
|
||||
//
|
||||
// Don't use transient windows as parents, this is dangerous as it
|
||||
// can lead to a crash if the parent is destroyed before the child
|
||||
//
|
||||
// also don't use the window which is currently hidden as then the
|
||||
// dialog would be hidden as well
|
||||
if ((pParent->GetExtraStyle() & wxWS_EX_TRANSIENT) ||
|
||||
!pParent->IsShown())
|
||||
{
|
||||
pParent = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HWND hWndDlg;
|
||||
HWND hWndParent;
|
||||
|
||||
if (pParent)
|
||||
hWndParent = GetHwndOf(pParent);
|
||||
else
|
||||
hWndParent = HWND_DESKTOP;
|
||||
|
||||
hWndDlg = ::WinLoadDlg( hWndParent
|
||||
,hWndParent
|
||||
,(PFNWP)wxDlgProc
|
||||
,NULL
|
||||
,(ULONG)ulDlgTemplate
|
||||
,(PVOID)this
|
||||
);
|
||||
|
||||
m_hWnd = (WXHWND) hWndDlg;
|
||||
|
||||
if ( !m_hWnd )
|
||||
{
|
||||
wxFAIL_MSG(_("Did you forget to include wx/os2/wx.rc in your resources?"));
|
||||
|
||||
wxLogSysError(_("Can't create dialog using template '%ul'"), ulDlgTemplate);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Move the dialog to its initial position without forcing repainting
|
||||
//
|
||||
int nX;
|
||||
int nY;
|
||||
int nWidth;
|
||||
int nHeight;
|
||||
|
||||
if (!OS2GetCreateWindowCoords( rPos
|
||||
,rSize
|
||||
,nX
|
||||
,nY
|
||||
,nWidth
|
||||
,nHeight
|
||||
))
|
||||
{
|
||||
nX = nWidth = (int)CW_USEDEFAULT;
|
||||
}
|
||||
|
||||
//
|
||||
// We can't use CW_USEDEFAULT here as we're not calling CreateWindow()
|
||||
// and passing CW_USEDEFAULT to MoveWindow() results in resizing the
|
||||
// window to (0, 0) size which breaks quite a lot of things, e.g. the
|
||||
// sizer calculation in wxSizer::Fit()
|
||||
//
|
||||
if (nWidth == (int)CW_USEDEFAULT)
|
||||
{
|
||||
//
|
||||
// The exact number doesn't matter, the dialog will be resized
|
||||
// again soon anyhow but it should be big enough to allow
|
||||
// calculation relying on "totalSize - clientSize > 0" work, i.e.
|
||||
// at least greater than the title bar height
|
||||
//
|
||||
nWidth = nHeight = 100;
|
||||
}
|
||||
if (nX == (int)CW_USEDEFAULT)
|
||||
{
|
||||
//
|
||||
// Centre it on the screen - what else can we do?
|
||||
//
|
||||
wxSize vSizeDpy = wxGetDisplaySize();
|
||||
|
||||
nX = (vSizeDpy.x - nWidth) / 2;
|
||||
nY = (vSizeDpy.y - nHeight) / 2;
|
||||
}
|
||||
::WinSetWindowPos( GetHwnd()
|
||||
,HWND_TOP
|
||||
,nX
|
||||
,nY
|
||||
,nWidth
|
||||
,nHeight
|
||||
,SWP_MOVE | SWP_SIZE | SWP_ZORDER | SWP_SHOW
|
||||
);
|
||||
if (!rsTitle.IsNull())
|
||||
{
|
||||
::WinSetWindowText(GetHwnd(), rsTitle.c_str());
|
||||
}
|
||||
SubclassWin(m_hWnd);
|
||||
return TRUE;
|
||||
} // end of wxTopLevelWindowOS2::CreateDialog
|
||||
|
||||
bool wxTopLevelWindowOS2::CreateFrame(
|
||||
const wxString& rsTitle
|
||||
, const wxPoint& rPos
|
||||
, const wxSize& rSize
|
||||
)
|
||||
{
|
||||
long lExflags;
|
||||
long lFlags = OS2GetCreateWindowFlags(&lExflags);
|
||||
long lStyle = GetWindowStyleFlag();
|
||||
int nX = rPos.x;
|
||||
int nY = rPos.y;
|
||||
int nWidth = rSize.x;
|
||||
int nHeight = rSize.y;
|
||||
ULONG ulStyleFlags = 0L;
|
||||
ERRORID vError;
|
||||
wxString sError;
|
||||
wxWindow* pParent = GetParent();
|
||||
HWND hParent;
|
||||
HWND hFrame;
|
||||
HWND hClient;
|
||||
|
||||
if (pParent)
|
||||
hParent = GetHwndOf(pParent);
|
||||
else
|
||||
hParent = HWND_DESKTOP;
|
||||
|
||||
if ((lStyle & wxMINIMIZE) || (lStyle & wxICONIZE))
|
||||
ulStyleFlags |= WS_MINIMIZED;
|
||||
if (lStyle & wxMAXIMIZE)
|
||||
ulStyleFlags |= WS_MAXIMIZED;
|
||||
|
||||
//
|
||||
// Clear the visible flag, we always call show
|
||||
//
|
||||
ulStyleFlags &= (unsigned long)~WS_VISIBLE;
|
||||
m_bIconized = FALSE;
|
||||
|
||||
//
|
||||
// Create the frame window: We break ranks with other ports now
|
||||
// and instead of calling down into the base wxWindow class' OS2Create
|
||||
// we do all our own stuff here. We will set the needed pieces
|
||||
// of wxWindow manually, here.
|
||||
//
|
||||
|
||||
hFrame = ::WinCreateStdWindow( hParent
|
||||
,ulStyleFlags // frame-window style
|
||||
,(PULONG)&lFlags // window style
|
||||
,(PSZ)wxFrameClassName // class name
|
||||
,(PSZ)rsTitle.c_str() // window title
|
||||
,0L // default client style
|
||||
,NULLHANDLE // resource in executable file
|
||||
,0 // resource id
|
||||
,&hClient // receives client window handle
|
||||
);
|
||||
if (!hFrame)
|
||||
{
|
||||
vError = ::WinGetLastError(vHabmain);
|
||||
sError = wxPMErrorToStr(vError);
|
||||
wxLogError("Error creating frame. Error: %s\n", sError);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// wxWindow class' m_hWnd set here and needed associations
|
||||
//
|
||||
m_hFrame = hFrame;
|
||||
m_hWnd = hClient;
|
||||
wxAssociateWinWithHandle(m_hWnd, this);
|
||||
wxAssociateWinWithHandle(m_hFrame, this);
|
||||
|
||||
m_backgroundColour.Set(wxString("GREY"));
|
||||
|
||||
LONG lColor = (LONG)m_backgroundColour.GetPixel();
|
||||
|
||||
if (!::WinSetPresParam( m_hWnd
|
||||
,PP_BACKGROUNDCOLOR
|
||||
,sizeof(LONG)
|
||||
,(PVOID)&lColor
|
||||
))
|
||||
{
|
||||
vError = ::WinGetLastError(vHabmain);
|
||||
sError = wxPMErrorToStr(vError);
|
||||
wxLogError("Error creating frame. Error: %s\n", sError);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Now need to subclass window. Instead of calling the SubClassWin in wxWindow
|
||||
// we manually subclass here because we don't want to use the main wxWndProc
|
||||
// by default
|
||||
//
|
||||
m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(m_hFrame, (PFNWP)wxFrameMainWndProc);
|
||||
|
||||
//
|
||||
// Now size everything. If adding a menu the client will need to be resized.
|
||||
//
|
||||
|
||||
if (pParent)
|
||||
{
|
||||
nY = pParent->GetSize().y - (nY + nHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
RECTL vRect;
|
||||
|
||||
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
|
||||
nY = vRect.yTop - (nY + nHeight);
|
||||
}
|
||||
if (!::WinSetWindowPos( m_hFrame
|
||||
,HWND_TOP
|
||||
,nX
|
||||
,nY
|
||||
,nWidth
|
||||
,nHeight
|
||||
,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER
|
||||
))
|
||||
{
|
||||
vError = ::WinGetLastError(vHabmain);
|
||||
sError = wxPMErrorToStr(vError);
|
||||
wxLogError("Error sizing frame. Error: %s\n", sError);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
} // end of wxTopLevelWindowOS2::CreateFrame
|
||||
|
||||
bool wxTopLevelWindowOS2::Create(
|
||||
wxWindow* pParent
|
||||
, wxWindowID vId
|
||||
, const wxString& rsTitle
|
||||
, const wxPoint& rPos
|
||||
, const wxSize& rSize
|
||||
, long lStyle
|
||||
, const wxString& rsName
|
||||
)
|
||||
{
|
||||
//
|
||||
// Init our fields
|
||||
//
|
||||
Init();
|
||||
m_windowStyle = lStyle;
|
||||
SetName(rsName);
|
||||
m_windowId = vId == -1 ? NewControlId() : vId;
|
||||
wxTopLevelWindows.Append(this);
|
||||
if (pParent)
|
||||
pParent->AddChild(this);
|
||||
|
||||
if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
|
||||
{
|
||||
//
|
||||
// We have different dialog templates to allows creation of dialogs
|
||||
// with & without captions under OS2indows, resizeable or not (but a
|
||||
// resizeable dialog always has caption - otherwise it would look too
|
||||
// strange)
|
||||
//
|
||||
ULONG ulDlgTemplate;
|
||||
|
||||
if (lStyle & wxRESIZE_BORDER)
|
||||
ulDlgTemplate = (ULONG)kResizeableDialog;
|
||||
else if (lStyle & wxCAPTION)
|
||||
ulDlgTemplate = (ULONG)kCaptionDialog;
|
||||
else
|
||||
ulDlgTemplate = (ULONG)kNoCaptionDialog;
|
||||
return CreateDialog( ulDlgTemplate
|
||||
,rsTitle
|
||||
,rPos
|
||||
,rSize
|
||||
);
|
||||
}
|
||||
else // !dialog
|
||||
{
|
||||
return CreateFrame( rsTitle
|
||||
,rPos
|
||||
,rSize
|
||||
);
|
||||
}
|
||||
} // end of wxTopLevelWindowOS2::Create
|
||||
|
||||
wxTopLevelWindowOS2::~wxTopLevelWindowOS2()
|
||||
{
|
||||
wxTopLevelWindows.DeleteObject(this);
|
||||
|
||||
if (wxModelessWindows.Find(this))
|
||||
wxModelessWindows.DeleteObject(this);
|
||||
|
||||
//
|
||||
// If this is the last top-level window, exit.
|
||||
//
|
||||
if (wxTheApp && (wxTopLevelWindows.Number() == 0))
|
||||
{
|
||||
wxTheApp->SetTopWindow(NULL);
|
||||
if ( wxTheApp->GetExitOnFrameDelete() )
|
||||
{
|
||||
::WinPostMsg(NULL, WM_QUIT, 0, 0);
|
||||
}
|
||||
}
|
||||
} // end of wxTopLevelWindowOS2::~wxTopLevelWindowOS2
|
||||
|
||||
//
|
||||
// IF we have child controls in the Frame's client we need to alter
|
||||
// the y position, because, OS/2 controls are positioned relative to
|
||||
// wxWindows orgin (top left) not the OS/2 origin (bottom left)
|
||||
//
|
||||
void wxTopLevelWindowOS2::AlterChildPos()
|
||||
{
|
||||
//
|
||||
// OS/2 is the only OS concerned about this
|
||||
//
|
||||
wxWindow* pChild = NULL;
|
||||
wxControl* pCtrl = NULL;
|
||||
RECTL vRect;
|
||||
SWP vSwp;
|
||||
|
||||
::WinQueryWindowRect(GetHwnd(), &vRect);
|
||||
for (wxWindowList::Node* pNode = GetChildren().GetFirst();
|
||||
pNode;
|
||||
pNode = pNode->GetNext())
|
||||
{
|
||||
wxWindow* pChild = pNode->GetData();
|
||||
|
||||
::WinQueryWindowPos(pChild->GetHWND(), &vSwp);
|
||||
vSwp.y += (vRect.yTop - m_vSwpClient.cy);
|
||||
if (pChild->IsKindOf(CLASSINFO(wxControl)))
|
||||
{
|
||||
pCtrl = wxDynamicCast(pChild, wxControl);
|
||||
//
|
||||
// Must deal with controls that have margins like ENTRYFIELD. The SWP
|
||||
// struct of such a control will have and origin offset from its intended
|
||||
// position by the width of the margins.
|
||||
//
|
||||
vSwp.y -= pCtrl->GetYComp();
|
||||
vSwp.x -= pCtrl->GetXComp();
|
||||
}
|
||||
::WinSetWindowPos( pChild->GetHWND()
|
||||
,HWND_TOP
|
||||
,vSwp.x
|
||||
,vSwp.y
|
||||
,vSwp.cx
|
||||
,vSwp.cy
|
||||
,SWP_MOVE
|
||||
);
|
||||
::WinQueryWindowPos(pChild->GetHWND(), &vSwp);
|
||||
pChild = NULL;
|
||||
}
|
||||
::WinQueryWindowPos(GetHwnd(), &m_vSwpClient);
|
||||
} // end of wxTopLevelWindowOS2::AlterChildPos
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 client size
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxTopLevelWindowOS2::DoSetClientSize(
|
||||
int nWidth
|
||||
, int nHeight
|
||||
)
|
||||
{
|
||||
//
|
||||
// Call GetClientAreaOrigin() to take the toolbar into account
|
||||
//
|
||||
wxPoint vPt = GetClientAreaOrigin();
|
||||
|
||||
nWidth += vPt.x;
|
||||
nHeight += vPt.y;
|
||||
|
||||
wxWindow::DoSetClientSize( nWidth
|
||||
,nHeight
|
||||
);
|
||||
} // end of wxTopLevelWindowOS2::DoSetClientSize
|
||||
|
||||
void wxTopLevelWindowOS2::DoGetClientSize(
|
||||
int* pnX
|
||||
, int* pnY
|
||||
) const
|
||||
{
|
||||
wxWindow::DoGetClientSize( pnX
|
||||
,pnY
|
||||
);
|
||||
|
||||
wxPoint vPt = GetClientAreaOrigin();
|
||||
|
||||
if (pnX)
|
||||
*pnX -= vPt.x;
|
||||
|
||||
if (pnY)
|
||||
*pnY += vPt.y;
|
||||
} // end of wxTopLevelWindowOS2::DoGetClientSize
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 showing
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxTopLevelWindowOS2::DoShowWindow(
|
||||
int nShowCmd
|
||||
)
|
||||
{
|
||||
::WinShowWindow(m_hFrame, (BOOL)nShowCmd);
|
||||
m_bIconized = nShowCmd == SWP_MINIMIZE;
|
||||
} // end of wxTopLevelWindowOS2::DoShowWindow
|
||||
|
||||
bool wxTopLevelWindowOS2::Show(
|
||||
bool bShow
|
||||
)
|
||||
{
|
||||
int nShowCmd;
|
||||
SWP vSwp;
|
||||
RECTL vRect;
|
||||
|
||||
if (bShow)
|
||||
{
|
||||
if (m_bMaximizeOnShow)
|
||||
{
|
||||
nShowCmd = SWP_SHOW;
|
||||
m_bMaximizeOnShow = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
nShowCmd = SWP_HIDE;
|
||||
}
|
||||
}
|
||||
else // hide
|
||||
{
|
||||
nShowCmd = SWP_HIDE;
|
||||
}
|
||||
DoShowWindow(nShowCmd);
|
||||
|
||||
if (bShow)
|
||||
{
|
||||
wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId);
|
||||
|
||||
::WinQueryWindowPos(m_hFrame, &vSwp);
|
||||
m_bIconized = vSwp.fl & SWP_MINIMIZE;
|
||||
::WinQueryWindowPos(m_hWnd, &m_vSwpClient);
|
||||
::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0);
|
||||
::WinEnableWindow(m_hFrame, TRUE);
|
||||
vEvent.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(vEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Try to highlight the correct window (the parent)
|
||||
//
|
||||
if (GetParent())
|
||||
{
|
||||
HWND hWndParent = GetHwndOf(GetParent());
|
||||
|
||||
::WinQueryWindowPos(hWndParent, &vSwp);
|
||||
m_bIconized = vSwp.fl & SWP_MINIMIZE;
|
||||
if (hWndParent)
|
||||
::WinSetWindowPos( hWndParent
|
||||
,HWND_TOP
|
||||
,vSwp.x
|
||||
,vSwp.y
|
||||
,vSwp.cx
|
||||
,vSwp.cy
|
||||
,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE
|
||||
);
|
||||
::WinEnableWindow(hWndParent, TRUE);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
} // end of wxTopLevelWindowOS2::Show
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 maximize/minimize
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxTopLevelWindowOS2::Maximize(
|
||||
bool bMaximize
|
||||
)
|
||||
{
|
||||
if (IsShown())
|
||||
{
|
||||
//
|
||||
// Just maximize it directly
|
||||
//
|
||||
DoShowWindow(bMaximize ? SWP_MAXIMIZE : SWP_RESTORE);
|
||||
}
|
||||
else // hidden
|
||||
{
|
||||
//
|
||||
// We can't maximize the hidden frame because it shows it as well, so
|
||||
// just remember that we should do it later in this case
|
||||
//
|
||||
m_bMaximizeOnShow = TRUE;
|
||||
}
|
||||
} // end of wxTopLevelWindowOS2::Maximize
|
||||
|
||||
bool wxTopLevelWindowOS2::IsMaximized() const
|
||||
{
|
||||
bool bIconic;
|
||||
|
||||
::WinQueryWindowPos(m_hFrame, (PSWP)&m_vSwp);
|
||||
return (m_vSwp.fl & SWP_MAXIMIZE);
|
||||
} // end of wxTopLevelWindowOS2::IsMaximized
|
||||
|
||||
void wxTopLevelWindowOS2::Iconize(
|
||||
bool bIconize
|
||||
)
|
||||
{
|
||||
DoShowWindow(bIconize ? SWP_MINIMIZE : SWP_RESTORE);
|
||||
} // end of wxTopLevelWindowOS2::Iconize
|
||||
|
||||
bool wxTopLevelWindowOS2::IsIconized() const
|
||||
{
|
||||
// also update the current state
|
||||
::WinQueryWindowPos(m_hFrame, (PSWP)&m_vSwp);
|
||||
if (m_vSwp.fl & SWP_MINIMIZE)
|
||||
((wxTopLevelWindow*)this)->m_bIconized = TRUE;
|
||||
else
|
||||
((wxTopLevelWindow*)this)->m_bIconized = FALSE;
|
||||
return m_bIconized;
|
||||
} // end of wxTopLevelWindowOS2::IsIconized
|
||||
|
||||
void wxTopLevelWindowOS2::Restore()
|
||||
{
|
||||
DoShowWindow(SWP_RESTORE);
|
||||
} // end of wxTopLevelWindowOS2::Restore
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 fullscreen
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxTopLevelWindowOS2::ShowFullScreen(
|
||||
bool bShow
|
||||
, long lStyle
|
||||
)
|
||||
{
|
||||
if (bShow)
|
||||
{
|
||||
if (IsFullScreen())
|
||||
return FALSE;
|
||||
|
||||
m_bFsIsShowing = TRUE;
|
||||
m_lFsStyle = lStyle;
|
||||
|
||||
//
|
||||
// Zap the frame borders
|
||||
//
|
||||
|
||||
//
|
||||
// Save the 'normal' window lStyle
|
||||
//
|
||||
m_lFsOldWindowStyle = ::WinQueryWindowULong( (HWND)GetHWND()
|
||||
,QWL_STYLE
|
||||
);
|
||||
|
||||
//
|
||||
// Save the old position, width & height, maximize state
|
||||
//
|
||||
m_vFsOldSize = GetRect();
|
||||
m_bFsIsMaximized = IsMaximized();
|
||||
|
||||
//
|
||||
// Decide which window lStyle flags to turn off
|
||||
//
|
||||
LONG lNewStyle = m_lFsOldWindowStyle;
|
||||
LONG lOffFlags = 0;
|
||||
|
||||
if (lStyle & wxFULLSCREEN_NOBORDER)
|
||||
lOffFlags |= FCF_BORDER;
|
||||
if (lStyle & wxFULLSCREEN_NOCAPTION)
|
||||
lOffFlags |= (FCF_TASKLIST | FCF_SYSMENU);
|
||||
|
||||
lNewStyle &= (~lOffFlags);
|
||||
|
||||
//
|
||||
// Change our window style to be compatible with full-screen mode
|
||||
//
|
||||
::WinSetWindowULong( (HWND)GetHWND()
|
||||
,QWL_STYLE
|
||||
,lNewStyle
|
||||
);
|
||||
|
||||
//
|
||||
// Resize to the size of the desktop
|
||||
//
|
||||
int nWidth;
|
||||
int nHeight;
|
||||
RECTL vRect = wxGetWindowRect(HWND_DESKTOP);
|
||||
|
||||
nWidth = vRect.xRight - vRect.xLeft;
|
||||
nHeight = vRect.yTop - vRect.yBottom;
|
||||
|
||||
SetSize( nWidth
|
||||
,nHeight
|
||||
);
|
||||
|
||||
//
|
||||
// Now flush the window style cache and actually go full-screen
|
||||
//
|
||||
::WinSetWindowPos( m_hFrame
|
||||
,HWND_TOP
|
||||
,0
|
||||
,0
|
||||
,nWidth
|
||||
,nHeight
|
||||
,SWP_SIZE | SWP_MOVE
|
||||
);
|
||||
|
||||
wxSizeEvent vEvent( wxSize( nWidth
|
||||
,nHeight
|
||||
)
|
||||
,GetId()
|
||||
);
|
||||
|
||||
GetEventHandler()->ProcessEvent(vEvent);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsFullScreen())
|
||||
return FALSE;
|
||||
|
||||
m_bFsIsShowing = FALSE;
|
||||
Maximize(m_bFsIsMaximized);
|
||||
::WinSetWindowULong( (HWND)GetHWND()
|
||||
,QWL_STYLE
|
||||
,m_lFsOldWindowStyle
|
||||
);
|
||||
::WinSetWindowPos( m_hFrame
|
||||
,HWND_TOP
|
||||
,m_vFsOldSize.x
|
||||
,m_vFsOldSize.y
|
||||
,m_vFsOldSize.width
|
||||
,m_vFsOldSize.height
|
||||
,SWP_SIZE | SWP_MOVE
|
||||
);
|
||||
return TRUE;
|
||||
}
|
||||
} // end of wxTopLevelWindowOS2::ShowFullScreen
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTopLevelWindowOS2 misc
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxTopLevelWindowOS2::SetIcon(
|
||||
const wxIcon& rIcon
|
||||
)
|
||||
{
|
||||
//
|
||||
// This sets m_icon
|
||||
//
|
||||
wxTopLevelWindowBase::SetIcon(rIcon);
|
||||
|
||||
if (m_icon.Ok())
|
||||
{
|
||||
::WinSendMsg( m_hFrame
|
||||
,WM_SETICON
|
||||
,(MPARAM)((HPOINTER)m_icon.GetHICON())
|
||||
,NULL
|
||||
);
|
||||
::WinSendMsg( m_hFrame
|
||||
,WM_UPDATEFRAME
|
||||
,(MPARAM)FCF_ICON
|
||||
,(MPARAM)0
|
||||
);
|
||||
}
|
||||
} // end of wxTopLevelWindowOS2::SetIcon
|
||||
|
||||
bool wxTopLevelWindowOS2::EnableCloseButton(
|
||||
bool bEnable
|
||||
)
|
||||
{
|
||||
//
|
||||
// Get system (a.k.a. window) menu
|
||||
//
|
||||
HMENU hMenu = ::WinWindowFromID(m_hFrame, FID_SYSMENU);
|
||||
|
||||
if (!hMenu)
|
||||
{
|
||||
wxLogLastError(_T("GetSystemMenu"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Enabling/disabling the close item from it also automatically
|
||||
// disables/enables the close title bar button
|
||||
//
|
||||
if (bEnable)
|
||||
(void)::WinSendMsg( hMenu
|
||||
,MM_SETITEMATTR
|
||||
,MPFROM2SHORT(SC_CLOSE, FALSE)
|
||||
,MPFROM2SHORT(MIA_DISABLED, FALSE)
|
||||
);
|
||||
else
|
||||
(void)::WinSendMsg( hMenu
|
||||
,MM_SETITEMATTR
|
||||
,MPFROM2SHORT(SC_CLOSE, FALSE)
|
||||
,MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED)
|
||||
);
|
||||
|
||||
//
|
||||
// Update appearance immediately
|
||||
//
|
||||
::WinSendMsg( m_hFrame
|
||||
,WM_UPDATEFRAME
|
||||
,(MPARAM)FCF_MENU
|
||||
,(MPARAM)0
|
||||
);
|
||||
return TRUE;
|
||||
} // end of wxTopLevelWindowOS2::EnableCloseButton
|
||||
|
Reference in New Issue
Block a user