Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Ресурсы в C++ Builder


Автор: ZufuS 3.5.2007, 00:30
Как создать меню не используя VCL?

Автор: 586 3.5.2007, 00:43
1) CreateMenu
2) В ресурсах:

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

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

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

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

Автор: HappyLife 3.5.2007, 09:15
Рекомендую Restorator 2005

Автор: ama_kid 3.5.2007, 11:44
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)
...

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

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

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

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

Автор: ZufuS 4.5.2007, 05:48
Пробовал сделать примеры, которые находил в интернете, но при попытке создать *.res он не создавался. Хотелось бы рабочий пример.

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

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

 #pragma resource "File.res"

Автор: dumb 4.5.2007, 14:21
столкнулся тут недавно...
хозяйке на заметку(Builder < 2006):

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

что делать: "дробить" иконку, либо ставить 2006, где эта проблема пофиксена.

Автор: Klin 4.5.2007, 14:26
Цитата(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)  и оно добавится автоматически.

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

по-фи-гу как. smile как угодно - все равно ошибку даст.

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

wcl.lpszMenuName = MAKEINTRESOURCE(1234);

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

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

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

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


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

Автор: ZufuS 5.5.2007, 00:23
Появилось smile
Спасибо.

Автор: Klin 5.5.2007, 00:28
Всегда рад любому выражению признательности smile

Автор: ZufuS 5.5.2007, 14:47
Теперь непонятно, как изменять меню в коде программы, например, почему RemoveMenu(LoadMenu(0,"Menu"),100,NULL); не удаляет Soup?

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

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

Автор: ZufuS 5.5.2007, 16:42
В 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 что здесь означает ::? без него вроде тоже работает.

Автор: Klin 5.5.2007, 16:47
Цитата(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 - порядковый номер вашего меню.

Автор: ZufuS 5.5.2007, 16:51
Спасибо

Автор: cyberstream 4.9.2007, 22:07
Народ, а как вставить пункт в контекстное меню приложения (вызываемое правым кликом на 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);
};

Автор: 586 4.9.2007, 22:53
8: AppendMenu(hSystemMenu, MF_STRING | MF_BYCOMMAND, SC_UserItem, "&Условие задачи");

Автор: cyberstream 5.9.2007, 08:39
Это сути дела не меняет.
При
Код

(в меню окна)
    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");
 нет. Как поправить?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)