toplevel.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,171 行 · 第 1/3 页
CPP
1,171 行
}
#endif
// move the dialog to its initial position without forcing repainting
int x, y, w, h;
(void)MSWGetCreateWindowCoords(pos, size, x, y, w, h);
if ( x == (int)CW_USEDEFAULT )
{
// centre it on the screen - what else can we do?
wxSize sizeDpy = wxGetDisplaySize();
x = (sizeDpy.x - w) / 2;
y = (sizeDpy.y - h) / 2;
}
#if !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__)
if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
{
wxLogLastError(wxT("MoveWindow"));
}
#endif
if ( !title.empty() )
{
::SetWindowText(GetHwnd(), title);
}
SubclassWin(m_hWnd);
#ifdef __SMARTPHONE__
// Work around title non-display glitch
Show(false);
#endif
return true;
#endif // __WXMICROWIN__/!__WXMICROWIN__
}
bool wxTopLevelWindowMSW::CreateFrame(const wxString& title,
const wxPoint& pos,
const wxSize& size)
{
WXDWORD exflags;
WXDWORD flags = MSWGetCreateWindowFlags(&exflags);
#if !defined(__HANDHELDPC__) && ((defined(_WIN32_WCE) && _WIN32_WCE < 400) || \
defined(__POCKETPC__) || \
defined(__SMARTPHONE__))
// Always expand to fit the screen in PocketPC or SmartPhone
wxSize sz(wxDefaultSize);
wxUnusedVar(size);
#else // other (including normal desktop) Windows
wxSize sz(size);
#endif
bool result = MSWCreate(wxCanvasClassName, title, pos, sz, flags, exflags);
return result;
}
bool wxTopLevelWindowMSW::Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name)
{
bool ret wxDUMMY_INITIALIZE(false);
// init our fields
Init();
wxSize sizeReal = size;
if ( !sizeReal.IsFullySpecified() )
{
sizeReal.SetDefaults(GetDefaultSize());
}
m_windowStyle = style;
SetName(name);
m_windowId = id == wxID_ANY ? NewControlId() : id;
wxTopLevelWindows.Append(this);
if ( parent )
parent->AddChild(this);
if ( GetExtraStyle() & wxTOPLEVEL_EX_DIALOG )
{
// we have different dialog templates to allows creation of dialogs
// with & without captions under MSWindows, resizeable or not (but a
// resizeable dialog always has caption - otherwise it would look too
// strange)
// we need 3 additional WORDs for dialog menu, class and title (as we
// don't use DS_SETFONT we don't need the fourth WORD for the font)
static const int dlgsize = sizeof(DLGTEMPLATE) + (sizeof(WORD) * 3);
DLGTEMPLATE *dlgTemplate = (DLGTEMPLATE *)malloc(dlgsize);
memset(dlgTemplate, 0, dlgsize);
// these values are arbitrary, they won't be used normally anyhow
dlgTemplate->x = 34;
dlgTemplate->y = 22;
dlgTemplate->cx = 144;
dlgTemplate->cy = 75;
// reuse the code in MSWGetStyle() but correct the results slightly for
// the dialog
dlgTemplate->style = MSWGetStyle(style, NULL);
// all dialogs are popups
dlgTemplate->style |= WS_POPUP;
#ifndef __WXWINCE__
// force 3D-look if necessary, it looks impossibly ugly otherwise
if ( style & (wxRESIZE_BORDER | wxCAPTION) )
dlgTemplate->style |= DS_MODALFRAME;
#endif
ret = CreateDialog(dlgTemplate, title, pos, sizeReal);
free(dlgTemplate);
}
else // !dialog
{
ret = CreateFrame(title, pos, sizeReal);
}
#ifndef __WXWINCE__
if ( ret && !(GetWindowStyleFlag() & wxCLOSE_BOX) )
{
EnableCloseButton(false);
}
#endif
// for standard dialogs the dialog manager generates WM_CHANGEUISTATE
// itself but for custom windows we have to do it ourselves in order to
// make the keyboard indicators (such as underlines for accelerators and
// focus rectangles) work under Win2k+
if ( ret )
{
static int s_needToUpdate = -1;
if ( s_needToUpdate == -1 )
{
int verMaj, verMin;
s_needToUpdate = wxGetOsVersion(&verMaj, &verMin) == wxWINDOWS_NT &&
verMaj >= 5;
}
if ( s_needToUpdate )
::SendMessage(GetHwnd(), WM_CHANGEUISTATE,
MAKEWPARAM(UIS_INITIALIZE, 0), 0);
}
// Note: if we include PocketPC in this test, dialogs can fail to show up,
// for example the text entry dialog in the dialogs sample. Problem with Maximise()?
#if defined(__WXWINCE__) && (defined(__SMARTPHONE__) || defined(__WINCE_STANDARDSDK__))
if ( style & wxMAXIMIZE )
{
this->Maximize();
}
#endif
#if defined(__SMARTPHONE__) && defined(__WXWINCE__)
SetRightMenu(); // to nothing for initialization
#endif
return ret;
}
wxTopLevelWindowMSW::~wxTopLevelWindowMSW()
{
// after destroying an owned window, Windows activates the next top level
// window in Z order but it may be different from our owner (to reproduce
// this simply Alt-TAB to another application and back before closing the
// owned frame) whereas we always want to yield activation to our parent
if ( HasFlag(wxFRAME_FLOAT_ON_PARENT) )
{
wxWindow *parent = GetParent();
if ( parent )
{
::BringWindowToTop(GetHwndOf(parent));
}
}
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMSW showing
// ----------------------------------------------------------------------------
void wxTopLevelWindowMSW::DoShowWindow(int nShowCmd)
{
::ShowWindow(GetHwnd(), nShowCmd);
m_iconized = nShowCmd == SW_MINIMIZE;
}
bool wxTopLevelWindowMSW::Show(bool show)
{
// don't use wxWindow version as we want to call DoShowWindow() ourselves
if ( !wxWindowBase::Show(show) )
return false;
int nShowCmd;
if ( show )
{
if ( m_maximizeOnShow )
{
// show and maximize
nShowCmd = SW_MAXIMIZE;
// This is necessary, or no window appears
#if defined( __WINCE_STANDARDSDK__) || defined(__SMARTPHONE__)
DoShowWindow(SW_SHOW);
#endif
m_maximizeOnShow = false;
}
else // just show
{
if ( GetWindowStyle() & wxFRAME_TOOL_WINDOW )
nShowCmd = SW_SHOWNA;
else
nShowCmd = SW_SHOW;
}
}
else // hide
{
nShowCmd = SW_HIDE;
}
DoShowWindow(nShowCmd);
#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))
// Addornments have to be added when the frame is the correct size
wxFrame* frame = wxDynamicCast(this, wxFrame);
if (frame && frame->GetMenuBar())
frame->GetMenuBar()->AddAdornments(GetWindowStyleFlag());
#endif
if ( show )
{
::BringWindowToTop(GetHwnd());
wxActivateEvent event(wxEVT_ACTIVATE, true, m_windowId);
event.SetEventObject( this );
GetEventHandler()->ProcessEvent(event);
}
else // hide
{
// Try to highlight the correct window (the parent)
if ( GetParent() )
{
HWND hWndParent = GetHwndOf(GetParent());
if (hWndParent)
::BringWindowToTop(hWndParent);
}
}
return true;
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMSW maximize/minimize
// ----------------------------------------------------------------------------
void wxTopLevelWindowMSW::Maximize(bool maximize)
{
if ( IsShown() )
{
// just maximize it directly
DoShowWindow(maximize ? SW_MAXIMIZE : SW_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_maximizeOnShow = maximize;
// after calling Maximize() the client code expects to get the frame
// "real" size and doesn't want to know that, because of implementation
// details, the frame isn't really maximized yet but will be only once
// it's shown, so return our size as it will be then in this case
if ( maximize )
{
// we don't know which display we're on yet so use the default one
SetSize(wxGetClientDisplayRect().GetSize());
}
//else: can't do anything in this case, we don't have the old size
}
}
bool wxTopLevelWindowMSW::IsMaximized() const
{
#ifdef __WXWINCE__
return false;
#else
return m_maximizeOnShow || ::IsZoomed(GetHwnd()) != 0;
#endif
}
void wxTopLevelWindowMSW::Iconize(bool iconize)
{
DoShowWindow(iconize ? SW_MINIMIZE : SW_RESTORE);
}
bool wxTopLevelWindowMSW::IsIconized() const
{
#ifdef __WXWINCE__
return false;
#else
// also update the current state
((wxTopLevelWindowMSW *)this)->m_iconized = ::IsIconic(GetHwnd()) != 0;
return m_iconized;
#endif
}
void wxTopLevelWindowMSW::Restore()
{
DoShowWindow(SW_RESTORE);
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMSW fullscreen
// ----------------------------------------------------------------------------
bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style)
{
if ( show == IsFullScreen() )
{
// nothing to do
return true;
}
m_fsIsShowing = show;
if ( show )
{
m_fsStyle = style;
// zap the frame borders
// save the 'normal' window style
m_fsOldWindowStyle = GetWindowLong(GetHwnd(), GWL_STYLE);
// save the old position, width & height, maximize state
m_fsOldSize = GetRect();
m_fsIsMaximized = IsMaximized();
// decide which window style flags to turn off
LONG newStyle = m_fsOldWindowStyle;
LONG offFlags = 0;
if (style & wxFULLSCREEN_NOBORDER)
{
offFlags |= WS_BORDER;
#ifndef __WXWINCE__
offFlags |= WS_THICKFRAME;
#endif
}
if (style & wxFULLSCREEN_NOCAPTION)
offFlags |= WS_CAPTION | WS_SYSMENU;
newStyle &= ~offFlags;
// change our window style to be compatible with full-screen mode
::SetWindowLong(GetHwnd(), GWL_STYLE, newStyle);
wxRect rect;
#if wxUSE_DISPLAY
// resize to the size of the display containing us
int dpy = wxDisplay::GetFromWindow(this);
if ( dpy != wxNOT_FOUND )
{
rect = wxDisplay(dpy).GetGeometry();
}
else // fall back to the main desktop
#endif // wxUSE_DISPLAY
{
// resize to the size of the desktop
wxCopyRECTToRect(wxGetWindowRect(::GetDesktopWindow()), rect);
#ifdef __WXWINCE__
// FIXME: size of the bottom menu (toolbar)
// should be taken in account
rect.height += rect.y;
rect.y = 0;
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?