Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
1-1084891319
Mameluke
2004-05-18 18:41
2004.05.30
Отображение верхнего и нижнего индексов в TRTFLabel


1-1084857230
SiJack
2004-05-18 09:13
2004.05.30
Как определить что MessageBox уже показано и не показывать


3-1084048202
Я Ламер
2004-05-09 00:30
2004.05.30
Компоненты прямого доступа к MSSQL


14-1083680970
Подснежник
2004-05-04 18:29
2004.05.30
Открыл сезон... снова на колёсах...


1-1084886617
Empleado
2004-05-18 17:23
2004.05.30
try





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский