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

📄 listbox.cpp

📁 wxWidgets 是一个跨平台的 GUI 框架。它给开发人员提供了统一的接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    m_stringArray.Empty() ;    m_dataArray.Empty() ;    MacClear() ;}void wxListBox::DoSetSelection(int N, bool select){    wxCHECK_RET( IsValid(N),        wxT("invalid index in wxListBox::SetSelection") );    MacSetSelection( N , select ) ;    GetSelections( m_selectionPreImage ) ;}bool wxListBox::IsSelected(int N) const{    wxCHECK_MSG( IsValid(N), false,        wxT("invalid index in wxListBox::Selected") );    return MacIsSelected( N ) ;}void *wxListBox::DoGetItemClientData(unsigned int n) const{    wxCHECK_MSG( IsValid(n), NULL,        wxT("invalid index in wxListBox::GetClientData"));    return (void *)m_dataArray[n];}wxClientData *wxListBox::DoGetItemClientObject(unsigned int n) const{    return (wxClientData *) DoGetItemClientData( n ) ;}void wxListBox::DoSetItemClientData(unsigned int n, void *Client_data){    wxCHECK_RET( IsValid(n),        wxT("invalid index in wxListBox::SetClientData") );#if wxUSE_OWNER_DRAWN    if ( m_windowStyle & wxLB_OWNERDRAW )    {        // client data must be pointer to wxOwnerDrawn, otherwise we would crash        // in OnMeasure/OnDraw.        wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes"));    }#endif // wxUSE_OWNER_DRAWN    wxASSERT_MSG( m_dataArray.GetCount() >= (unsigned int) n , wxT("invalid client_data array") ) ;    if ( m_dataArray.GetCount() > (size_t) n )    {        m_dataArray[n] = (char*) Client_data ;    }    else    {        m_dataArray.Add( (char*) Client_data ) ;    }}void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData){    DoSetItemClientData(n, clientData);}// Return number of selections and an array of selected integersint wxListBox::GetSelections(wxArrayInt& aSelections) const{    return MacGetSelections( aSelections ) ;}// Get single selection, for single choice list itemsint wxListBox::GetSelection() const{    return MacGetSelection() ;}// Find string for positionwxString wxListBox::GetString(unsigned int n) const{    return m_stringArray[n]  ;}void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos){    wxCHECK_RET( IsValidInsert(pos),        wxT("invalid index in wxListBox::InsertItems") );    InvalidateBestSize();    unsigned int nItems = items.GetCount();    for ( unsigned int i = 0 ; i < nItems ; i++ )    {        m_stringArray.Insert( items[i] , pos + i ) ;        m_dataArray.Insert( NULL , pos + i ) ;        MacInsert( pos + i , items[i] ) ;    }    m_noItems += nItems;}void wxListBox::SetString(unsigned int n, const wxString& s){    m_stringArray[n] = s;    MacSet(n, s);}wxSize wxListBox::DoGetBestSize() const{    int lbWidth = 100;  // some defaults    int lbHeight = 110;    int wLine;    {        wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ;        if ( m_font.Ok() )        {            ::TextFont( m_font.GetMacFontNum() ) ;            ::TextSize( m_font.GetMacFontSize() ) ;            ::TextFace( m_font.GetMacFontStyle() ) ;        }        else        {            ::TextFont( kFontIDMonaco ) ;            ::TextSize( 9  );            ::TextFace( 0 ) ;        }        // Find the widest line        for(unsigned int i = 0; i < GetCount(); i++) {            wxString str(GetString(i));        #if wxUSE_UNICODE            Point bounds={0,0} ;            SInt16 baseline ;            ::GetThemeTextDimensions( wxMacCFStringHolder( str , m_font.GetEncoding() ) ,                kThemeCurrentPortFont,                kThemeStateActive,                false,                &bounds,                &baseline );            wLine = bounds.h ;        #else            wLine = ::TextWidth( str.c_str() , 0 , str.length() ) ;        #endif            lbWidth = wxMax(lbWidth, wLine);        }        // Add room for the scrollbar        lbWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);        // And just a bit more        int cy = 12 ;        int cx = ::TextWidth( "X" , 0 , 1 ) ;        lbWidth += cx ;        // don't make the listbox too tall (limit height to around 10 items) but don't        // make it too small neither        lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10);    }    return wxSize(lbWidth, lbHeight);}unsigned int wxListBox::GetCount() const{    return m_noItems;}void wxListBox::SetupColours(){    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));    SetForegroundColour(GetParent()->GetForegroundColour());}void wxListBox::Refresh(bool eraseBack, const wxRect *rect){    wxControl::Refresh( eraseBack , rect ) ;    //    MacRedrawControl() ;}#if wxUSE_OWNER_DRAWNclass wxListBoxItem : public wxOwnerDrawn{public:    wxListBoxItem(const wxString& str = wxEmptyString);};wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, false){    // no bitmaps/checkmarks    SetMarginWidth(0);}wxOwnerDrawn *wxListBox::CreateItem(size_t n){    return new wxListBoxItem();}#endif  //USE_OWNER_DRAWN// ============================================================================// list box control implementation// ============================================================================/*void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon){wxListBox*          list;// typecast our refConlist = (wxListBox*)refCon;  MoveTo(cellRect->left + 4 , cellRect->top + 10 );  const wxString text = list->m_stringArray[lCell.v] ;  ::TextFont( kFontIDMonaco ) ;  ::TextSize( 9  );  ::TextFace( 0 ) ;  DrawText(text, 0 , text.length());    }*/void wxListBox::MacDelete( int N ){    LDelRow( 1 , N , (ListHandle)m_macList) ;    Refresh();}void wxListBox::MacInsert( int n , const wxString& text){    Cell cell = { 0 , 0 } ;    cell.v = n ;    LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;    //    LSetCell(text, strlen(text), cell, m_macList);    Refresh();}void wxListBox::MacAppend( const wxString& text){    Cell cell = { 0 , 0 } ;    cell.v = (**(ListHandle)m_macList).dataBounds.bottom ;    LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;    //   LSetCell(text, strlen(text), cell, m_macList);    Refresh();}void wxListBox::MacClear(){    LDelRow( (**(ListHandle)m_macList).dataBounds.bottom , 0 ,(ListHandle) m_macList ) ;    Refresh();}void wxListBox::MacSetSelection( int n , bool select ){    Cell cell = { 0 , 0 } ;    if ( ! (m_windowStyle & wxLB_MULTIPLE) )    {        if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )        {            LSetSelect( false , cell , (ListHandle)m_macList ) ;        }    }    cell.v = n ;    LSetSelect( select , cell , (ListHandle)m_macList ) ;    LAutoScroll( (ListHandle)m_macList ) ;    Refresh();}bool wxListBox::MacIsSelected( int n ) const{    Cell cell = { 0 , 0 } ;    cell.v = n ;    return LGetSelect( false , &cell , (ListHandle)m_macList ) ;}void wxListBox::MacDestroy(){    //    DisposeExtLDEFInfo( m_macList ) ;}int wxListBox::MacGetSelection() const{    Cell cell = { 0 , 0 } ;    if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )        return cell.v ;    else        return -1 ;}int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const{    int no_sel = 0 ;    aSelections.Empty();    Cell cell = { 0 , 0 } ;    cell.v = 0 ;    while ( LGetSelect( true , &cell ,(ListHandle) m_macList ) )    {        aSelections.Add( cell.v ) ;        no_sel++ ;        cell.v++ ;    }    return no_sel ;}void wxListBox::MacSet( int n , const wxString& text ){    // our implementation does not store anything in the list    // so we just have to redraw    Cell cell = { 0 , 0 } ;    cell.v = n ;    //  LSetCell(text, strlen(text), cell, m_macList);    Refresh();}void wxListBox::MacScrollTo( int n ){    // TODO implement scrolling}void wxListBox::OnSize( wxSizeEvent &event){    Point pt;#if TARGET_CARBON    GetListCellSize((ListHandle)m_macList, &pt);#else    pt = (**(ListHandle)m_macList).cellSize ;#endif    pt.h =  m_width - 15  ;    LCellSize( pt , (ListHandle)m_macList ) ;}void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED(mouseStillDown)){    Boolean wasDoubleClick = false ;    long    result ;    ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick  , &result ) ;    if ( !wasDoubleClick )    {        MacDoClick() ;    }    else    {        MacDoDoubleClick() ;    }}void wxListBox::MacSetRedraw( bool doDraw ){    LSetDrawingMode( doDraw , (ListHandle)m_macList ) ;}void wxListBox::MacDoClick(){    wxArrayInt aSelections;    int n ;    size_t count = GetSelections(aSelections);    if ( count == m_selectionPreImage.GetCount() )    {        bool hasChanged = false ;        for ( size_t i = 0 ; i < count ; ++i )        {            if ( aSelections[i] != m_selectionPreImage[i] )            {                hasChanged = true ;                break ;            }        }        if ( !hasChanged )        {            return ;        }    }    m_selectionPreImage = aSelections;    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);    event.SetEventObject( this );    if ( count > 0 )    {        n = aSelections[0];        if ( HasClientObjectData() )            event.SetClientObject( GetClientObject(n) );        else if ( HasClientUntypedData() )            event.SetClientData( GetClientData(n) );        event.SetString(GetString(n));    }    else    {        n = -1;    }    event.SetInt(n);    GetEventHandler()->ProcessEvent(event);}void wxListBox::MacDoDoubleClick(){    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);    event.SetEventObject( this );    GetEventHandler()->ProcessEvent(event) ;}void wxListBox::OnChar(wxKeyEvent& event){    if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER)    {        wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);        if ( tlw && tlw->GetDefaultItem() )        {            wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton);            if ( def && def->IsEnabled() )            {                wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() );                event.SetEventObject(def);                def->Command(event);                return ;            }        }        event.Skip() ;    }    /* generate wxID_CANCEL if command-. or <esc> has been pressed (typically in dialogs) */    else if (event.GetKeyCode() == WXK_ESCAPE || (event.GetKeyCode() == '.' && event.MetaDown() ) )    {        // FIXME: look in ancestors, not just parent.        wxWindow* win = GetParent()->FindWindow( wxID_CANCEL ) ;        if (win)        {            wxCommandEvent new_event(wxEVT_COMMAND_BUTTON_CLICKED,wxID_CANCEL);            new_event.SetEventObject( win );            win->GetEventHandler()->ProcessEvent( new_event );        }    }    else if ( event.GetKeyCode() == WXK_TAB )    {        wxNavigationKeyEvent new_event;        new_event.SetEventObject( this );        new_event.SetDirection( !event.ShiftDown() );        /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */        new_event.SetWindowChange( event.ControlDown() );        new_event.SetCurrentFocus( this );        if ( !GetEventHandler()->ProcessEvent( new_event ) )            event.Skip() ;    }    else if ( event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_UP )    {        // perform the default key handling first        wxControl::OnKeyDown( event ) ;        wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);        event.SetEventObject( this );        wxArrayInt aSelections;        int n, count = GetSelections(aSelections);        if ( count > 0 )        {            n = aSelections[0];            if ( HasClientObjectData() )                event.SetClientObject( GetClientObject(n) );            else if ( HasClientUntypedData() )                event.SetClientData( GetClientData(n) );            event.SetString(GetString(n));        }        else        {            n = -1;        }        event.SetInt(n);        GetEventHandler()->ProcessEvent(event);    }    else    {        if ( event.GetTimestamp() > m_lastTypeIn + 60 )        {            m_typeIn = wxEmptyString ;        }        m_lastTypeIn = event.GetTimestamp() ;        m_typeIn += (char) event.GetKeyCode() ;        int line = FindString(wxT("*")+m_typeIn+wxT("*")) ;        if ( line >= 0 )        {            if ( GetSelection() != line )            {                SetSelection(line) ;                wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);                event.SetEventObject( this );                if ( HasClientObjectData() )                    event.SetClientObject( GetClientObject( line ) );                else if ( HasClientUntypedData() )                    event.SetClientData( GetClientData(line) );                event.SetString(GetString(line));                event.SetInt(line);                GetEventHandler()->ProcessEvent(event);            }        }    }}#endif // wxUSE_LISTBOX

⌨️ 快捷键说明

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