Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
7-1083306934
studentt
2004-04-30 10:35
2004.05.30
COM10 и функция CreateFile()


4-1082210450
сщвук
2004-04-17 18:00
2004.05.30
Task bar


14-1084255098
ССЗБ
2004-05-11 09:58
2004.05.30
Заметил одну деталь - может, неправ?


4-1081744104
Sapsi
2004-04-12 08:28
2004.05.30
Нахождение edit в чужом окне


1-1085039816
$Hic0
2004-05-20 11:56
2004.05.30
Try... except