Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.04.2010, 08:04
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию Popup menu

Доброе время суток. Помню как то ранее задавался вопрос о системном меню. Предлагалось вызвать сообщение $313 но ничего не работает. Я имею в виду popup menu возникающее в заголовке окна при щелчке на иконку.
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
  #2  
Старый 30.04.2010, 08:33
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Вот пожалста..при нажатии на Button1 системное меню вылетит в координатах (100х100)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  LItem : LongWord;
  LMenu : HMENU;
begin
  LMenu := GetSystemMenu(Handle,false);
  LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or
                                           TPM_RIGHTBUTTON or TPM_RETURNCMD,
                                           100, 100, 0 , Handle, nil));
  if LItem>0 then  SendMessage(Handle,WM_SYSCOMMAND,LItem,0);
end;
(с) DelphiKingdom
Ответить с цитированием
  #3  
Старый 01.05.2010, 08:16
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Что то не работает. Lmenu равен нулю. И никакого меню не появляется. Для справки у меня виста и д6.
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
  #4  
Старый 01.05.2010, 08:26
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

У меня работает.
D7 Win-7
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 01.05.2010, 08:32
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

И что мне делать
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
  #6  
Старый 01.05.2010, 09:11
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

У меня прекрасно работает. D6+XP Так что даже не скажу...

Кстати, я не зря кинул ссылку на автора...почитайте обсуждение к этому решению, может что-нибудь вычитаете для себя. Там же предложено такое решение: SendMessage(Handle, 787, 0, MAKELPARAM(10, 10)); Сам не пробовал еще...

Последний раз редактировалось dr. F.I.N., 01.05.2010 в 09:15.
Ответить с цитированием
  #7  
Старый 01.05.2010, 13:41
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Что-то ничего не получается.
Код:
var
  LItem : LongWord;
  LMenu : HMENU;
begin
  LMenu := GetSystemMenu(Handle,false);
  LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or
                                           TPM_RIGHTBUTTON or TPM_RETURNCMD,
                                           100, 100, 0 , Handle, nil));
  if LItem>0 then  SendMessage(Handle,WM_SYSCOMMAND,LItem,0);
end;
При трассировке этого кода GetSystemMenu(Handle,false) возвращает 0 и поэтому ничего не работает.
Сообщение SendMessage(Handle, 787, 0, MAKELPARAM(10, 10)); ничего не происходит. Кстати посетила идея может не работает меню из-за того что у меня на форме BorderStyle:= bsNone?
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
  #8  
Старый 01.05.2010, 14:34
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Проблему решил!!!! Спасибо всем за помощь. Оказывается если BorderStyle = bsNone, то форма этого меню не создает. Предлагаю свое решение если интересно.
Код:
...
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
 Params.Style:= Params.Style or WS_SYSMENU;
end;

...
 var lItem: LongWord;
       lMenu: HMenu;
...
 lMenu:= GetSystemMenu(Handle, false);
 lItem:= LongWord(Windows.TrackPopupMenu(lMenu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON,
                       10, 10, 0, Handle, nil));
 if lItem > 0 then SendMessage(Handle, WM_SYSCOMMAND, lItem, 0);
...
Вот теперь все работает
__________________
APPLICATION.TERMINATOR
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025