ФорумыТемы

Новое сообщение

Сообщения темы 'MFC - ListBox с переменными свойствами'

Фильтр:
содержит   Сортировка   

  

gliba 01.12.2006 05:23
Понадобился мне СListBox с переменными свойствами (программирование на MFC). На странице происходит переключение режима и заполнение ListBox'а новыми данными. В зависимости от режима сортировка или есть, или нет. Пробуем m_pListBox->ResetContent(); if( m_iMisc == 2 ) m_pListBox->ModifyStyle( 0, LBS_SORT | WS_HSCROLL | WS_VSCROLL ); else m_pListBox->ModifyStyle( LBS_SORT, WS_HSCROLL | WS_VSCROLL ); Сортировка не меняется. Что за нафиг? Спрашиваем у гугля, есть статья http://www.codeproject.com/combobox/recreatelistbox.asp?df=100&forumid=4402&exp=0&select=367851 Применяем код, работает, но ListBox сжимается при каждом переключении. Пришлось подпорочку коду делать. В итоге // recreate the list box by copying styles etc, and list items // and applying them to a newly created control BOOL RecreateListBox(CListBox* pList, int iHeight=0, LPVOID lpParam=NULL); BOOL RecreateListBox(CListBox* pList, int iHeight, LPVOID lpParam ) { if (pList == NULL) return FALSE; if (pList->GetSafeHwnd() == NULL) return FALSE; CWnd* pParent = pList->GetParent(); if (pParent == NULL) return FALSE; // get current attributes DWORD dwStyle = pList->GetStyle(); DWORD dwStyleEx = pList->GetExStyle(); CRect rc; pList->GetWindowRect(&rc); pParent->ScreenToClient(&rc); // map to client co-ords UINT nID = pList->GetDlgCtrlID(); CFont* pFont = pList->GetFont(); CWnd* pWndAfter = pList->GetNextWindow(GW_HWNDPREV); if( iHeight ) rc.bottom = rc.top + iHeight; // create the new list box and copy the old list box items // into a new listbox along with each item's data, and selection state CListBox listNew; if (! listNew.CreateEx(dwStyleEx, _T("LISTBOX"), _T(""), dwStyle, rc, pParent, nID, lpParam)) return FALSE; listNew.SetFont(pFont); int nNumItems = pList->GetCount(); BOOL bMultiSel = (dwStyle & LBS_MULTIPLESEL || dwStyle & LBS_EXTENDEDSEL); for (int n = 0; n < nNumItems; n++) { CString sText; pList->GetText(n, sText); int nNewIndex = listNew.AddString(sText); listNew.SetItemData(nNewIndex, pList->GetItemData(n)); if (bMultiSel && pList->GetSel(n)) listNew.SetSel(nNewIndex); } if (! bMultiSel) { int nCurSel = pList->GetCurSel(); if (nCurSel != -1) { CString sSelText; // get the selection in the old list pList->GetText(nCurSel, sSelText); // now find and select it in the new list listNew.SetCurSel(listNew.FindStringExact(-1, sSelText)); } } // destroy the existing window, then attach the new one pList->DestroyWindow(); HWND hwnd = listNew.Detach(); pList->Attach(hwnd); // position correctly in z-order pList->SetWindowPos(pWndAfter == NULL ? &CWnd::wndBottom : pWndAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); return TRUE; } void CCanvasDesignConjug::InitListBox() { m_pListBox->ResetContent(); if( m_iMisc == 2 ) m_pListBox->ModifyStyle( 0, LBS_SORT | WS_HSCROLL | WS_VSCROLL ); else m_pListBox->ModifyStyle( LBS_SORT, WS_HSCROLL | WS_VSCROLL ); RecreateListBox( m_pListBox, 240 ); ... }
  



Новое сообщение
 

Послать уведомление по e-mail

Продолжить


Авторизоваться через https://www.pvobr.ru
Логин
Пароль
Регистрация

Авторизоваться через соцсети
Наверх