Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизPopup Window Найти похожие ветки
← →
SPeller © (2004-04-17 04:46) [0]Всем доброго времени суток!
Мне нужно создать 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;
Но такое окно может забирать фокус у формы, а мне этого не надо. Мне надо чтобы оно вело себя как, например, любой едит или кнопка на форме, и не тащило весь фокус на себя. Подскажите, пожалуйста, как этого добиться?
← →
AndersoNRules © (2004-04-17 12:26) [1]Mojet prosto Form1.SetFocus vstaviti v OnShow sobitiye Popup"a ?
← →
SPeller © (2004-04-17 12:27) [2]Если обрабатывать OnMouseActivate и возвращать MA_NOACTIVATEANDEAT, то по клику мышы фокус не будет переходить к окну и окошко это можно благополучно скрыть. Но что делать если был щелчок по другому контролу? Не вешаться же каждому контролу на OnMouseDown и скрывать окошко! DropDown-список у листбокса ведь не цепляется на каждый контрол, но закрывается при уходе фоку са на другой контрол.
← →
SPeller © (2004-04-17 12:29) [3]
> Mojet prosto Form1.SetFocus vstaviti v OnShow sobitiye Popup"a
> ?
На средней быстроты машине и то заметно мерцание заголовка формы, а если машина будет послабже, либо система будет загружена другими задачами, то тем более будет заметно. К тому же этот способ не решает проблемы с щелчком где-либо вне моего окошка.
← →
Игорь Шевченко © (2004-04-17 21:43) [4]
> Но такое окно может забирать фокус у формы, а мне этого
> не надо. Мне надо чтобы оно вело себя как, например, любой
> едит или кнопка на форме, и не тащило весь фокус на себя.
>
Переведи пожалуйста фразу про фокус у формы.
Для того, чтобы оно было недоступно для пользовательских действий, установи ему в стилях при создании WS_DISABLED
← →
nikkie © (2004-04-17 22:17) [5]>Speller
а ты возьми и посмотри как в каком-нибудь RX сделан datebox. если не ошибаюсь, то проблема с кликом мимо окна там решается с помощью SetCapture.
← →
SPeller © (2004-04-19 12:46) [6]
> Игорь Шевченко © (17.04.04 21:43) [4]
> Переведи пожалуйста фразу про фокус у формы.
> Для того, чтобы оно было недоступно для пользовательских
> действий, установи ему в стилях при создании WS_DISABLED
Перевожу: заголовок окна становится серым. WS_DISABLED не подходит, потому что события мыши не будут поступать.
Я тут так прикинул, и решил что есть два выхода:
1) Через SetCapture
2) Поставить локальный хук на мышь и смотреть где кликнули. Да и без раницы где кликнули - по любому клику закрывать моё окошко. Чем это лучше первого вырианта - тем что события мыши не будут поностью поглащаться моим окном.
← →
Игорь Шевченко © (2004-04-19 12:54) [7]SPeller © (19.04.04 12:46)
Ты можешь подробно описать, чего ты хочешь добиться ?
← →
nikkie © (2004-04-19 13:23) [8]>Игорь Шевченко
мне кажется ключ в [2] :)
>DropDown-список у листбокса
человек хочет сделать что-то наподобие комбобокса
>SPeller
что-то я неуверен, что это будет хорошо, что клик мимо окна будет приходить туда, куда кликнули. если цель сделать "как в комбобоксе", то надо смотреть, как он себя ведет. он клик съедает.
← →
Alex44 (2004-04-19 14:14) [9]Dostatochno imet" ODIN wincontrol (naprimer, Form1), kotoryj budet otvechat" za skrutie popup"a; potom: SetFocus i WM_KILLFOCUS
← →
Игорь Шевченко © (2004-04-19 14:42) [10]nikkie © (19.04.04 13:23)
Так это надо исходники TPopupListBox в DBCtrls.pas глядеть - там все очень хорошо написано.
← →
VMcL © (2004-04-19 17:40) [11]>>Игорь Шевченко © (19.04.04 14:42) [10]
(D6): Grids.pas вроде?
← →
Игорь Шевченко © (2004-04-19 18:06) [12]VMcL © (19.04.04 17:40)
Спасибо, ошибся, в DbCtrls реализован TPopupDataList.
А TPopupListBox в D5 в DbGrids живет. В D6 - в Grids
← →
nikkie © (2004-04-19 20:19) [13]>Так это надо исходники TPopupListBox глядеть
мне RX ближе оказался, поскольку я по его исходникам разбирался :)
← →
SPeller © (2004-04-20 07:23) [14]
> Ты можешь подробно описать, чего ты хочешь добиться ?
Мне нужно что-то вроде ToolTip-а. Для вывода справки. Только размеры его, анимацию и всё остальное я делаю сам и отрисовывается на нём rtf-текст из рич-едита, предварительно отпечатавшего себя куда надо.
На счет съедать клик или нет... Я пока сомневаюсь. Ещё ведь нужно чтобы при нажатии на клавишу тоже скрывалось моё окно. Поставить хук на клаву?
← →
nikkie © (2004-04-20 08:38) [15]ааа... тултип - другое дело совсем. стандартный тултип не съедает клики.
← →
SPeller © (2004-04-20 08:57) [16]Ладно, вопрос почти закрыт. Вообще я вооружился локальными хуками на клаву и мышь, съедая первый клик или нажатие клавиши, а так же SetCapture. Кстати, SetCapture сам по себе работает как-то не так, а вот если в придачу поставить локальный хук - то всё хорошо:). ПОслы вызова SetCapture почемуто моё приложение вообще не реагирует на мышь и никаких сообщений не приходит. Если поставить отдельно хук на мышь, то всё ловит за исключением сообщений заголовку формы и когда кликаешь вне формы. Если задействовать оба этих инструмента - то всё просто идеально :-)))
← →
Alex44 (2004-04-20 10:57) [17]V D6: class(TPopupWindow) + CN_HINTPOPUP (ili chto-to pohozhee).
← →
SPeller © (2004-04-20 11:29) [18]2 Alex44:
FHandle := CreateWindowEx(
WS_EX_TOOLWINDOW, HW_WNDCLASS, "", WS_POPUP or WS_BORDER, 0, 0,
0, 0, Parent.Handle, 0, hInstance, nil);
:-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.03 c