Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ресурсы в C++ Builder, Как создать меню не используя VCL? 
V
    Опции темы
ZufuS
Дата 3.5.2007, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Как создать меню не используя VCL?
PM   Вверх
586
Дата 3.5.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



1) CreateMenu
2) В ресурсах:

1) создаёшь res-файл
2) добавляешь в проект
3) редактируешь в редакторе ресурсов и сохраняешь (т.е. добавляешь в ресурсы меню)
4) компилируешь приложение

Это сообщение отредактировал(а) 586 - 3.5.2007, 00:49
PM   Вверх
Klin
Дата 3.5.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(586 @  3.5.2007,  01:43 Найти цитируемый пост)
3) 1)Берешь редактор ресурсов

Если нужно создать отдельный RES файл, то используйте программу brcc32, которая находится в папке BIN у билдера.

Добавлено через 27 секунд
вот так блин, все изменяем smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
HappyLife
Дата 3.5.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Рекомендую Restorator 2005
PM MAIL   Вверх
ama_kid
Дата 3.5.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



ZufuS
Когда надоест баловаться предложенными выше игрушками - можешь попробовать создать меню на чистом API:
Код
// .cpp - ФАЙЛ
...
void __fastcall TForm1::OnCommandMessage(TMessage& Message)
{
  if (Message.WParamLo==ID_EXIT)
    {
        Close();
    }
  if (Message.WParamLo==ID_HELP)
    {
        MessageBox(NULL,"You've got help now!",NULL,MB_OK);
    }
    TForm::Dispatch(&Message);
};

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    MyMenu = CreateMenu();
    MyFileMenu = CreateMenu();
    MyHelpMenu = CreateMenu();
    AppendMenu(MyFileMenu, MF_STRING,ID_OPEN,"Open...");
    AppendMenu(MyFileMenu, MF_SEPARATOR,NULL,"");
    AppendMenu(MyFileMenu, MF_STRING,ID_EXIT,"Exit...");
    AppendMenu(MyHelpMenu, MF_STRING,ID_HELP,"Help");
    AppendMenu(MyHelpMenu, MF_SEPARATOR,NULL,"");
    AppendMenu(MyHelpMenu, MF_STRING,ID_ABOUT,"About...");
    AppendMenu(MyMenu,MF_POPUP | MF_STRING,(unsigned int)MyFileMenu,"File");
    AppendMenu(MyMenu,MF_POPUP | MF_STRING,(unsigned int)MyHelpMenu,"Help");
    ::SetMenu(this->Handle,MyMenu);
}
...
// .h - ФАЙЛ 
...
#define ID_EXIT 100
#define ID_OPEN 101
#define ID_HELP 102
#define ID_ABOUT 103
...
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
    HMENU MyMenu;
    HMENU MyFileMenu;
    HMENU MyHelpMenu;
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
protected:
    void __fastcall OnCommandMessage(TMessage& Message);
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER( (WM_COMMAND),TMessage,OnCommandMessage)
END_MESSAGE_MAP(TForm)
...


Это сообщение отредактировал(а) ama_kid - 3.5.2007, 12:33


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Klin
Дата 3.5.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(HappyLife @  3.5.2007,  10:15 Найти цитируемый пост)
Рекомендую Restorator 2005 

Он разве умеет создавать res файлы?


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
HappyLife
Дата 3.5.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Klin
Он больше ничего и не умеет)
на wasm.ru валяется версия с кряком.
Пользуюсь регулярно. Нравиться.

Это сообщение отредактировал(а) HappyLife - 3.5.2007, 19:34
PM MAIL   Вверх
Klin
Дата 3.5.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



У самого стоит (только старее), я имел ввиду, что умеет только редактировать. Похоже пора обновить, спасибо за линк smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
ZufuS
Дата 4.5.2007, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Пробовал сделать примеры, которые находил в интернете, но при попытке создать *.res он не создавался. Хотелось бы рабочий пример.
PM   Вверх
Klin
Дата 4.5.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Создание ресурсов с помощью brcc32 (который находится в папке BIN):

1) Создаем файл с расширением RC (к примеру file.rc)
2) С помощью любого текстового реадктора пишем в нем нужные файлы в следующей форме:
  Название_ресурса Тип_ресурса Путь_к_файлу
 пример: MyMenu MENU  "menu.txt"
3) Открываем RC файл в brcc32 (или просто кидаем RC файл на иконку brcc32) и получаем RES файл
4) Прописываем в программе:
Код

 #pragma resource "File.res"



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
dumb
Дата 4.5.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



столкнулся тут недавно...
хозяйке на заметку(Builder < 2006):

симпотомы: если в ресурс попадает иконка, содержащая более 4х изображений, resource linker'у становится сильно плохо, и процесс сборки приложения обрывается внутренней ошибкой.

что делать: "дробить" иконку, либо ставить 2006, где эта проблема пофиксена.
PM MAIL   Вверх
Klin
Дата 4.5.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(Klin @  4.5.2007,  15:12 Найти цитируемый пост)
Создание ресурсов с помощью brcc32 (который находится в папке BIN):

Ошибся, меню легче делается smile
1) Создаем файл с расширением RC (к примеру file.rc)
2) Записываем в него код меню (взято из хелпа):
Код

sample MENU
BEGIN
     MENUITEM "&Soup", 100
     MENUITEM "S&alad", 101
     POPUP "&Entree"
     BEGIN
          MENUITEM "&Fish", 200
          MENUITEM "&Chicken", 201, CHECKED
          POPUP "&Beef"
          BEGIN
               MENUITEM "&Steak", 301
               MENUITEM "&Prime Rib", 302
          END
     END
     MENUITEM "&Dessert", 103
END

3) Открываем RC файл в brcc32 (или просто кидаем RC файл на иконку brcc32) и получаем RES файл
4) Прописываем в программе.

Цитата(dumb @  4.5.2007,  15:21 Найти цитируемый пост)
симпотомы: если в ресурс попадает иконка, содержащая более 4х изображений, resource linker'у становится сильно плохо, и процесс сборки приложения обрывается внутренней ошибкой.

Как ресурсы используешь?

Добавлено через 9 минут и 53 секунды
Цитата(Klin @  4.5.2007,  15:26 Найти цитируемый пост)
3) Открываем RC файл в brcc32 (или просто кидаем RC файл на иконку brcc32) и получаем RES файл

Или просто добавляешь RC файл к проекту (меню Project->Add to project или Shift + F11)  и оно добавится автоматически.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
dumb
Дата 4.5.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(Klin @  4.5.2007,  14:26 Найти цитируемый пост)
Как ресурсы используешь?

по-фи-гу как. smile как угодно - все равно ошибку даст.
PM MAIL   Вверх
ZufuS
Дата 4.5.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Klin, файл res сотворился, непонятно только что дальше с ним делать. Я заменил им project1.res. Если я правильно понял, то имя, в данном случае sapmle, это типа константа, которой надо присвоить число.(?) Поэтому я вместо sample написал 1234 и в инициализации объекта оконного класса написал
Код

wcl.lpszMenuName = MAKEINTRESOURCE(1234);

но меню не появилось.

Это сообщение отредактировал(а) ZufuS - 4.5.2007, 18:25
PM   Вверх
Klin
Дата 4.5.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(ZufuS @  4.5.2007,  19:23 Найти цитируемый пост)
но меню не появилось.

Я бы удивился smile
На самом деле все просто:
Код

 ::SetMenu(Handle,LoadMenu(0,"sample"));


Добавлено через 1 минуту и 13 секунд
А если нужно что-то изменить или события добавить ;), то используй свойство Menu (this->Menu);


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
ZufuS
Дата 5.5.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Появилось smile
Спасибо.

Это сообщение отредактировал(а) ZufuS - 5.5.2007, 00:25
PM   Вверх
Klin
Дата 5.5.2007, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Всегда рад любому выражению признательности smile

Это сообщение отредактировал(а) Klin - 5.5.2007, 00:28


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
ZufuS
Дата 5.5.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Теперь непонятно, как изменять меню в коде программы, например, почему RemoveMenu(LoadMenu(0,"Menu"),100,NULL); не удаляет Soup?
PM   Вверх
Klin
Дата 5.5.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Если работаем с функциями API, то нужно действовать так:
Код

 HMENU my = LoadMenu(0,MAKEINTRESOURCE(100));
 ::SetMenu(Handle,my);
 DeleteMenu(my,0,MF_BYPOSITION);



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
ZufuS
Дата 5.5.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



В rc писал примерно
Код

Menu MENU
BEGIN
    MENUITEM "1", 100
    MENUITEM "2", 101
    MENUITEM "3", 101
    MENUITEM "4", 101
END

в cpp
Код

HMENU hMenu = LoadMenu(0,"Menu");
::SetMenu(hWnd, hMenu);
DeleteMenu(hMenu,0,100);

Пункт меню не удалился
PS что здесь означает ::? без него вроде тоже работает.
PM   Вверх
Klin
Дата 5.5.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(ZufuS @  5.5.2007,  17:42 Найти цитируемый пост)
PS что здесь означает ::? без него вроде тоже работает. 

У меня не работает
Цитата(ZufuS @  5.5.2007,  17:42 Найти цитируемый пост)
DeleteMenu(hMenu,0,100);

Что за 100?  Нужно MF_BYPOSITION.
Код

 HMENU hMenu = LoadMenu(0,"Menu");
 ::SetMenu(hWnd, hMenu);
 DeleteMenu(hMenu,0, MF_BYPOSITION);


0 - порядковый номер вашего меню.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
ZufuS
Дата 5.5.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Спасибо

Это сообщение отредактировал(а) ZufuS - 5.5.2007, 16:53
PM   Вверх
cyberstream
Дата 4.9.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Народ, а как вставить пункт в контекстное меню приложения (вызываемое правым кликом на taskbar-e)?  То есть он вставляется, но не работает. Что упустил?
Код


// код *.сpp
HMENU hSystemMenu;
const SC_UserItem = WM_USER + 1;
//=== ========================================================*/
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{   hSystemMenu = GetSystemMenu([I]Application->Handle[/I], false);
    AppendMenu(hSystemMenu, MF_SEPARATOR, 0, "");
    AppendMenu(hSystemMenu, MF_STRING, SC_UserItem, "&Условие задачи");
}//=== =======================================================*/

void __fastcall TForm1::WMSysCommand(TWMSysCommand& Msg)
{  if (Msg.CmdType == SC_UserItem) 
                 MessageBox(NULL, "Works !!!", "Message", MB_OK); 
   DefWindowProc(Handle,WM_SYSCOMMAND,Msg.CmdType, MAKELPARAM(Msg.XPos,Msg.YPos));
   Msg.Result=0;
}//===========================================================*/

// код *.h

class TForm1 : public TForm
{
__published:    // IDE-managed Components
...
        void __fastcall WMSysCommand(TWMSysCommand& Msg);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_SYSCOMMAND,TWMSysCommand,WMSysCommand);
        END_MESSAGE_MAP(TComponent);
};

--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
586
Дата 4.9.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



8: AppendMenu(hSystemMenu, MF_STRING | MF_BYCOMMAND, SC_UserItem, "&Условие задачи");

PM   Вверх
cyberstream
Дата 5.9.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Это сути дела не меняет.
При
Код

(в меню окна)
    InsertMenu(GetSystemMenu([color=red]Handle[/color], false);,SC_CLOSE, MF_STRING | MF_BYCOMMAND, SC_UserItem, "&Run OCARA");
 вызывается void __fastcall TForm1::WMSysCommand(TWMSysCommand& Msg),а 
Код

(в контекстное меню приложения - right click on taskbar)
    InsertMenu(GetSystemMenu([color=red]Application->Handle[/color], false);,SC_CLOSE, MF_STRING | MF_BYCOMMAND, SC_UserItem, "&Run OCARA");
 нет. Как поправить?


--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1129 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.