![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамически создаваемое меню.... [D6, Win2k]
John0001 © (2002-07-23 15:20:00)Создаю меню во время выполнения... (просто загружаю туда список нужных мне окон в системе и в поле Tag вставляю HWND окна) так вот вопрос как узнать на какой пункт я кликнул??
Song (2002-07-23 17:08:00) [1]
Function EnumProc(Handle:HWND; Param:LongInt):Boolean; stdcall;
Begin
GetWindowText(...);
PopupMenu1.Items.Add(...);
Result:=True;
End;
Procedure TForm1.Button1Click(Sender:TObject);
Begin
EnumWindows(@EnumProc,0);
End;
В EnumProc придётся вставить ещё дополнительные проверки, потому что по умолчанию она Вам много чего в меню напехает.
John0001 (2002-07-23 17:01:00) [2]Угу сделал поиск нашел 2 топика в которых говорится типа EnumWindows круче... и все :-)
Song (2002-07-23 16:24:00) [3]Главное чтобы работало.
Если честно писать лень, поищите по слову EnumWindows найдёте кучу примеров.
John0001 (2002-07-23 16:05:00) [4]Ну вот видимо сильно много спросил :o/
John0001 (2002-07-23 15:54:00) [5]Урааа то что надо!!! Я знал что должно быть просто и красиво ;-)
А как с EnumWindows?
Моя задача найти просто окна с началом в заголовке "Ultima Online" и вывести их в меню... кстати я при выборе одного из пунктов перечитываю список окон и чищу меню таким образом:
procedure TfrmMain.miRefreshListClick(Sender: TObject);
var
i: Integer;
begin
i := RxppmMain.Items[0].Count - 1;
while i >= 1 do
begin
RxppmMain.Items[0].Delete(i);
i:=i-1;
end;
GetProcList(); // как раз кусок кода приведенный раньше
end;
Может это коряво?
Song (2002-07-23 15:44:00) [6]Кстати для Вашего случая я бы советовал не ходить по дескрипторам через GetWindow(), а использовать EnumWindows(), EnumChildWindows() - легче, компактней, менее трудоёмко.
Song (2002-07-23 15:42:00) [7]
...
GetWindowText(Wnd, buff, sizeof(buff));
NewItem:=TMenuItem.Create(miChgUOwin);
NewItem.Caption := StrPas(buff);
NewItem.Tag := Wnd;
NewItem.onClick:=MyItemsClick;
if ProcHWND = Wnd then NewItem.Checked:=true;
RxppmMain.Items[0].Add(NewItem);
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
...
Procedure TForm1.MyItemsClick(Sender:TObject);
Begin
ShowMessage("Мы нажали итем "+TMenuItem(Sender).Caption); // Вот здесь мы и различаем итемы.
End;
John0001 (2002-07-23 15:42:00) [8]To: Skier
Я просто акк свой посеял на форуме а искать лень :-)
А задача проста... прога моя получает в глобальной переменной HWND окна и что-то делает... в меню несколько процессов HWND которых содержатся в поле Tag соответствующего пункта меню... задача при выборепункта меню записать в глобальную переменную содержимое поля Tag у выбранного пункта... вот..... и никак не допру как сделать :-(
Song (2002-07-23 15:39:00) [9]Если показывать пальцем всё с самого начала то это много писать, поэтому Вы покажите как Вы создавали динамически Ваше меню, а мы Вам покажем как сделать остальное.
2Skier © (23.07.02 15:34)
Походу дела у него не назначено это событие вообще.
John0001 (2002-07-23 15:37:00) [10]Вот кусок что генерит меню...
Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
if (Wnd <> Application.Handle) and
IsWindowVisible(Wnd) and
(GetWindow(Wnd, gw_Owner) = 0) and
((GetWindowText(Wnd, buff, sizeof(buff)) <> 0) and
(IsWild(StrPas(buff), "Ultima Online*", true)) )
then
begin
GetWindowText(Wnd, buff, sizeof(buff));
NewItem:=TMenuItem.Create(miChgUOwin);
NewItem.Caption := StrPas(buff);
NewItem.Tag := Wnd;
if ProcHWND = Wnd then NewItem.Checked:=true;
RxppmMain.Items[0].Add(NewItem);
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
Skier (2002-07-23 15:34:00) [11]>John0001
Просто анкеты нет, вот я и подумал... :))
procedure TForm1.miNClick(Sender: TObject);
begin
with Sender as TMenuItem do begin
if Tag <> 0 then begin
//здесь используешь Handle окна...
end; //if
end; //with
end;
John0001 (2002-07-23 15:34:00) [12]Угу так о том и речь не прикалывались бы а "пальцом бы показали"!
Song (2002-07-23 15:33:00) [13]Ok, а как делаете-то "Создаю меню во время выполнения" ? :-)
Song (2002-07-23 15:32:00) [14]- Молодой человек, скажите где тут Гибралтар?
- Зюйд-зюйд, вест!
- Да ты не умничай, ты пальцем покажи!
(с) ГЭГ
:-))) Кто играл, вспомнит обязательно.
Song (2002-07-23 15:32:00) [15]- Молодой человек, скажите где Гибралтар?
- Зюйд-зюйд, вест!
- Да ты не умничай, ты пальцем покажи!
(с) ГЭГ
:-))) Кто играл, вспомнит обязательно.
John0001 (2002-07-23 15:31:00) [16]Дык не молодежь... просто начальником работаю и позабыл все напрочь... так от случая к случаю юзаю Дельфи :o/
Skier (2002-07-23 15:29:00) [17]>John0001
Эх, молодёжжжжжжжжжжж...:)
John0001 (2002-07-23 15:27:00) [18]Хм а как сделать то?
Вот это то и не могу понять... что так сделать надо я и так понял... пальцом бы кто показал! :o)
Song (2002-07-23 15:23:00) [19]Сделайте им [итемам] событие onClick и различайте по TMenuItem(Sender)