IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Меню, WinAPI
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
TmpArray : array[0..100 - 1] of Char;
mymenu:Hmenu;
begin
Wnd := FindWindow('Notepad',nil);
GetWindowText(wnd, @TmpArray, 100);
label1.caption:=tmparray;
mymenu:=getmenu(wnd);
label2.Caption:=inttostr(GetMenuItemCount(mymenu));
end;
Тут я нашел окно блокнота, узнал его заголовок и количество пунктов меню. Как узнать название пункта ? и если есть его подпунтков?

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


program Project1;
uses
windows,messages;
const
wndclass = 'twinapiwnd';
wndcaption = 'Главное меню формы на win api';
mfile = 100;
medit = 200;
mcheck = 300;
sexit = 101;
scopy = 201;
scut = 202;
spaste = 203;
sselect = 301;
snextmenu = 302;
ssecondlevel = 311;
separator = 1;

var
wc: twndclassex;
wnd: hwnd;
msg: tmsg;
mainmenu: hmenu;
submenufile: hmenu;
submenuedit: hmenu;
submenucheck: hmenu;
submenusecondlevel: hmenu;
check: boolean = false;

function createmenuitem( hmenu, submenu: hmenu; cap: pchar;
_uid, _wid: uint; sep: boolean ): boolean;
var
mi: menuiteminfo;
begin
with mi do
begin
cbsize := sizeof( mi );
fmask := miim_state or miim_type or miim_submenu or miim_id;
if not sep then
ftype := mft_string
else
ftype := mft_separator;
fstate := mfs_enabled;
wid := _wid;
hsubmenu := submenu;
dwitemdata := 0;
dwtypedata := cap;
cch := sizeof( cap );
end;
result := insertmenuitem( hmenu, _uid, false, mi );
end;


function windowproc( wnd: hwnd; msg: uint; wparam: wparam; lparam: lparam ): lresult; stdcall;
begin
case msg of
wm_destroy: begin
postquitmessage( 0 );
result := 0;
exit;
end;
wm_command: begin
case loword( wparam ) of
sexit: postmessage( wnd, wm_quit, 0, 0 );
scopy: messagebox( wnd, 'Пункт: copy', 'Меню: edit', 0 );
scut: messagebox( wnd, 'Пункт: cut', 'Меню: edit', 0 );
spaste: messagebox( wnd, 'Пункт: paste', 'Меню: edit', 0 );
sselect: begin
if check then
checkmenuitem( submenucheck, sselect, mf_unchecked )
else
checkmenuitem( submenucheck, sselect, mf_checked );
check := not check;
end;
ssecondlevel: messagebeep( mb_iconhand );
end;
end;
else
result := defwindowproc( wnd, msg, wparam, lparam );
end;
end;


begin
// Создаем меню
mainmenu := createmenu;
// Заполняем структуру twndclassex
with wc do
begin
cbsize := sizeof( wc );
style := cs_hredraw or cs_vredraw;
lpfnwndproc := @windowproc;
cbclsextra := 0;
cbwndextra := 0;
hinstance := hinstance;
hicon := loadicon( 0, idi_application );
hcursor := loadcursor( 0, idc_arrow );
hbrbackground := color_window;
lpszmenuname := @mainmenu;
lpszclassname := wndclass;
end;
// Регистрируем класс в системе
registerclassex( wc );
// Создаем подменю
submenufile := createpopupmenu;
submenuedit := createpopupmenu;
submenucheck := createpopupmenu;
submenusecondlevel := createpopupmenu;
// Создаем окно
wnd := createwindowex( 0, wndclass, wndcaption, ws_overlappedwindow,
10, 10, 300, 100, 0, mainmenu, hinstance, nil );
// Создаем пункты главного меню
createmenuitem( mainmenu, submenufile, 'file', 0, mfile, false );
createmenuitem( mainmenu, submenuedit, 'edit', 0, mfile, false );
createmenuitem( mainmenu, submenucheck, 'check', 0, mfile, false );
// Подменю для пункта file
createmenuitem( submenufile, 0, 'exit', 0, sexit, false );
// Подменю для пункта edit
createmenuitem( submenuedit, 0, 'copy', 0, scopy, false );
createmenuitem( submenuedit, 0, 'cut', 0, scut, false );
createmenuitem( submenuedit, 0, ' ', 0, separator, true );
createmenuitem( submenuedit, 0, 'paste', 0, spaste, false );
// Подменю для пункта check->nextmenu
createmenuitem( submenusecondlevel, 0, 'beep', 0, ssecondlevel, false );
// Подменю для пункта check
createmenuitem( submenucheck, 0, 'select', 0, sselect, false );
createmenuitem( submenucheck, submenusecondlevel, 'nextmenu', 0, snextmenu, false );
// Перерисовываем меню
drawmenubar( wnd );
// Показываем окно
showwindow( wnd, sw_shownormal );

// Цикл обработки сообщений
while getmessage( msg, 0, 0, 0 ) do
begin
translatemessage( msg );
dispatchmessage( msg );
end;
halt( msg.wparam );
end.
Вот нашел щас буду учить)
Цитата
setmenu
function setmenu( hwnd: hwnd; hmenu: hmenu ): bool; Функция setmenu связываем новое меню с окном. hwnd Идентификатор окна, которому должно быть назначено новое меню. hmenu Идентификатор меню, которое должно быть назначено окну. Если этот параметр нулевой, текущее меню окна удаляется.
Это не понятно, или у меня не что не связалось или не увидел
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Client   Меню   14.08.2009 17:59
volvo   Скажем, вот так: procedure ListSubmenus(s: string;…   14.08.2009 18:57
Client   Спасибо! есть 2 вопроса GetMenuString(menu, i,…   14.08.2009 19:11
volvo   Это параметр, который определяет, что передается в…   14.08.2009 19:20
Client   Т.е. берется название его? А это тоже самое что ес…   15.08.2009 17:54
volvo   Нет, ты не понял... Смотри, допустим имеется вот т…   15.08.2009 18:10
Client   Понял, спасибо. Щас еще покапаю что-нибудь)   15.08.2009 18:19
Client   :) теперь хочу скопировать меню из блокнота в мен…   16.08.2009 22:20
volvo   А при чем тут PopupMenu? Ты ж хочешь меню скопиров…   16.08.2009 22:35
Client   Да я хочу скопировать МЕНЮ целиком из блокнота в с…   16.08.2009 23:06
volvo   В таком случае название темы не соответствует дейс…   16.08.2009 23:54
Client   я пока создавал только VCL приложения (форма, кноп…   16.08.2009 23:59
volvo   Это не совсем консоль. Это оконное приложение, но …   17.08.2009 0:01
Client   program Project1; uses windows,messages; const w…   17.08.2009 17:28
volvo   Что именно не понятно?   17.08.2009 17:39
Client   wnd1:=FindWindow('Notepad',nil); SetMenu(w…   17.08.2009 17:47
volvo   Ну, это уж я не знаю, как ты пробовал: Только пе…   17.08.2009 18:17
Client   омг я не туда смотрел) Думал из блокнота в мой про…   17.08.2009 18:21
volvo   Это тебе так надо: wnd1 := FindWindow('Notepad…   17.08.2009 18:30
Client   case msg of wm_destroy: begin SetMenu(wn…   17.08.2009 18:40
volvo   Ты своему классу поставил в соответствие эту саму…   17.08.2009 18:59
Client   Надо ловить нажатие кнопки меню и выполнять тоже д…   18.08.2009 21:22
volvo   Надо блокноту "подсунуть" обработчик соб…   18.08.2009 21:59
Client   Гуглил, гуглил и нагуглил :) Тут описан сабкласс…   20.08.2009 22:15
volvo   Странно... Первая ссылка Гугла выводит на Виноград…   20.08.2009 22:31
Client   пасиб за ссылки) получается что окнами могут быть …   20.08.2009 22:40
volvo   Естественно. Все наследники TWinControl (я про VCL…   20.08.2009 22:58
Client   Обязательно :) А что такое HWND и THANDLE? какая…   20.08.2009 23:17
volvo   Технически - никакой. И то и другое - переименован…   21.08.2009 0:10
Client   ОК :) будет еще 1 тема СПАСИБО VOLVO ЗА ПОМОЩЬ…   21.08.2009 1:26


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 6.09.2025 8:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name