Форум: "Основная";
Текущий архив: 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.047 c