Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Меню из res-файла   Найти похожие ветки 

 
kalishenko   (2004-06-21 20:13) [0]

Как программно загрузить и использовать контекстное меню из файла ресурсов?


 
Игорь Шевченко ©   (2004-06-22 09:59) [1]

LoadMenu ?


 
kalishenko   (2004-06-22 14:01) [2]

Объявил ресурсы:
{$R *.dfm}
{$R EDITOR.RES}

и попытался загрузить меню
mm := LoadMenu(Application.Handle,"1"); //mm - это HMENU

В результате mm=0. Сама менюшка находится в EDITOR.RES.
Что я не так делаю?


 
GuAV ©   (2004-06-22 14:02) [3]


> "1"

PChar(1)


 
kalishenko   (2004-06-22 14:46) [4]

Спасибо. Все верно, надо было использовать MAKEINTRESOURCE(1). Но, мне нужно организовать popup-меню. В файле-ресурсе у меня следующее:

1 MENU
{
MENUITEM "Insert", 40001
MENUITEM "Delete", 40002
MENUITEM SEPARATOR
MENUITEM "Exit", 40004
}

Т.е. нигде popup не упоминается, сл-но, по-идее, это не должно быть системным меню. Но после LoadMenu все эти пункты (см. код) появляются в системном меню. Как добиться того, чтобы они появлялись только по "правой клавише", т.е. приложение получило новое контекстное меню?


 
Игорь Шевченко ©   (2004-06-22 14:52) [5]

IDM_WINDOW MENU
{
   POPUP "&Window"
   {
     MENUITEM    "&Tile", IDC_TILE
     MENUITEM    "&Layer", IDC_LAYER
     MENUITEM   "&Cascade",  IDC_CASCADE
     MENUITEM SEPARATOR
     MENUITEM   "Arrange &Icons", IDC_ARRANGEICONS
     MENUITEM SEPARATOR
     MENUITEM  "Tool&bars...",  IDC_TOOLBARS
  }
}

?


 
kalishenko   (2004-06-22 15:15) [6]

>> Игорь Шевченко

А что должно было получиться. Да, замечательное системное меню. Но мне-то нужно shortcut menu...


 
kalishenko   (2004-06-22 15:15) [7]

>> Игорь Шевченко

А что должно было получиться? Да, замечательное системное меню. Но мне-то нужно shortcut menu...


 
Игорь Шевченко ©   (2004-06-22 15:48) [8]

А TrackPopupMenu(Ex) разве не работает с получившимся загруженным меню ?


 
kalishenko   (2004-06-22 16:33) [9]

Нет. Появляется серенькая тоненькая полосочка.
Код:
TrackPopupMenu(mm, TPM_CENTERALIGN, 300, 300, 0, Handle, nil);
где mm - HMENU, Handle - Self.Handle.


 
Игорь Шевченко ©   (2004-06-22 16:51) [10]

С моим меню работает такой код:
unit main;

interface
uses
 Windows, SysUtils, Graphics, Controls, Forms, Classes;

type
 TfMain = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   FMenu: HMENU;
   FShortcutMenu: HMENU;
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}
{$R ADD.RES}

procedure TfMain.FormCreate(Sender: TObject);
begin
 FMenu := LoadMenu(hInstance, MAKEINTRESOURCE(100));
 if FMenu = 0 then
   raise Exception.Create("can""t load menu");
 FShortcutMenu := GetSubMenu(FMenu, 0);
 if FShortcutMenu = 0 then
   raise Exception.Create("can""t get sub-menu");
end;

procedure TfMain.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key = Ord("A") then
   TrackPopupMenu(FShortcutMenu, TPM_LEFTALIGN, 300, 300, 0, Handle, nil);
end;

end.




ADD.RC
#define IDM_TOOLBAR 100

IDM_TOOLBAR MENU
{
POPUP ""
{
 MENUITEM SEPARATOR
 MENUITEM "Left", 100
 MENUITEM "Top", 101
 MENUITEM "Right", 102
 MENUITEM "Bottom", 103
 MENUITEM "Floating", 104
 MENUITEM SEPARATOR
 MENUITEM "Customize...", 106
 MENUITEM SEPARATOR
 MENUITEM "Show Text", 105
}
}


 
kalishenko   (2004-06-22 16:59) [11]

Спасибо, вроде понял.


 
kalishenko   (2004-06-22 17:43) [12]

Теперь следующий этап. Как обрабатывать клики на этом меню?


 
kalishenko   (2004-06-22 19:41) [13]

Или, хотя бы, как получить ID или позицию выбранного пункта меню (нужно в функциях GetMenuItemID и GetMenuString)?


 
Игорь Шевченко ©   (2004-06-22 23:15) [14]


> Теперь следующий этап. Как обрабатывать клики на этом меню?


Каждый элемент меню при нажатии посылает окну, Handle которого указан в TrackPopupMenu, сообщение WM_COMMAND с LOWORD(wParam) равным значению, указанному при объявлении MENUITEM в ресурсе. При этом HIWORD(wParam) этого сообщения равно 0.

ЗЫ: Матчасть бы неплохо почитать.


 
DVM ©   (2004-06-23 02:08) [15]

>kalishenko

Pochitai Petzolda - bolshinstvo takih voprosov otpadut srazu.


 
DVM ©   (2004-06-23 02:11) [16]

Удалено модератором
Примечание: Дубль


 
kalishenko   (2004-06-23 18:46) [17]

Спасибо за советы. Последовав им, и с этим тоже разобрался. Но возникли трудности со следующим: не получается затенить пункт меню.
Код:
var mii: MENUITEMINFOA;
   err: longbool;
begin
  err := GetMenuItemInfo(h_menu,1,False,mii);
  if not err then
  begin
    mii.fMask := MIIM_STATE;
    mii.fState := MFS_GRAYED;
    err := SetMenuItemInfo(h_menu,1,False,mii);
    SetMenu(Handle,h_menu);
  end;
end;

В результате ничего не меняется, а хотелось бы, чтобы пункт меню с ID=1 был затенен, т.е. MFS_GRAYED.


 
Игорь Шевченко ©   (2004-06-23 22:47) [18]


>   err := GetMenuItemInfo(h_menu,1,False,mii);
>   if not err then


if err then


 
kalishenko   (2004-06-24 14:17) [19]

Да, точно, правильная проверка "if err then", но почему-то err никак не получит True. Ну да ладно, при помощи EnableMenuItem все сделалось намного проще.


 
Игорь Шевченко ©   (2004-06-24 16:16) [20]


> Да, точно, правильная проверка "if err then", но почему-то
> err никак не получит True


Потому что структуру MENUITEMINFO надо проинициализировать.

ПОТОМУ ЧТО HELP НАДО ЧИТАТЬ!


 
kalishenko   (2004-06-29 09:51) [21]

В хелпе на счет этого ничего нет.


 
parovoZZ ©   (2004-07-18 01:43) [22]

А, собственно, как заполнять поля структуры MENUITEMINFO? В хелпе всё как-то пространно описано. И ещё: я так понял, что для каждого пункта меню необходимо создавать отдельную структуру (в случае с использованием разных картинок для разных пунктов).


 
parovoZZ ©   (2004-07-20 20:16) [23]

Ну вот, все в отпусках. Счастливчики.



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

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
1-1092808741
Roadstar
2004-08-18 09:59
2004.09.05
TTreeView


3-1092041079
ivc_andr
2004-08-09 12:44
2004.09.05
не могу соединиться с сервером приложений


4-1090246123
Sasha73
2004-07-19 18:08
2004.09.05
Убрать чужую иконку из SystemTray ?


1-1093004464
Aks
2004-08-20 16:21
2004.09.05
работа с АутЛуком. Как избежать лишних вопросов?


3-1092277691
Sirus
2004-08-12 06:28
2004.09.05
Принудительное закрытие базы Interbase...