Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
Здравствуйте pesticide, Вы писали:
P>Хайолл!
P>Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
P>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
P>Заранее благодарен.
P>Алексей
Здравствуйте pesticide, Вы писали:
P>Хайолл!
P>Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
P>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
P>Заранее благодарен.
P>Алексей
Знаете ли вы, что ListBox ComboBox-а НЕ находится за его пределами. Высота Combobox как правило от 100-150 пикселей, реальная видимая 20-30. Почему ? А потому что он не зарисовывает ВСЮ свою область. Можно же сделать ValidateRect даже если ничего не рисовал...
Здравствуйте pesticide, Вы писали:
P>Хайолл!
P>Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
P>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
P>Заранее благодарен.
P>Алексей
Нужно создавать окно как popup window, но MFC не позволяет делать окно через CWnd.Create(...) одновременно и child и popup, я делал так — CWnd::CreateEx(NULL,NULL,NULL,WS_POPUP|WS_CHILD|WS_CLIPSIBLINGS,0,0,10,10,pParentWnd->GetSafeHwnd(),0,0)
Хотя в MSDN написано что нельзя использовать оба стиля, но как ни странно работает.
Чтобы писать программы голова не нужна, нужна клавиатура.
Re[2]: Q: дочернее окно за пределами родителя. Как?
D>Хотя в MSDN написано что нельзя использовать оба стиля, но как ни странно работает.
Раз написано что низзя — то лучше не исспользовать ибо нет гарантии что в следующей версии виндов эта странность с работоспособностью сохраниться
Саша.
Re[2]: Q: дочернее окно за пределами родителя. Как?
От:
Аноним
Дата:
22.11.01 20:59
Оценка:
Здравствуйте KoraK, Вы писали:
KK>Здравствуйте pesticide, Вы писали:
P>>Хайолл!
P>>Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
P>>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
P>>Заранее благодарен.
P>>Алексей
KK>Код покажи.
код примерно такой
m_pPad = new CWnd; //это подложка, на которой располагается список
m_pPad->CreateEx(WS_EX_TOOLWINDOW, "DfgComboPad", NULL, WS_CHILD, CRect(0,0,0,0), GetDesktopWindow(), 999);
m_pListBox = new CDfgListBox(m_nMRUlen, m_nMatchLen);
m_pListBox->Create(LBS_HASSTRINGS|LBS_OWNERDRAWFIXED|WS_VSCROLL|WS_CHILD, r, m_pPad, 10);
m_pListBox->SetWindowPos(NULL, 0,0,0,0,SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
m_pListBox->m_pCombo = this;
в MSDN написано, что выпадающий список является ребенком desktop-окна:
"However, the ComboLBox (list box) window for combo boxes that have the CBS_DROPDOWN or CBS_DROPDOWNLIST style is not a child of the ComboBox window. Instead, each ComboLBox window is a child of the desktop window."
но если задать родителя как GetDesktopWindow(), то окно не получает сообщений ни мыши ни клавиатуры и даже шпионом не видится. почему?
Re[2]: Q: дочернее окно за пределами родителя. Как?
От:
Аноним
Дата:
22.11.01 21:07
Оценка:
Здравствуйте adontz, Вы писали:
A>Здравствуйте pesticide, Вы писали:
P>>Хайолл!
P>>Я хочу разработать элемент управления с выпадающим списком по типу комбобокса, но никак не могу заставить нормально появляться список за пределами окна элемента управления.
P>>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
P>>Заранее благодарен.
P>>Алексей A>Знаете ли вы, что ListBox ComboBox-а НЕ находится за его пределами. Высота Combobox как правило от 100-150 пикселей, реальная видимая 20-30. Почему ? А потому что он не зарисовывает ВСЮ свою область. Можно же сделать ValidateRect даже если ничего не рисовал...
Здесь я готов спорить. В том же MSDN-е написано, что выпадающий список даже имеет свой класс окна (ComboLBox) а текст гласит:"Instead, each ComboLBox window is a child of the desktop window. This is required so that, when the drop-down list box is dropped, it can extend outside the application window or dialog box. Otherwise, the list box would be clipped at the window or dialog box border".
Еще один довод: если навести курсор шпиона на люой комбобокс, то он покажет именно те границы элемента, которые видны.
З.Ы.
Краем уха, когда-то слышал, что мелкософт, вроде бы, собиралась открыть часть кодов винды. Кто-нибудь об этом, что-нибудь слышал? Интересно было бы посмотреть на код классов ComboBox и ComboLBox.
Re[3]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте Аноним, Вы писали:
A>>Знаете ли вы, что ListBox ComboBox-а НЕ находится за его пределами. Высота Combobox как правило от 100-150 пикселей, реальная видимая 20-30. Почему ? А потому что он не зарисовывает ВСЮ свою область. Можно же сделать ValidateRect даже если ничего не рисовал...
То, что написано выше, достаточно далеко от действительности. Действительно, в редакторе диалогов указывается размер с учетом выпадающего списка, но это не значит, что во время выполнения окно ComboBox имеет такой размер. На самом деле, размер у окна такой, каким его видно.
А>Здесь я готов спорить. В том же MSDN-е написано, что выпадающий список даже имеет свой класс окна (ComboLBox) а текст гласит:"Instead, each ComboLBox window is a child of the desktop window. This is required so that, when the drop-down list box is dropped, it can extend outside the application window or dialog box. Otherwise, the list box would be clipped at the window or dialog box border".
"a child of the desktop window" = окно со стилем WS_POPUP или WS_OVERLAPPED. К стилю WS_CHILD эта фраза отношения не имеет, хотя ее и можно прочитать таким образом.
А>Еще один довод: если навести курсор шпиона на люой комбобокс, то он покажет именно те границы элемента, которые видны.
Несомненно.
-- Alex Fedotov
Re[4]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Аноним, Вы писали:
AF>"a child of the desktop window" = окно со стилем WS_POPUP или WS_OVERLAPPED. К стилю WS_CHILD эта фраза отношения не имеет, хотя ее и можно прочитать таким образом.
А вот и не правда — здесь надо понимать буквально — он ComboLBox действительно является чайлдом Decktop!
Вот такой код работает:
[cccode]
BOOL CMyPopup::Create(CPoint& ptLeftTop, CWnd* pParent)
{
return CWnd::CreateEx(WS_EX_PALETTEWINDOW, strClassName, _T (""),
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
ptLeftTop.x, ptLeftTop.y,
100, 100,
::GetDesktopWindow(),
NULL);
}
[/ccode]
Re[5]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте migel, Вы писали:
AF>>"a child of the desktop window" = окно со стилем WS_POPUP или WS_OVERLAPPED. К стилю WS_CHILD эта фраза отношения не имеет, хотя ее и можно прочитать таким образом.
M>А вот и не правда — здесь надо понимать буквально — он ComboLBox действительно является чайлдом Decktop! M>Вот такой код работает:
А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
-- Alex Fedotov
Re[6]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте migel, Вы писали:
AF>А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
Замечательно, Spy++ устроит? Только не надо говорить что там установлен WS_OVERLAPPED стиль — так как это стиль по умолчанию (имеет значение 0) то WS_CHILD его перекрывает.
Re[7]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте migel, Вы писали:
M>Здравствуйте Alex Fedotov, Вы писали:
AF>>Здравствуйте migel, Вы писали:
AF>>А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
M> Замечательно, Spy++ устроит? Только не надо говорить что там установлен WS_OVERLAPPED стиль — так как это стиль по умолчанию (имеет значение 0) то WS_CHILD его перекрывает.
Только расскажи технологию, с помощью которой и Spy++ можно увидеть свойства окна выпадающего списка. Я как не пытался, у меня выпадающий список успевал исчезнуть.
-- Alex Fedotov
Re[8]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте Alex Fedotov, Вы писали:
AF>>>А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
M>>:super: Замечательно, Spy++ устроит? Только не надо говорить что там установлен WS_OVERLAPPED стиль — так как это стиль по умолчанию (имеет значение 0) то WS_CHILD его перекрывает.
AF>Только расскажи технологию, с помощью которой и Spy++ можно увидеть свойства окна выпадающего списка. Я как не пытался, у меня выпадающий список успевал исчезнуть.
А, стормозил, как обычно. Я почему-то думал, что выпадающий список динамически создается (в Win 3.1 что-ли так было?), а они вот все, как на ладони.
Поздравляю, опроверг.
-- Alex Fedotov
Re[9]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Alex Fedotov, Вы писали:
AF>>>>А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
M>>> Замечательно, Spy++ устроит? Только не надо говорить что там установлен WS_OVERLAPPED стиль — так как это стиль по умолчанию (имеет значение 0) то WS_CHILD его перекрывает.
AF>>Только расскажи технологию, с помощью которой и Spy++ можно увидеть свойства окна выпадающего списка. Я как не пытался, у меня выпадающий список успевал исчезнуть.
AF>А, стормозил, как обычно. Я почему-то думал, что выпадающий список динамически создается (в Win 3.1 что-ли так было?), а они вот все, как на ладони.
На ладони то оно на ладони, но вот определить конкретное бывает не просто вот малость переработанная утилитка из MSDN-а позволяющая получать информацию о текущем окне ftp.optim.ru/pub/Common/LISWatch.zip. Далее технология такая:
Запускаешь утилиту, открываешь нужный комб (или любое окон). Нажимаешь мышью на списке комба... при этом захватывается ввод мыши (Capture). Окно захватившее ввод мыши и является листом комба. Для простых окон достаточно перевести фокус на это окно, а потом в утилиту (при этом значения не перечитываются). Далее остается только запомнить (так как Capture снимается при отпускании мыши) идентификатор окна и подставить его в диалог поиска окна из Спая.
AF>Поздравляю, опроверг.
Опроверг, то опроверг... да не совсем.
Ты глянь на расширенные флаги. Там есть забавный флажок — топмост!
Этот флажок у чилда установить вроде невозможно (или я ошибаюсь). Так что здесь еще не все чисто. Да и к конкретной проблеме, это имеет малое отношение. Как я понимаю установка чилда в десктоп-окно нужна для борьбы с появлением иконки в списке задач, а проблем с обработкой клавиатуры и фокуса это не решает. Однако, видимо, там все просто... окно комба просто не получает фокус (это видно в той же утилите), а стало быть клавиатурный ввод обрабатывается в чилдовой части комба. Мышь же просто не передает фокус (видимо обрабатывается сообщение WM_MOUSEACTIVATE).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте pesticide, Вы писали:
P>Хайолл!
P>Кто может подсказать как размеситить дочернее окно за пределами родителя? Нужна функциональность по типу выпадающего списка у комбобокса, чтобы при получении фокуса этим окном приложение оставалось активным (синяя полоса не серела).
Если твое окно должно содержать обычные элементы управления, то твоя задача оооочень сложна. Мы сделали именно это но было это трудно и полухакерскими мерами. Перехват сообщений парент-окна, хуки и т.п. Но у нас задача была сложнее. Мы делали универсальный комб-контейнер ActiveX-контролов. Посмотреть можно в примерах к ascDB http://www.optim.ru/Software/rus/ascDB/ascDb.asp.
Если нет (достаточно функций комба), ну, думаю размышлений в ссылке будет достаточно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Q: дочернее окно за пределами родителя. Как?
Здравствуйте, Alex Fedotov, Вы писали:
AF>Здравствуйте migel, Вы писали:
M>>Здравствуйте Alex Fedotov, Вы писали:
AF>>>Здравствуйте migel, Вы писали:
AF>>>А кто сказал, что он не работает. Он работает. Но утверждение было не в том, что так не бывает, а то что для ComboLBox это не так. Поэтому опровергать мое утверждение надо другим способом.
M>> Замечательно, Spy++ устроит? Только не надо говорить что там установлен WS_OVERLAPPED стиль — так как это стиль по умолчанию (имеет значение 0) то WS_CHILD его перекрывает.
AF>Только расскажи технологию, с помощью которой и Spy++ можно увидеть свойства окна выпадающего списка. Я как не пытался, у меня выпадающий список успевал исчезнуть.
Легко в своем комбо боксе прописываешь
ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)
LRESULT CCheckComboBox::OnCtlColorListBox(WPARAM wParam, LPARAM lParam)
{
lparam == hWnd (ComboLBox)
}
заходишь отладчиком в это место запускаешь spy и ищешь окно по hwnd
все.