![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Client |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
procedure TForm1.Button1Click(Sender: TObject);Тут я нашел окно блокнота, узнал его заголовок и количество пунктов меню. Как узнать название пункта ? и если есть его подпунтков? Сообщение отредактировано: Client - 14.08.2009 14:02 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Скажем, вот так:
procedure ListSubmenus(s: string; memo: TMemo; menu: HMENU);Вот чего получилось: Эскизы прикрепленных изображений ![]() |
Client |
![]()
Сообщение
#3
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Спасибо!
есть 2 вопроса GetMenuString(menu, i, TmpArray, sizeof(TmpArray), MF_BYPOSITION); что за параметр MF_BYPOSITION? Memo.Lines.Add(Format('%sItem #%d : %s', [s, i, TmpArray])); как тут задается формат? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата что за параметр MF_BYPOSITION? Это параметр, который определяет, что передается в функцию вторым параметром. Если указываешь MF_BYPOSITION, то этот параметр расценивается как порядковый номер элемента меню, начиная с 0. Если указать MF_BYCOMMAND - значит, будет трактоваться как команда (т.е., сообщение, которое отсылается при выборе пункта меню).Цитата как тут задается формат? Как в Сях, так и тут. В "DRKB -> Язык программирования Delphi -> Работа со строками -> Форматирование строк -> Функции форматирования строк" посмотри, там написано какие могут быть спецификаторы. |
Client |
![]()
Сообщение
#5
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Цитата Если указываешь MF_BYPOSITION, то этот параметр расценивается как порядковый номер элемента меню, начиная с 0 Т.е. берется название его? Цитата Если указать MF_BYCOMMAND - значит, будет трактоваться как команда А это тоже самое что если бы нажать по этому пункту меню? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Нет, ты не понял... Смотри, допустим имеется вот такое описание меню в ресурсах:
POPUP "Название" GetMenuString(menu, 4, TmpArray, sizeof(TmpArray), MF_BYPOSITION);. Тогда в TmpArray возвращается метка элемента меню с индексом 4, то есть, нулевой, первый, второй и третий пропускаются, и берется четвертый. TmpArray будет хранить что? Правильно, "Выход". Если же MF_BYCOMMAND - то берется метка элемента меню, у которого идентификатор = 4, то есть, что? Правильно, "Пункт 2". Чувствуешь разницу? |
Client |
![]()
Сообщение
#7
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Понял, спасибо.
Щас еще покапаю что-нибудь) |
Client |
![]()
Сообщение
#8
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
![]() теперь хочу скопировать меню из блокнота в меню в моей программе. Проблема в том, что не могу добавить элемент в Popupmenu. Вроде так PopupMenu1.Items.Add(), только какой параметр надо я не знаю Upd все уже понял) Сообщение отредактировано: Client - 16.08.2009 18:30 |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
А при чем тут PopupMenu? Ты ж хочешь меню скопировать оттуда себе? Вот и копируй меню... MSDN -> CreateMenu + там дальше по ссылкам: InsertMenuItem, AppendMenu, и InsertMenu - в помощь...
Иначе у тебя уже не WinAPI, а VCL получается... |
Client |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Да я хочу скопировать МЕНЮ целиком из блокнота в свою программу.
Цитата Иначе у тебя уже не WinAPI, а VCL получается... Хм, у меня форма, на ней мемо и кнопка. Что не так? или лучше создать консольное приложение? |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
В таком случае название темы не соответствует действительности. Реши для себя, ты хочешь чистый WinAPI, или хочешь пользоваться VCL-ными "плюшками".
|
Client |
![]()
Сообщение
#12
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
я пока создавал только VCL приложения (форма, кнопки).
А для WinAPI надо консольное создавать? буду смотреть для примера как делать хоть что-то в консоли |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Это не совсем консоль. Это оконное приложение, но безо всяких библиотек-оберток. Да, создается консольное приложение, и в нем пишется весь код. Ручками, потому что никаких компонентов нет.
|
Client |
![]()
Сообщение
#14
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
program Project1;Вот нашел щас буду учить) Цитата setmenu Это не понятно, или у меня не что не связалось или не увиделfunction setmenu( hwnd: hwnd; hmenu: hmenu ): bool; Функция setmenu связываем новое меню с окном. hwnd Идентификатор окна, которому должно быть назначено новое меню. hmenu Идентификатор меню, которое должно быть назначено окну. Если этот параметр нулевой, текущее меню окна удаляется. |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Цитата Это не понятно Что именно не понятно? |
Client |
![]()
Сообщение
#16
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
wnd1:=FindWindow('Notepad',nil);Попробовал добавить в код выше. Ничего. И как можно вывести название окна тут? (label'а то нету) Добавлено через 4 мин. wnd1:=FindWindow('Notepad',nil);Вывести смог ![]() |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
|
Client |
![]()
Сообщение
#18
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
омг я не туда смотрел) Думал из блокнота в мой проект меню скопируется
А почему блокнот не реагирует на нажатие по меню? Добавлено через 4 мин. Цитата Подумай, как это можно сделать Сохранив меню в переменную типа HMenu. А событие на закрытие формы
function windowproc( wnd: hwnd; msg: uint; wparam: wparam; lparam: lparam ): lresult; stdcall;? |
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
Цитата Думал из блокнота в мой проект меню скопируется Это тебе так надо:wnd1 := FindWindow('Notepad',nil); Цитата А почему блокнот не реагирует на нажатие по меню? А потому что меню твое обрабатывается в ТВОЕЙ функции окна, а не в блокнотовской. Чтобы Блокнот реагировал на твое меню, мало заменить само меню, надо еще заменить (ну, или расширить) оконную функцию. Вот в приведенном здесь примере твое приложение тоже не будет реагировать на Блокнотовские команды, оно просто про них не знает. |
Client |
![]()
Сообщение
#20
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
case msg ofВозвращает меню назад) Добавлено через 11 мин. А почему нет обращения к функции function windowprocхоть она и выполняется? И зачем нужна регистрация класса? |
![]() ![]() |
![]() |
Текстовая версия | 9.07.2025 3:13 |