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

Вниз

Системное меню окна у себя дома...   Найти похожие ветки 

 
DeadMeat   (2003-04-01 16:11) [0]

Люди... как на своей форме вызвать системное меню какого либо окна..., естественно handle того окна в комплекте присутствует... мне надо повесить его на кнопку например (SpeedButton)... Просто у меня есть кое-что на эту тему, но работает оно с ошибкой,... в смысле элементы меню показываются не те... Заранее спасибо...


 
Clickmaker   (2003-04-01 16:53) [1]

А чем системное меню какого-либо окна круче твоего "домашнего"?


 
DeadMeat   (2003-04-01 17:38) [2]

Своё всегда роднее и КРУЧЕ ... А если честно, то надо... очень надо...


 
Morfein   (2003-04-01 20:36) [3]


var
x, y : dword;
menu : hMenu;

...
...

menu:=getMenu(handle_того_окна_в_комплекте);
TrackPopupMenu(menu, TPM_LEFTALIGN + TPM_LEFTBUTTON, x, y, 0, handle_того_окна_в_комплекте, nil);


 
DVM   (2003-04-01 20:48) [4]


> DeadMeat

У меня такое ощущение, что я тебе отвечал уже в ветке Shell (была такая, длиннная, длиннная).

Здесь Handle - хендл того окна от которого системное меню.
Handle2 - твоя программа.

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 , Handle2, nil));
if LItem>0 then SendMessage(Handle,WM_SYSCOMMAND,LItem,0);
end;

Координаты появления ставишь сам (100,100).




 
DeadMeat   (2003-04-04 21:04) [5]

> Morfein
Может я что-то делаю не так, но у меня не работает... Меню не показывается...

> DVM

У меня такое ощущение, что я тебе отвечал уже в ветке Shell (была такая, длиннная, длиннная).....

Ты совершенно прав. Кстати интересная была тема, почему про неё забыли... Но я отвлёкся... При всём моём уважении к тебе, как к программеру, DVM, твой код работает с ошибками (как этот так и тот)... А точнее он выдаёт неправельные пункты меню, например если окно развёрнуто то пункт Развернуть будет активен, а вместе с ним и все остальные... Также если окно в нормальном положении, то пункт восстановить также активен... Но если вызвать системное меню того окна вручную (т.е. мышкой или клавой), то после этого все пункты в проге отображаются нормально... Я пытался сделать тоже самое но через API (в смысле чё нить типа инициализировать), но без успешно... Я не знаю, может я делаю чё не так:

procedure TForm1.Button1Click(Sender: TObject);
var
LItem : LongWord;
LMenu : HMENU;
handle1:hwnd;
begin
handle1:=findwindow (nil,"Мой компьютер");//или чё нить в этом роде...
if handle1<>0 then
begin
LMenu := GetSystemMenu(Handle1,false);
LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,100, 100, 0 , Handle, nil));
if LItem>0 then SendMessage(Handle1,WM_SYSCOMMAND,LItem,0);
end;
end;


 
dvm   (2003-04-06 16:31) [6]


> При всём моём уважении к тебе, как к программеру, DVM, твой
> код работает с ошибками (как этот так и тот)...

А про то, чтобы правильно работало, меня никто и не спрашивал:)
Оба раза спрашивали про меню.

А если хочешь правильно, то надо собственноручно гасить и включать соответствующие пункты этого меню. Другого способа НЕТ!
Делается просто: узнаешь состояние окна и меняешь пункты меню.

Можешь посмотреть исходники LiteStep, там как раз так и сделано.



 
DeadMeat   (2003-04-06 18:59) [7]

А вот об этом я не думал, надо проверить... Просто интересно: а почему, после того когда я вызову это меню вручную, оно отображается в проге правильно?...


 
DVM   (2003-04-06 19:08) [8]

Точно не знаю, но думаю, что состоянием пунктов этого меню управляет система. Если окно поменяло свое состояние, то пункты в этом меню не соответствуют действительности, пока система их не обновит. Но она обновляет меню только когда оно вызывается щелчком мыши на соответствующем месте окна. Любой другой способ вызова этого меню показывает нам "устаревшее" меню.

Наверняка есть недокументированный способ заставить меню обновится, но я его, к сожалению, не знаю. Им должен пользоваться Explorer. Это догадки, но скорее всего верные.



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

Форум: "WinAPI";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-13046
strimmer
2003-05-16 18:22
2003.06.05
Доступ к локальной базе с нескольких компьютеров


1-13244
delfin
2003-05-23 14:17
2003.06.05
Подскажите как из string получить PChar


1-13295
Goblinus
2003-05-24 18:00
2003.06.05
Как создать кнопку в панели задач для неглавного окна приложения?


14-13384
Bosso
2003-05-16 10:45
2003.06.05
Алгоритм оптимального раскроя


1-13174
paxer
2003-05-26 14:26
2003.06.05
Можно ли заставить Делфи выдавать сообщение при выходе за границы





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