Форум: "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