Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Особенности CComboBox в VisualStudio2005  (Прочитано 24787 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tuborg
Команда клуба

ee
Offline Offline

« : 08-03-2007 06:22 » 

Народ, кто понимает, как изменилось общение с CComboBox в VS2005? В редакторе ресурсов теперь нельзя изменять размер границ вниз. Но без этого не видно раскрывающегося списка. Пробовал поменять вручную при помощи SetWindowPos:

Код:
FormatsComboCtrl.SetWindowPos(NULL,0,0,100,300,SWP_NOMOVE);


после этого делаю AddString элементов списка, результат - список открывается, но лишь на высоту примерно в 30 пикселов, несмотря на то что я ставлю в SetWindowPos.... что 30, что 100, что 300 - результат один. Список открывается на 30 пикселов, и при этом остаётся пустым.

Открыл пример из MSDN'а, там этот контрол создаётся динамически:

Код:
m_wndStyleBar.GetItemRect(0, &rect);
rect.top = 3;
rect.bottom = rect.top + 100;
m_comboBox.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP, rect, &m_wndStyleBar, IDW_COMBO)

попытался у себя сделать, тоже динамически. Вместо &m_wndStyleBar вставил this->FromHandle(this->GetSafeHwnd()). Запускается, это место проходит на ура, выыполняется OnPaint без всяких эксцессов, OnSize и прочее, но потом всё падает где-то во внутренностях MFC. Debug Assertion Failed! WinCore.cpp, Line: 624. При этом мой m_comboBox был создан из ресурса и имел связь через DDX_Control.

Решил сделать без DDX. Т.е. локально вызвал конструктор CComboBox, затем создал элемент при помощи Create и связал его с ID, даже память выделил на всякий случай:

Код:
CComboBox  FormatsComboCtrl;
FormatsComboCtrl.InitStorage(10,256);
FormatsComboCtrl.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP, rect, this->FromHandle(this->GetSafeHwnd()), IDC_FORMATS_COMBO);

Результат - Debug Assertion Failed в AfxWin.inl. Без InitStorage, assert не выскакивает, но и ComboBox от этого не начинает правильно работать, т.е. не разворачивается.

Подскажите пожалуйста - куда дальше копать?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 08-03-2007 09:14 » 

В редакторе ресурсов теперь нельзя изменять размер границ вниз.

Как это нельзя? ВСё можно!

Сначала кликаешь на кнопку расрытия списка, после этого можно тянуть вниз. ИМХО так всегда было.


* ss1.jpg (6.63 Кб - загружено 848 раз.)
* ss2.jpg (7.32 Кб - загружено 871 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #2 : 08-03-2007 16:03 » 

 Улыбаюсь) Спасибо. Ключевым оказалось слово - кликнуть по кнопке раскрытия списка. Раньше можно было кликнуть по любому месту комбобокса и тянуть его в разные стороны. Теперь же если не кликнуть а кнопку раскрытия - тянуть можно лишь влево и вправо.  С ума сойти...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 08-03-2007 16:33 » 

Раньше можно было кликнуть по любому месту комбобокса и тянуть его в разные стороны.

Хм... а ты студию ни с чем другим не путаешь? Ща специально проверил. В 6ой,  dot NET 2003 и 2005 - во всех сначала надо "раскрыть" список, а потом устанавливать его высоту.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #4 : 08-03-2007 17:12 » 

У меня стоит ещё и 6я - проверил. Моя 6я соответствует ранее сказанному  Да-да 4й и 5й под рукой нет, но помню тож проблем не было. Хотя там я не VC использовал.

Ещё попутный вопрос - теперь комбобокс работает, только при открытии показывает якобы пустой список. Но если кликнуть по нему, например по 1й строчке, то выберется первый элемент из списка,  который я в InitDialog'e первым добавлял. После выбора GUI странновато подвисает. Какие ещё надо совершить телодвижения, чтобы комбобокс заработал? Или это мои личные баги какие-то?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 09-03-2007 09:07 » 

Хотя там я не VC использовал.

Аааа ну понятно. Я-то только про С++ говорил, поскольку ты это в тему по С++ написал. Ага А в нём всё так было с 6ой версии точно. Можно конечно ради спортивного интереса поставить пятёрку, только время жалко.

Цитата
Или это мои личные баги какие-то?

Ага, баг номер один  Ага - забыл уточнить на чём ты это делаешь? На С++ у меня подобных проблем не было.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #6 : 09-03-2007 11:26 » 

Да.... тогда это всё на Фортране делалось...  Отлично Сейчас C++. пытаюсь modeless приложение сделать. Типа есть одно диалоговое окно и оно немодальное. Оказался изврат ещё тот... пришлось в InitInstance() писать что-то вроде своего обработчика событий...  правда на заглушках типа switch...default и перенаправляя на стандартное, где-то сокрытое в недрах MFC обработчик сообщений. Мне разве что предъявляется для использования процедуры OnPaint, OnLBClick...  и т.д. В принципе стандартная ситуация в MFC =). Пока с эти извратом проблем не наблюдается... Буду искать в чём проблема у ComboBox'a... может с чем то этим и связана...
« Последнее редактирование: 09-03-2007 12:41 от Tuborg » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 09-03-2007 11:33 » 

Так, стоп. Сначала, что значит "немодальное приложение"? Одно диалоговое окно - немодальное - понятно. Но чтоб приложение было немодальным... Не понял

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #8 : 09-03-2007 12:40 » 

ну главное окно приложения - немодальное =). см. в MSDN "MODELESS sample"
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #9 : 09-03-2007 13:32 » 

Я вот задался вопросом - а в каком случае для контрола необходимо создавать класс? может это мой случай? Комбобокс не реагирует на мою мышу... только на клавиатуру (стрелки вверх и вниз) и при открытии не отрисовывает содержимое списка. Нажимаешь вверх или вниз - отрисовывает только под курсором. Enter -производит выбор и комбобокс закрывается. На мышу - ноль внимания. Похоже все мышиные сообщения до него не добираются...

Вернул главное окно к модальному типу. Всё заработало нормально. Видно и вправду глюк где-то в распределении сообщений в моём InitInstance:
Код:
dlg=new CWin_CCDlg();
dlg->Create(IDD_WIN_CC_DIALOG,0); // включить когда окно немодальное
m_pMainWnd = dlg;

// dlg->DoModal(); // включить когда окно модальное
dlg->ShowWindow(SW_SHOW); // включить когда окно немодальное
        dlg->SetActiveWindow();

 // Заглушка для диспетчера приложений. Без неё (без цикла) программа завершается сразу
    do {
bRet = GetMessage( &msg, dlg->GetSafeHwnd(), 0, 0 );
if (bRet == -1)
        {
break;
        }
        else
        {
            TranslateMessage(&msg); //translates virtual-key messages into character messages
    DispatchMessage(&msg);

}
    } while( bRet!= 0);

m_pMainWnd = NULL;

Где-то в "заглушке" накосячил?  А черт его знает...
« Последнее редактирование: 09-03-2007 14:04 от Tuborg » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 09-03-2007 15:01 » 

ну главное окно приложения - немодальное =). см. в MSDN "MODELESS sample"

Дык это ж не приложение НЕмодальное!

А в диалоговом приложении показано создание немодального диалога. Поэтому повторяю вопрос - что значит немодальное приложение? В чём его отличие от модального приложения? Что же ты всё-таки хочешь сделать? И почему тебе нужно именно НЕмодальное приложение?

ИМХО - заморочка начинается с этого. Вероятней всего ты создаёшь ненужные трудности и героически стараешься их преодолеть. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #11 : 09-03-2007 15:31 » 

С героическими трудностями - это у меня по жизни так... Люблю ходить сквозь стены.  Сколько об стенку не бейся...

Хотел создать обычное приложение без использования всяких Визардов, т.е. ручками но на MFC. Изучаю внутренности MFC. Ну и попути создал приложение с немодальным окном, потомучто по моей логике - немодальное окно проще модального  Уже туплю ну логика у мну такая. Щас ужо плюнул, сделал модальное окно. Мне раньше было трудновато без знаний внутренностей MFC. Все эти загогулины MFCшные про IMPLEMENT_SERIAL, DDX... и прочее для меня было китайской грамотой. Сейчас немного продвинулся в понимании.  Больше гари - меньше ям А изначально нужно было для того - что устал от Delphi. Там с этими компонентами... не всё всегда работает как надо и всё это довольно трудно исправить под то как надо. Взять к примеру те же сокеты... И в результате с ростом приложения - приложение становится всё больше и больше уязвимее.. например был случай, когда в StringGrid надо было в течении 2х месяцев выводить значения... так вскрытие показало... что оно там использует офигенный массив. И эта офигенность заканчивается к примеру через неделю.... ну много таких неприятностей там есть. Раньше я копался в своих железяках, а клиентскую часть на PC делали сторонние (скорее всего - потусторонние  В капусту порублю!).  А результат - всегда портил и внешний вид конечного изделия...  Нехороший человек и все мои потуги в железе по ускорению и оптимизации... решил делать этим потусторонним людям на каждое своё изделие что-то типа SDK с примером. Да задумался как бы при этом не сильно отвлекаться от своего первичного назначения. Пришёл к тому что много кусков кода крутящегося на железяке надо просто вставлять в клиента и должно работать (например работа протоколов, обработка результатов и прочее). Так без знаний структуры энтого MFC просто так набор классов не присоединишь к проекту предварительно (а даже и зачастую - заново) не обработав напильником. Сейчас вся картина немного проясняется....  решил сделать один большой пример с диалогом для всех последующих своих SDK (специфика такая, что пример может быть всегда одинаково выглядеть), и отдать его....  вот контролы и мучаю... отгоняя от себя помыслы запуска Wizard'ов. И все подводные камни зачастую связаны именно с тем, что ручками делается, и надо правильно передавать управление туда куда надо....
« Последнее редактирование: 09-03-2007 15:34 от Tuborg » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 09-03-2007 16:12 » 

Ок, понял.

Значица так. Если ты действительно хочешь в дальнейшем приложения с MFC делать, то немного теории не помешает.

Сразу оговорюсь о модальности/немодальности. На самом деле модальное окно гораздо проще немодального. Тк в этот момент именно оно получает все сообщения, а остальная часть проги залокирована, те все твои действия происходять в этом модальном окне. Поэтму мне и не понятно было понятие "немодальное приложение" тк непонятно к чему оно должно быть немодальными? К системе?

Немодальное же окно призвано как раз-таки избавится от этого недостатка. Например тебе нужно работать в основном окне периодически воводя данные (координаты) для неких элементов или контролировать изменение этих самых координат при перетаскивании элементов.

Ок? Те немодальное - это особый случай. Чаще всего используются модальные диалоги открыл-поработал-закрыл.

Теперь по MFC

1. Самое главное MFC - это не некая загадочная библиотека оторванная от винды, а просто упаковка для API. По сути все среды являются такими оболочками - Borland, .NET и тд.

2. Я уже где-то на форме приводил пример как например MFC скрывает хэндл окна в классе CWnd - поищи, там всё просто.

3. Что гораздо сложней - организация передачи сообщений между классами. Это тема хорошо раскрыта в переводе статьи на РСДНе.
http://www.rsdn.ru/article/mfc/maze.xml

4. Просто совет - обзавестись аддоном к студии VisualAssist - эта штука позволяет свободно разгуливать по исходникам, что ессно облегчает понимание работы того или иного кода.
Например

DDX_Text(pDX, IDC_LM_SCALE_LAB1, m_stScale);

"прыгаем"  в dlgdata.cpp и видим:
Код:
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value)
{
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
        if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);
value.ReleaseBuffer();
}
else
{
AfxSetWindowText(hWndCtrl, value);
}
}

ничего сложного. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #13 : 09-03-2007 17:13 » 

Спасибо, походил по ссылкам, стало немного понятнее... А в Visual Studio MFC - единственная "оболочка"... Wizard предлагает ещё какую-то ATL - но я так понял это типа для WEB-based приложений ... а ещё где-то в сети натыкался на буквосочетание WTL. На чём сейчас принято вообще писать (не относящееся к .NET)?
Записан
ChinChik
Гость
« Ответ #14 : 01-08-2007 11:39 » 

А такой вопрос по CComboBox!!!
Если объект CComboBox создается вручную через CComboBox::Create, как изменить размеры расрывающегося списка?
А то щелкаешь типа "раскрыть список", а он появляется с высотой 2 пиксела. Жаль
В MSDN ничего не нашел.
Может кто знает, подскажите плз.
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #15 : 02-08-2007 11:32 » 

ChikChik, а пример из самого первого поста разве не катит?
Записан
vakarev_dmitri
Гость
« Ответ #16 : 03-12-2008 17:00 » 

решение изначальной задачи..

CComboBox *m_pcCity;
m_pcCity = new CComboBox;
m_pcCity->Create(CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE,CRect(170,50,285,70),this,IDE_SCParamAdd);

m_pcCity->MoveWindow(CRect(170,50,285,110),1);

короче сначала создаем с одними размерами,
потом перемещаем и комбобокс норм открывается

Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #17 : 04-12-2008 09:21 » 

Джон,

VisualAssist хорошая вещь, но платная же, зараза...  Жаль Я зол!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 04-12-2008 11:32 » 

Ир, "так напышы своим, нехай вышлють" (с) Ага

Но не дорогая же зараза, у нас шеф без б. для всех купил лицензии, ибо без него как без рук.

зы А чего это вы решили такую старую темку поднять?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #19 : 04-12-2008 13:38 » 

Да просто ты написал "проинсталлируй", а я как-то сразу вспомнила, что это же не бесплатный продукт, просто так на комп не посадишь.
Кстати, наш шеф в свое время сказал, что можно и без этого жить... Купили потом или нет - уже не знаю, т.к. 4 года уже сижу у клиентов и в контору не попадаю.
А какая ситуевина на фирме у Tuborg - я не знаю.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 04-12-2008 14:07 » 

Ага, а написал я про это полтора года назад. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #21 : 05-12-2008 09:36 » 

Джон,
прости больную на голову!  Здесь была моя ладья...  Краснею Я больше не буду!  Скромно так...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines