поменять местами элементы ReBarCtrl. MoveBand(i,j)

Тема в разделе "WASM.WIN32", создана пользователем verelex, 19 окт 2009.

  1. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    Привет.
    Добавляю в Rebar две кнопки и нужно поменять их местами:
    Код (Text):
    1. ...
    2. CReBar  m_wndRebar;
    3. CButton     m_wndButton1, m_wndButton2, m_wndButton3, m_wndButton4;
    4. ...
    5. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    6.     ON_WM_CREATE()
    7.     ON_COMMAND(ID_APP_1, &CMainFrame::OnApp1)
    8.     ON_COMMAND(ID_APP_2, &CMainFrame::OnApp2)
    9. END_MESSAGE_MAP()
    10. ...
    11. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    12. {
    13.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    14.         return -1;
    15.     // create rebar
    16.     if (!m_wndRebar.Create(this))
    17.     {
    18.         TRACE0("Failed to create rebar\n");
    19.         return -1;      // fail to create
    20.     }...
    21. ...
    22. void CMainFrame::OnApp1()
    23. {
    24.     CReBarCtrl& refReBarCtrl = m_wndRebar.GetReBarCtrl();
    25.     if(!m_wndButton1 && !m_wndButton2 && !m_wndButton3 && !m_wndButton4)
    26.     {
    27.         m_wndButton1.Create(L"btn 1",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_MULTILINE,CRect(0, 0, 100, 40),this,0);
    28.         m_wndRebar.AddBar(&m_wndButton1,0,0,RBBS_CHILDEDGE|RBBS_BREAK|RBBS_NOGRIPPER);
    29.         m_wndButton2.Create(L"btn 2",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_MULTILINE,CRect(0, 0, 100, 40),this,1);
    30.         m_wndRebar.AddBar(&m_wndButton2,0,0,RBBS_CHILDEDGE|RBBS_BREAK|RBBS_NOGRIPPER);
    31.         m_wndButton3.Create(L"btn 3",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_MULTILINE,CRect(0, 0, 100, 40),this,2);
    32.         m_wndRebar.AddBar(&m_wndButton3,0,0,RBBS_CHILDEDGE|RBBS_BREAK|RBBS_NOGRIPPER);
    33.         m_wndButton4.Create(L"btn 4",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|BS_MULTILINE,CRect(0, 0, 100, 40),this,3);
    34.         m_wndRebar.AddBar(&m_wndButton4,0,0,RBBS_CHILDEDGE|RBBS_BREAK|RBBS_NOGRIPPER);
    35.         BOOL b = refReBarCtrl.MoveBand(2,0); //<---- возвращает 1, но местами не меняет
    36.         //ExchangeBands(2,0);
    37.     }
    38. }
    39.  
    40. void CMainFrame::OnApp2()
    41. {
    42.     CReBarCtrl& refReBarCtrl = m_wndRebar.GetReBarCtrl();
    43.     if(m_wndButton1 && m_wndButton2 && m_wndButton3 && m_wndButton4)
    44.     {
    45.         m_wndButton1.DestroyWindow();
    46.         refReBarCtrl.DeleteBand(0);
    47.         m_wndButton2.DestroyWindow();
    48.         refReBarCtrl.DeleteBand(1);
    49.         m_wndButton3.DestroyWindow();
    50.         refReBarCtrl.DeleteBand(2);
    51.         m_wndButton4.DestroyWindow();
    52.         refReBarCtrl.DeleteBand(3);
    53.     }
    54. }
    Если я прпвильно понял функция MoveBand(1,0) меняет местами элементы (band)
    Moves a band from one index to another. Или только индексы меняет?
    Как правильно ее использовать? И зачем она нужна если не меняет местами...
    такой код:
    Код (Text):
    1. int CMainFrame::ExchangeBands(int first, int second)
    2. {
    3.     CReBarCtrl& refReBarCtrl = m_wndRebar.GetReBarCtrl();
    4.     int BandCount = (int)refReBarCtrl.GetBandCount();
    5.     if(first==second || BandCount==0 || first>BandCount || second>BandCount) return 1;
    6.     LPREBARBANDINFO prbbi1 = new REBARBANDINFO;
    7.     LPREBARBANDINFO prbbi2 = new REBARBANDINFO;
    8.     BOOL b;
    9.     prbbi1->cbSize = prbbi2->cbSize = sizeof(REBARBANDINFO);
    10.     prbbi1->fMask = prbbi2->fMask = RBBIM_CHILD;
    11.     // get
    12.     b = refReBarCtrl.GetBandInfo(first,prbbi1);
    13.     b = refReBarCtrl.GetBandInfo(second,prbbi2);
    14.     // set
    15.     b = refReBarCtrl.SetBandInfo(first,prbbi2);
    16.     b = refReBarCtrl.SetBandInfo(second,prbbi1);
    17.     //refReBarCtrl.ShowBand(first); // fix; т.к. не показывал последнее значение. Почему?
    18.     if(prbbi1) delete prbbi1;
    19.     if(prbbi2) delete prbbi2;
    20.     return 0;
    21. }
    меняет местами, но только первый раз. При пересоздании кнопок ничего не происходит.
     
  2. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    четыре кнопки
     
  3. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    mynv.ru/rebar777.rar