Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Меню из res-файла [D6, WinXP]


Страницы:   1 2

kalishenko ©   (2004-06-21 20:13:00) 

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


parovoZZ   (2004-07-20 20:16:00) [1]

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


parovoZZ   (2004-07-18 01:43:00) [2]

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


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

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


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


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


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

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


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

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


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


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


if err then


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

Спасибо за советы. Последовав им, и с этим тоже разобрался. Но возникли трудности со следующим: не получается затенить пункт меню.
Код:
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.


DVM   (2004-06-23 02:11:00) [8]

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


DVM   (2004-06-23 02:08:00) [9]

>kalishenko

Pochitai Petzolda - bolshinstvo takih voprosov otpadut srazu.


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


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


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

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


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

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


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

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


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

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


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

С моим меню работает такой код:
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:33:00) [15]

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


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

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


kalishenko   (2004-06-22 15:15:00) [17]

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

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


kalishenko   (2004-06-22 15:15:00) [18]

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

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


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

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 14:46:00) [20]

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо