![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Меню из res-файла [D6, WinXP]
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 все эти пункты (см. код) появляются в системном меню. Как добиться того, чтобы они появлялись только по "правой клавише", т.е. приложение получило новое контекстное меню?