Главная страница
    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.052 c
9-1084807193
Pirate
2004-05-17 19:19
2004.09.05
3D Движки


4-1090371176
Вопрос
2004-07-21 04:52
2004.09.05
ФОРМАТИРОВАНИЕ ДИСКА


3-1092231824
Bless
2004-08-11 17:43
2004.09.05
Как получить запись, соответсвующую максимальному значению поля


14-1092896151
Ega23
2004-08-19 10:15
2004.09.05
Для Думкина - сегодня, однако, 130 лет!


14-1092468876
Кириешки
2004-08-14 11:34
2004.09.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский