⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toolbar.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
wxToolBar::~wxToolBar(){#if wxMAC_USE_NATIVE_TOOLBAR    if (m_macHIToolbarRef != NULL)    {        // if this is the installed toolbar, then deinstall it        if (m_macUsesNativeToolbar)            MacInstallNativeToolbar( false );        CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ;        wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") );        CFRelease( (HIToolbarRef)m_macHIToolbarRef );        m_macHIToolbarRef = NULL;    }#endif}bool wxToolBar::Show( bool show ){    WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());    bool bResult = (tlw != NULL);    if (bResult)    {#if wxMAC_USE_NATIVE_TOOLBAR        bool ownToolbarInstalled = false;        MacTopLevelHasNativeToolbar( &ownToolbarInstalled );        if (ownToolbarInstalled)        {            bResult = (IsWindowToolbarVisible( tlw ) != show);            if ( bResult )                ShowHideWindowToolbar( tlw, show, false );        }        else            bResult = wxToolBarBase::Show( show );#else        bResult = wxToolBarBase::Show( show );#endif    }    return bResult;}bool wxToolBar::IsShown() const{    bool bResult;#if wxMAC_USE_NATIVE_TOOLBAR    bool ownToolbarInstalled;    MacTopLevelHasNativeToolbar( &ownToolbarInstalled );    if (ownToolbarInstalled)    {        WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());        bResult = IsWindowToolbarVisible( tlw );    }    else        bResult = wxToolBarBase::IsShown();#else    bResult = wxToolBarBase::IsShown();#endif    return bResult;}void wxToolBar::DoGetSize( int *width, int *height ) const{#if wxMAC_USE_NATIVE_TOOLBAR    Rect    boundsR;    bool    ownToolbarInstalled;    MacTopLevelHasNativeToolbar( &ownToolbarInstalled );    if ( ownToolbarInstalled )    {        // TODO: is this really a control ?        GetControlBounds( (ControlRef) m_macHIToolbarRef, &boundsR );        if ( width != NULL )            *width = boundsR.right - boundsR.left;        if ( height != NULL )            *height = boundsR.bottom - boundsR.top;    }    else        wxToolBarBase::DoGetSize( width, height );#else    wxToolBarBase::DoGetSize( width, height );#endif}wxSize wxToolBar::DoGetBestSize() const{    int width, height;    DoGetSize( &width, &height );    return wxSize( width, height );}void wxToolBar::SetWindowStyleFlag( long style ){    wxToolBarBase::SetWindowStyleFlag( style );#if wxMAC_USE_NATIVE_TOOLBAR    if (m_macHIToolbarRef != NULL)    {        HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;        if ( style & wxTB_NOICONS )            mode = kHIToolbarDisplayModeLabelOnly;        else if ( style & wxTB_TEXT )            mode = kHIToolbarDisplayModeIconAndLabel;        else            mode = kHIToolbarDisplayModeIconOnly;       HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );    }#endif}#if wxMAC_USE_NATIVE_TOOLBARbool wxToolBar::MacWantsNativeToolbar(){    return m_macUsesNativeToolbar;}bool wxToolBar::MacTopLevelHasNativeToolbar(bool *ownToolbarInstalled) const{    bool bResultV = false;    if (ownToolbarInstalled != NULL)        *ownToolbarInstalled = false;    WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());    if (tlw != NULL)    {        HIToolbarRef curToolbarRef = NULL;        OSStatus err = GetWindowToolbar( tlw, &curToolbarRef );        bResultV = ((err == noErr) && (curToolbarRef != NULL));        if (bResultV && (ownToolbarInstalled != NULL))            *ownToolbarInstalled = (curToolbarRef == m_macHIToolbarRef);    }    return bResultV;}bool wxToolBar::MacInstallNativeToolbar(bool usesNative){    bool bResult = false;    if (usesNative && (m_macHIToolbarRef == NULL))        return bResult;    if (usesNative && ((GetWindowStyleFlag() & wxTB_VERTICAL) != 0))        return bResult;    WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());    if (tlw == NULL)        return bResult;    // check the existing toolbar    HIToolbarRef curToolbarRef = NULL;    OSStatus err = GetWindowToolbar( tlw, &curToolbarRef );    if (err != noErr)        curToolbarRef = NULL;    m_macUsesNativeToolbar = usesNative;    if (m_macUsesNativeToolbar)    {        // only install toolbar if there isn't one installed already        if (curToolbarRef == NULL)        {            bResult = true;            SetWindowToolbar( tlw, (HIToolbarRef) m_macHIToolbarRef );            ShowHideWindowToolbar( tlw, true, false );            ChangeWindowAttributes( tlw, kWindowToolbarButtonAttribute, 0 );            SetAutomaticControlDragTrackingEnabledForWindow( tlw, true );            Rect r = { 0, 0, 0, 0 };            m_peer->SetRect( &r );            SetSize( wxSIZE_AUTO_WIDTH, 0 );            m_peer->SetVisibility( false, true );            wxToolBarBase::Show( false );        }    }    else    {        // only deinstall toolbar if this is the installed one        if (m_macHIToolbarRef == curToolbarRef)        {            bResult = true;            ShowHideWindowToolbar( tlw, false, false );            ChangeWindowAttributes( tlw, 0, kWindowToolbarButtonAttribute );            SetWindowToolbar( tlw, NULL );            m_peer->SetVisibility( true, true );        }    }    if (bResult)        InvalidateBestSize();// wxLogDebug( wxT("    --> [%lx] - result [%s]"), (long)this, bResult ? wxT("T") : wxT("F") );    return bResult;}#endifbool wxToolBar::Realize(){    if (m_tools.GetCount() == 0)        return false;    int maxWidth = 0;    int maxHeight = 0;    int maxToolWidth = 0;    int maxToolHeight = 0;    int x = m_xMargin + kwxMacToolBarLeftMargin;    int y = m_yMargin + kwxMacToolBarTopMargin;    int tw, th;    GetSize( &tw, &th );    // find the maximum tool width and height    wxToolBarTool *tool;    wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();    while ( node != NULL )    {        tool = (wxToolBarTool *) node->GetData();        if ( tool != NULL )        {            wxSize  sz = tool->GetSize();            if ( sz.x > maxToolWidth )                maxToolWidth = sz.x;            if ( sz.y > maxToolHeight )                maxToolHeight = sz.y;        }        node = node->GetNext();    }    bool lastIsRadio = false;    bool curIsRadio = false;#if wxMAC_USE_NATIVE_TOOLBAR    CFIndex currentPosition = 0;    bool insertAll = false;#endif    node = m_tools.GetFirst();    while ( node != NULL )    {        tool = (wxToolBarTool*) node->GetData();        if ( tool == NULL )        {            node = node->GetNext();            continue;        }        // set tool position:        // for the moment just perform a single row/column alignment        wxSize  cursize = tool->GetSize();        if ( x + cursize.x > maxWidth )            maxWidth = x + cursize.x;        if ( y + cursize.y > maxHeight )            maxHeight = y + cursize.y;        if ( GetWindowStyleFlag() & wxTB_VERTICAL )        {            int x1 = x + ( maxToolWidth - cursize.x ) / 2;            tool->SetPosition( wxPoint(x1, y) );        }        else        {            int y1 = y + ( maxToolHeight - cursize.y ) / 2;            tool->SetPosition( wxPoint(x, y1) );        }        // update the item positioning state        if ( GetWindowStyleFlag() & wxTB_VERTICAL )            y += cursize.y + kwxMacToolSpacing;        else            x += cursize.x + kwxMacToolSpacing;#if wxMAC_USE_NATIVE_TOOLBAR        // install in native HIToolbar        if ( m_macHIToolbarRef != NULL )        {            HIToolbarItemRef    hiItemRef = tool->GetToolbarItemRef();            if ( hiItemRef != NULL )            {                if ( insertAll || (tool->GetIndex() != currentPosition) )                {                    OSStatus err = noErr;                    if ( !insertAll )                    {                        insertAll = true;                        // if this is the first tool that gets newly inserted or repositioned                        // first remove all 'old' tools from here to the right, because of this                        // all following tools will have to be reinserted (insertAll). i = 100 because there's                        // no way to determine how many there are in a toolbar, so just a high number :-(                        for ( CFIndex i = 100; i >= currentPosition; --i )                        {                            err = HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, i );                        }                        if (err != noErr)                        {                            wxString errMsg = wxString::Format( wxT("HIToolbarRemoveItemAtIndex failed [%ld]"), (long)err );                            wxFAIL_MSG( errMsg.c_str() );                        }                    }                    err = HIToolbarInsertItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, hiItemRef, currentPosition );                    if (err != noErr)                    {                        wxString errMsg = wxString::Format( wxT("HIToolbarInsertItemAtIndex failed [%ld]"), (long)err );                        wxFAIL_MSG( errMsg.c_str() );                    }                    tool->SetIndex( currentPosition );                }                currentPosition++;            }        }#endif        // update radio button (and group) state        lastIsRadio = curIsRadio;        curIsRadio = ( tool->IsButton() && (tool->GetKind() == wxITEM_RADIO) );        if ( !curIsRadio )        {            if ( tool->IsToggled() )                DoToggleTool( tool, true );        }        else        {            if ( !lastIsRadio )            {                if ( tool->Toggle( true ) )                {                    DoToggleTool( tool, true );                }            }            else if ( tool->IsToggled() )            {                if ( tool->IsToggled() )                    DoToggleTool( tool, true );                wxToolBarToolsList::compatibility_iterator  nodePrev = node->GetPrevious();                while ( nodePrev != NULL )                {                    wxToolBarToolBase   *toggleTool = nodePrev->GetData();                    if ( (toggleTool == NULL) || !toggleTool->IsButton() || (toggleTool->GetKind() != wxITEM_RADIO) )                        break;                    if ( toggleTool->Toggle( false ) )                        DoToggleTool( toggleTool, false );                    nodePrev = nodePrev->GetPrevious();                }            }        }        node = node->GetNext();    }    if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )    {        // if not set yet, only one row        if ( m_maxRows <= 0 )            SetRows( 1 );        m_minWidth = maxWidth;        maxWidth = tw;        maxHeight += m_yMargin + kwxMacToolBarTopMargin;        m_minHeight = m_maxHeight = maxHeight;    }    else    {        // if not set yet, have one column        if ( (GetToolsCount() > 0) && (m_maxRows <= 0) )            SetRows( GetToolsCount() );        m_minHeight = maxHeight;        maxHeight = th;        maxWidth += m_xMargin + kwxMacToolBarLeftMargin;        m_minWidth = m_maxWidth = maxWidth;    }#if 0    // FIXME: should this be OSX-only?    {        bool wantNativeToolbar, ownToolbarInstalled;        // attempt to install the native toolbar        wantNativeToolbar = ((GetWindowStyleFlag() & wxTB_VERTICAL) == 0);        MacInstallNativeToolbar( wantNativeToolbar );        (void)MacTopLevelHasNativeToolbar( &ownToolbarInstalled );        if (!ownToolbarInstalled)        {           SetSize( maxWidth, maxHeight );           InvalidateBestSize();        }    }#else    SetSize( maxWidth, maxHeight );    InvalidateBestSize();#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -