Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо