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

Вниз

Меню из 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.038 c
14-1092642134
Krups
2004-08-16 11:42
2004.09.05
Сам собираю компьютер


14-1092636996
Реактор
2004-08-16 10:16
2004.09.05
Проблемы с высвобождением памяти


14-1092362894
Думкин
2004-08-13 06:08
2004.09.05
С днем рождения! 13 августа


1-1092982410
bezpal
2004-08-20 10:13
2004.09.05
Как в Delphi проанализировать запущена ли определенная программа?


6-1088658782
Артем К.
2004-07-01 09:13
2004.09.05
Присутствует ли в сети компьютер с введенным в edit IP-адресу





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