![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Popup Window
SPeller © (2004-04-17 04:46:00)Всем доброго времени суток!
Мне нужно создать Popup окно. Делаю так:
procedure TForm1.Button3Click(Sender: TObject);
var
wc: tagWNDCLASSEX;
begin
Button3.Enabled := false;
FillChar(wc, SizeOf(wc), 0);
if not GetClassInfoEx(hInstance, GWH_POPUPWNDCLASS, wc) then begin
wc.cbSize := SizeOf(wc);
wc.style := CS_SAVEBITS;
wc.lpfnWndProc := @PopWndProc;
wc.cbClsExtra := 0;
wc.hInstance := hInstance;
wc.hIcon := 0;
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := COLOR_INFOBK + 1;
wc.lpszMenuName := nil;
wc.lpszClassName := GWH_POPUPWNDCLASS;
Windows.RegisterClassEx(wc);
end;
fPopupWnd := CreateWindowEx(
Ws_EX_CONTROLPARENT, GWH_POPUPWNDCLASS, '',
WS_POPUP or WS_VISIBLE or WS_BORDER or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or
0,
0, 0, 100, 100, Handle, 0, hInstance, nil);
SetProp(fPopupWnd, OBJ_ID, cardinal(Self));
end;
Но такое окно может забирать фокус у формы, а мне этого не надо. Мне надо чтобы оно вело себя как, например, любой едит или кнопка на форме, и не тащило весь фокус на себя. Подскажите, пожалуйста, как этого добиться?
SPeller (2004-04-20 11:29:00) [1]2 Alex44:
FHandle := CreateWindowEx(
WS_EX_TOOLWINDOW, HW_WNDCLASS, '', WS_POPUP or WS_BORDER, 0, 0,
0, 0, Parent.Handle, 0, hInstance, nil);
:-)
Alex44 (2004-04-20 10:57:00) [2]V D6: class(TPopupWindow) + CN_HINTPOPUP (ili chto-to pohozhee).
SPeller (2004-04-20 08:57:00) [3]Ладно, вопрос почти закрыт. Вообще я вооружился локальными хуками на клаву и мышь, съедая первый клик или нажатие клавиши, а так же SetCapture. Кстати, SetCapture сам по себе работает как-то не так, а вот если в придачу поставить локальный хук - то всё хорошо:). ПОслы вызова SetCapture почемуто моё приложение вообще не реагирует на мышь и никаких сообщений не приходит. Если поставить отдельно хук на мышь, то всё ловит за исключением сообщений заголовку формы и когда кликаешь вне формы. Если задействовать оба этих инструмента - то всё просто идеально :-)))
nikkie (2004-04-20 08:38:00) [4]ааа... тултип - другое дело совсем. стандартный тултип не съедает клики.
SPeller (2004-04-20 07:23:00) [5]
> Ты можешь подробно описать, чего ты хочешь добиться ?
Мне нужно что-то вроде ToolTip-а. Для вывода справки. Только размеры его, анимацию и всё остальное я делаю сам и отрисовывается на нём rtf-текст из рич-едита, предварительно отпечатавшего себя куда надо.
На счет съедать клик или нет... Я пока сомневаюсь. Ещё ведь нужно чтобы при нажатии на клавишу тоже скрывалось моё окно. Поставить хук на клаву?
nikkie (2004-04-19 20:19:00) [6]>Так это надо исходники TPopupListBox глядеть
мне RX ближе оказался, поскольку я по его исходникам разбирался :)
Игорь Шевченко (2004-04-19 18:06:00) [7]VMcL © (19.04.04 17:40)
Спасибо, ошибся, в DbCtrls реализован TPopupDataList.
А TPopupListBox в D5 в DbGrids живет. В D6 - в Grids
VMcL (2004-04-19 17:40:00) [8]>>Игорь Шевченко © (19.04.04 14:42) [10]
(D6): Grids.pas вроде?
Игорь Шевченко (2004-04-19 14:42:00) [9]nikkie © (19.04.04 13:23)
Так это надо исходники TPopupListBox в DBCtrls.pas глядеть - там все очень хорошо написано.
Alex44 (2004-04-19 14:14:00) [10]Dostatochno imet' ODIN wincontrol (naprimer, Form1), kotoryj budet otvechat' za skrutie popup'a; potom: SetFocus i WM_KILLFOCUS
nikkie (2004-04-19 13:23:00) [11]>Игорь Шевченко
мне кажется ключ в [2] :)
>DropDown-список у листбокса
человек хочет сделать что-то наподобие комбобокса
>SPeller
что-то я неуверен, что это будет хорошо, что клик мимо окна будет приходить туда, куда кликнули. если цель сделать "как в комбобоксе", то надо смотреть, как он себя ведет. он клик съедает.
Игорь Шевченко (2004-04-19 12:54:00) [12]SPeller © (19.04.04 12:46)
Ты можешь подробно описать, чего ты хочешь добиться ?
SPeller (2004-04-19 12:46:00) [13]
> Игорь Шевченко © (17.04.04 21:43) [4]
> Переведи пожалуйста фразу про фокус у формы.
> Для того, чтобы оно было недоступно для пользовательских
> действий, установи ему в стилях при создании WS_DISABLED
Перевожу: заголовок окна становится серым. WS_DISABLED не подходит, потому что события мыши не будут поступать.
Я тут так прикинул, и решил что есть два выхода:
1) Через SetCapture
2) Поставить локальный хук на мышь и смотреть где кликнули. Да и без раницы где кликнули - по любому клику закрывать моё окошко. Чем это лучше первого вырианта - тем что события мыши не будут поностью поглащаться моим окном.
nikkie (2004-04-17 22:17:00) [14]>Speller
а ты возьми и посмотри как в каком-нибудь RX сделан datebox. если не ошибаюсь, то проблема с кликом мимо окна там решается с помощью SetCapture.
Игорь Шевченко (2004-04-17 21:43:00) [15]
> Но такое окно может забирать фокус у формы, а мне этого
> не надо. Мне надо чтобы оно вело себя как, например, любой
> едит или кнопка на форме, и не тащило весь фокус на себя.
>
Переведи пожалуйста фразу про фокус у формы.
Для того, чтобы оно было недоступно для пользовательских действий, установи ему в стилях при создании WS_DISABLED
SPeller (2004-04-17 12:29:00) [16]
> Mojet prosto Form1.SetFocus vstaviti v OnShow sobitiye Popup'a
> ?
На средней быстроты машине и то заметно мерцание заголовка формы, а если машина будет послабже, либо система будет загружена другими задачами, то тем более будет заметно. К тому же этот способ не решает проблемы с щелчком где-либо вне моего окошка.
SPeller (2004-04-17 12:27:00) [17]Если обрабатывать OnMouseActivate и возвращать MA_NOACTIVATEANDEAT, то по клику мышы фокус не будет переходить к окну и окошко это можно благополучно скрыть. Но что делать если был щелчок по другому контролу? Не вешаться же каждому контролу на OnMouseDown и скрывать окошко! DropDown-список у листбокса ведь не цепляется на каждый контрол, но закрывается при уходе фоку са на другой контрол.
AndersoNRules (2004-04-17 12:26:00) [18]Mojet prosto Form1.SetFocus vstaviti v OnShow sobitiye Popup'a ?