Здравствуйте, Кирпа В.А., Вы писали:
КВА>Здравствуйте, Victoria, Вы писали:
V>>как динамически разрешить выделять несколько строк в CListBox?
КВА>А снова попробовать ? КВА>CWnd::ModifyStyle(0, LBS_MULTIPLESEL);
В InitDialog написала
GetDlgItem(IDC_LIST_USER)->ModifyStyle(0, LBS_MULTIPLESEL);
UpdateData(FALSE);
Здравствуйте, Victoria, Вы писали:
V>Здравствуйте, Amor, Вы писали:
A>>Здравствуйте, Victoria, Вы писали:
V>>>как динамически разрешить выделять несколько строк в CListBox?
A>>m_listbox.SetWindowLong( GWL_STYLE, LBS_EXTENDEDSEL | m_listbox.GetWindowLong() )
V> V>SetWindowLong is not a member of 'CListBox'
Да, действительно, почему-то таких нет. Ну это я написал с намеком на WinAPI. Т.е. можно так в чистом Winapi.
Здравствуйте, Vicont, Вы писали:
V>Здравствуйте, Victoria, Вы писали:
V>>Здравствуйте, Кирпа В.А., Вы писали:
КВА>>>Здравствуйте, Victoria, Вы писали:
V>>>>как динамически разрешить выделять несколько строк в CListBox?
КВА>>>А снова попробовать ? КВА>>>CWnd::ModifyStyle(0, LBS_MULTIPLESEL); V>>В InitDialog написала
GetDlgItem(IDC_LIST_USER)->>>ModifyStyle(0, LBS_MULTIPLESEL); V>>UpdateData(FALSE);
V>>Но не получилось
Здравствуйте, Victoria, Вы писали:
V>как динамически разрешить выделять несколько строк в CListBox?
некоторые стили нельзя поменять динамически
Видимо к таким относится и стиль LBS_MULTIPLESEL
Я помню бился головой о стенку когда хотел поменять в едите ES_LEFT на ES_RIGHT
Пришлось старый едит дестроить и на его месте создавать новый (уже с другим стилем)
Может таким путем поступить и с листбоксом?
Здравствуйте, Vicont, Вы писали:
V>Здравствуйте, Vicont, Вы писали:
V>>Здравствуйте, Victoria, Вы писали:
V>>>Здравствуйте, Кирпа В.А., Вы писали:
КВА>>>>Здравствуйте, Victoria, Вы писали:
V>>>>>как динамически разрешить выделять несколько строк в CListBox?
КВА>>>>А снова попробовать ? КВА>>>>CWnd::ModifyStyle(0, LBS_MULTIPLESEL); V>>>В InitDialog написала
GetDlgItem(IDC_LIST_USER)->>>>ModifyStyle(0, LBS_MULTIPLESEL); V>>>UpdateData(FALSE);
V>>>Но не получилось
GetDlgItem(IDC_LIST_USER)->>>>ModifyStyle(LVS_SINGLESEL, LBS_MULTIPLESEL); V>>так попробуй...
V>Извиняюсь, я его с лист контролом спутал
Сделала, но эффекта никакого
Здравствуйте, Кирпа В.А., Вы писали:
КВА>Здравствуйте, Victoria, Вы писали:
V>>как динамически разрешить выделять несколько строк в CListBox?
КВА>некоторые стили нельзя поменять динамически КВА>Видимо к таким относится и стиль LBS_MULTIPLESEL КВА>Я помню бился головой о стенку когда хотел поменять в едите ES_LEFT на ES_RIGHT КВА>Пришлось старый едит дестроить и на его месте создавать новый (уже с другим стилем) КВА>Может таким путем поступить и с листбоксом?
Что-то у меня такое же подозрение...
Может помочь последовательный вызов SetWindowLong и SetWindowPos.
Вот что написано в MSDN:
If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
В попытке найти ответ обнаружил интересную вещь в CListBox
SWORD styleold=GetStyle();//Допустим ответ styleold=0x84c800c4, у меня был такой
ModifyStyle(0,1); //Функция вернула 1, то есть сработала
DWORD stylenew=GetStyle();//Возвратила те же styleold=0x84c800c4 :???:
В функцию ModifyStule() можно подставлять и символьные константы — результат тот же, стиль не меняется.
Наверное, это какая-то особенность CListBox.
V>Что-то у меня такое же подозрение...
Подтверждаю, в MSDN по этому поводу сказано однозначно — стили для ListBox не могут быть изменены на этапе выполнения после создания, так что придётся обходить.
Why do you call Visual Studio 'your bunny'?...
(c) one american colleague
Прошу прощения, нашёл ошибку — стиль меняется, но результат для CListBox тот же.
В MSDN сказано:
Windows can set and clear the following styles over the lifetime of a window: WS_CLIPSIBLINGS, WS_DISABLED, WS_HSCROLL, WS_MAXIMIZE, WS_MINIMIZE, WS_SYSMENU (for MDI child windows), WS_THICKFRAME, WS_VISIBLE, and WS_VSCROLL. Windows will not dynamically set or clear any of the other styles. An application can modify the style state at the GWL_STYLE offset at any time by calling SetWindowLong(hWnd, GWL_STYLE, dwNewLong), but Windows will not be aware that the style has changed. Windows maintains some internal flags on the window style and may use these rather than checking the GWL_STYLE offset of the window data structure.