Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

Не закрывать попап   Найти похожие ветки 

 
RASkov   (2006-11-04 00:11) [0]

Есть Popup меню вот такое:


|---------|
|о Find.   |  <- Radio
|  Filtr  |  <- Radio
|-------- |
|v Name.   |  <- Check
|  Adr    |  <- Check
|  Data.   |  <- Check
|---------|


Как сделать, чтобы при выборе первых двух элементов, меню не закрывалось, а переключались состояния Checked этих элементов. Перекопал все меню в VCL - не смог сделать:(
В каком методе меню сворачивается, как его остановить/что перекрыть? У кого TMenu, TMenuItem, TPopupMenu?
Вроде бы был похожий вопрос - не нашел. Спасибо.


 
Германн ©   (2006-11-04 00:35) [1]

Имхо, этот вопрос не к VCL (Borland), а к OS Windows (MS). Так что эмулируй стандартное меню своим окном.


 
RASkov   (2006-11-04 01:16) [2]

А вот эта функция, что делает?

BOOL TrackPopupMenu(
   HMENU hMenu, // handle of shortcut menu
   UINT uFlags, // screen-position and mouse-button flags
   int x, // horizontal position, in screen coordinates
   int y, // vertical position, in screen coordinates
   int nReserved, // reserved, must be zero
   HWND hWnd, // handle of owner window
   CONST RECT *prcRect // points to RECT that specifies no-dismissal area
  );

Я англ. не понимаю. X-Translator перевел:


Функция TrackPopupMenu показывает сокращенное меню в указанном местоположении и отслеживает выбор пунктов(изделий) на меню. Сокращенное меню может появляться где-нибудь на экране.
....
hWnd
Идентифицирует окно, которое имеет(признает) сокращенное меню. Это окно получает все сообщения от меню. Окно не получает WM_COMMAND сообщение от меню до возвращений функции.

prcRect
Указывает на структуру RECT, которая определяет часть экрана, в котором пользователь может выбирать без того, чтобы уволить(отклонить) сокращенное меню. Если этот параметр ПУСТОЙ, сокращенное меню отклонено, если пользователь щелкает вне сокращенного меню.

По англ., наверное больше понятно, чем перевод:)

Ничем помочь не сможет?
Где-то видел такое, что меню не закрывается если "щелкается" по определенным пунктам. Неуж-то они(авторы тех прог где такое меню) с нуля своё меню делали?
Ну а не поможет... будем извращаться. Спасибо.


 
guav ©   (2006-11-04 01:27) [3]

можно попробовать not Enabled + OwnerDraw + WM_MENUSELECT


 
Германн ©   (2006-11-04 01:27) [4]


> RASkov   (04.11.06 01:16) [2]
>
> А вот эта функция, что делает?
>
> BOOL TrackPopupMenu(
>    HMENU hMenu, // handle of shortcut menu
>    UINT uFlags, // screen-position and mouse-button flags
>    int x, // horizontal position, in screen coordinates
>    int y, // vertical position, in screen coordinates
>    int nReserved, // reserved, must be zero
>    HWND hWnd, // handle of owner window
>    CONST RECT *prcRect // points to RECT that specifies
> no-dismissal area
>   );
>
> Я англ. не понимаю. X-Translator перевел:


Эт зря. Аглицкий понимать нужно, если хочешь делать подобное. :-)
По сути. Перевод достаточно правильный. Теперь нужно экспериментировать с применением данной функции. Я, лично, ни чем подобным не занимался, извини.


 
RASkov   (2006-11-04 02:03) [5]

> Аглицкий понимать нужно

Ой как желею об этом:(
Сейчас по справке шарился, много чего интересного но... нипонимаю, блин.

> [3] guav ©   (04.11.06 01:27)

Если можно небольшой пример как с этим можно побороть "Попап".
Как и где отловить WM_MENUSELECT? Можно даже оставить элемент выключенным
Т.е. первый и второй элемент Enable:=False;(пусть будут серенькими - даже лучьше) но при щелчке по ним нужно у них менять Checked..


 
RASkov   (2006-11-04 02:13) [6]

Вот кусок из RxMenus

procedure MenuWndMessage(Menu: TMenu; var AMsg: TMessage; var Handled: Boolean);
var
 Message: TMessage;
 Item: Pointer;
begin
 with AMsg do
   case Msg of
     WM_MEASUREITEM:
....
     WM_MENUSELECT: Menu.Dispatch(AMsg);
     CM_MENUCHANGED: Menu.Dispatch(AMsg);

.....
Может как нить .Dispatch Popap"у "сделать грамотно и вовремя"?


 
RASkov   (2006-11-04 04:06) [7]

Элемент меню(MenuItem) с Enabled:=False "ловит" какие-нибудь сообщения от мыши?
переопределил Click у TMenuItem, в нем пытался отправить попапу сообщение мыши

procedure TMyMenuItem.Click;
var Mes: TWMLButtonDown;
begin
 Mes.Msg:=WM_LBUTTONDOWN;
 TMenu(GetParentMenu).Dispatch(Mes);
end;

procedure TMyPopupMenu.WMLButtonDown(var Message: TWMLButtonDown);
begin
 ShowMessage("WMLButtonDown");
end;


На "включенных" приходят, а на "выкл" нет.... Но ведь "кто-то проверяет состояние элемента"... кто?


 
RASkov   (2006-11-04 04:12) [8]

Вот еще надеюсь на пример с not Enabled + OwnerDraw + WM_MENUSELECT
Но похоже сам я ничего уже больше не придумаю. Спасибо.


 
RASkov   (2006-11-04 20:22) [9]

Вообщем сделал так.... некрасиво, неправильно, но более менее близко к желаемому
procedure TForm1.N1Click(Sender: TObject);
begin
 if not (Sender as TMenuItem).Checked then begin
  (Sender as TMenuItem).Checked:=True;
  RxSpeedButton1.CheckBtnMenuDropDown;
 end;
 ...
end;

Это с использованием RxLib - его SpeedButton c RxPopupMenu. Код общий для первых двух элементов.
Вариант [1] > Так что эмулируй стандартное меню своим окном.
думаю не стОит сдесь этого. Хотя то же вариант.
Спасибо всем.
-Незачто:)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.044 c
2-1164651925
Змей
2006-11-27 21:25
2006.12.17
webbrowser. анимация вкл.выкл


15-1164203095
Darvin
2006-11-22 16:44
2006.12.17
Потоки TThread + быстродействие


2-1164893329
aht
2006-11-30 16:28
2006.12.17
в общем, терзаюсь тожа, но по другому вопросу :-)


15-1164317188
KilkennyCat
2006-11-24 00:26
2006.12.17
Пытаюсь придумать варианты, когда такое нужно:


1-1162460119
NeyroSpace
2006-11-02 12:35
2006.12.17
Как узнать что компьютер простаивает n минут?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский