Страница: 1 |
Страница: 1 |
Вопрос: API Listbox
Добавлено: 31.05.06 15:31
Автор вопроса: rebel | ICQ: 36063058
В порыве своих суицидальных фантазий решил написать свой ListBox и вот сталкнулся с проблемой:
При нажатии DropDown Button должен выскакивать список (обычный, как у стандартного комбобокса). Список создаю так
CreateWindowEx(dwStyleEx, "ListBox", "myList", WS_VISIBLE Or WS_POPUPOr dwStyle, nLeft, nTop, nWidth, nHeight, hParent, 0, App.hInstance, ByVal 0)
Список создается, НО! При попытке добавить значение в этот список ничего не получается!!!
Добавляю так:
SendMessage hList, LB_ADDSTRING, 0, ByVal "test1"
Если создавать список так:
CreateWindowEx(dwStyleEx, "ListBox", "myList", WS_VISIBLE Or WS_CHILD Or dwStyle, nLeft, nTop, nWidth, nHeight, hParent, 0, App.hInstance, ByVal 0)
То все работает как надо!
Вопрос: как все же добавлять в список значения с флагом WS_POPUP?
Или возможны альтернативные варианты создания всплывающего листа?
Заранее спасибо!
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #1
Добавлено: 01.06.06 12:14
Альтернатива - делать видимым обычный контрол ComboBox.
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 01.06.06 14:21
Альтернатива - читать msdn.
К каким окнам может быть применено WS_POPUP.
делаешь для листбокса окно-родитель без заголовка, и на нём создаешь свой листбокс так, чтобы он полностью закрывал родителя. Когда нужно чтобы список всплыл - показываешь родителя.
Номер ответа: 3
Автор ответа:
rebel
ICQ: 36063058
Вопросов: 1
Ответов: 3
Профиль | | #3
Добавлено: 01.06.06 16:09
Да, такая мысль у меня была! Но вот не могу найти название класса (Просто форма), что бы можно было создать ее через CreateWindowEx.
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 01.06.06 16:19
А обязательно создавать его через CreateWindowEx?
Ну если уж так надо - RegisterClassEx и CreateWindowEx.
Номер ответа: 5
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #5
Добавлено: 01.06.06 16:39
Можно родителем обычную vb-форму использовать.
Если охота самому сделать - регистрируешь класс.
Название - любое, например "mysuperpuperclass".
Заполняешь структуру для передачи в RegisterClassEx и вызываешь. Если всё нормально заполнил - ф-ция вернет ненулевой результат.
И затем создаёшь окно своего класса.
Заодно напишешь WndProc (она будет совсем простенькая)
Номер ответа: 6
Автор ответа:
rebel
ICQ: 36063058
Вопросов: 1
Ответов: 3
Профиль | | #6
Добавлено: 01.06.06 16:50
Самому делать не охота!!! НО, когда используешь vb форму, в качестве родителя, то есть один маленький нюанс, а именно, если этот контрол в будущем будет стоять в модальной форме, то открытия списка (в нашем случаи родительскую форму немодальную) приводит естественно к ошибке. Попробую зарегистрировать свою форму…. 8)
Номер ответа: 7
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #7
Добавлено: 01.06.06 17:54
С чего это вдруг открытие списка приводит к ошибке?
Если ты хочешь заполнять список из того кода, который вызвал модальную форму, естественно ничего не получится. Заполнять лист надо в Form_Load той формы, где листбокс.
Номер ответа: 8
Автор ответа:
rebel
ICQ: 36063058
Вопросов: 1
Ответов: 3
Профиль | | #8
Добавлено: 01.06.06 18:18
В общем, проблема разрешилась! Всем спасибо за советы. На днях попробую зарегистрировать свой класс.
Решение проблемы:
По запаре не заметил, что при создании окна, помимо прочих флагов, передавался еще и LBS_OWNERDRAWFIXED! В нем вся проблема и была. Сказывается не большой опыт работы с api! Сори
Номер ответа: 9
Автор ответа:
SRV
ICQ: 254226129
Вопросов: 30
Ответов: 107
Профиль | | #9
Добавлено: 01.06.06 18:33
Да можно просто взять пример SNE и все дела