Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
25 / 25 / 5
Регистрация: 21.04.2011
Сообщений: 141
1

Работа с ресурсами

23.02.2012, 16:18. Показов 4555. Ответов 4
Метки нет (Все метки)

Нужно сделать программу с линейкой меню код такой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <windows.h>
#include <windowsx.h>
#define MI_BLUE 100
#define MI_GREEN 101
#define MI_EXIT 102
 
 
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);//Оконная функция
void OnDestroy(HWND);
void OnPaint(HWND);
void OnCommand(HWND,int,HWND,UINT);
BOOL OnCreate(HWND,LPCREATESTRUCT);
 
HBRUSH hBlueBrush,hGreenBrush;//Дескрипторы кистей фона
int sw;//Переключатель для управления фоном окна
 
Main MENU{
    POPUP "&Фон"{
        MENUITEM "&Синий",MI_BLUE
    }
}
 
 
int WINAPI WinMain (HINSTANCE hInst,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    char szClassName[]="MainWindow";
    char szTitle[]="Program";
    MSG Msg;                                    //Структура для получения сообщений Windows
    WNDCLASS wincl;                             //Структура для задания характеристик окна
    ZeroMemory(&wincl,sizeof(wincl));           //Обнудение всех членов структуры
    wincl.hInstance=hInst;                      //Дескрипртор данного приложения
    wincl.lpszClassName=szClassName;            //Имя класса окна
    wincl.lpfnWndProc=WndProc;                  //Определяем оконную процедуру для главного окна
    wincl.hIcon=LoadIcon(NULL,IDI_APPLICATION); //Стандартнаяпиктограмма
    wincl.lpszMenuName="Main";
    wincl.hCursor=LoadCursor(NULL,IDC_ARROW);
    wincl.hbrBackground=(HBRUSH)(LTGRAY_BRUSH);
    RegisterClass(&wincl);                      //Регистрация класса окна
 
    HWND hwnd=CreateWindow(szClassName,szTitle, //Класс и заголовок окна
                    WS_OVERLAPPEDWINDOW,100,100,500,300,//Стиль окна, координаты и размеры
           HWND_DESKTOP,NULL,hInst,NULL);
 
    ShowWindow (hwnd, nCmdShow);//Функция показа окна
 
    //Цикл обнаружения сообщений
    while(GetMessage(&Msg,NULL,0,0))//Если есть сообщение то передать его
    {
       DispatchMessage(&Msg);
    }
   return 0;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);
        HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
        HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
        HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}
void OnDestroy(HWND){
    PostQuitMessage(0);
}
void OnPaint(HWND hwnd){
    PAINTSTRUCT ps;
    HDC hdc=BeginPaint(hwnd,&ps);
    if(sw==1) FillRect(hdc,&ps.rcPaint,hBlueBrush);
    EndPaint(hwnd,&ps);
}
 
BOOL OnCreate(HWND,LPCREATESTRUCT){
    hBlueBrush=CreateSolidBrush(RGB(100,100,255));
    hGreenBrush=CreateSolidBrush(RGB(100,255,100));
    return TRUE;
}
void OnCommand(HWND hwnd,int id,HWND,UINT){
    switch(id){
        case MI_BLUE:
            sw=1;
            InvalidateRect(hwnd,NULL,TRUE);
        break;
    }
}
выдается ошибка: `Main' does not name a type. с чем это связано? Работаю в Code::Blocks
И еще вопрос по поводу ресурсов: я знаю что часть кода:
C++
1
2
3
4
5
Main MENU{
    POPUP "&Фон"{
        MENUITEM "&Синий",MI_BLUE
    }
}
должна быть в файле с расширением .res Я делал так в Code::Blocks я не нашел способа сделать файл с таким расширением поэтому я взял программку ResEdit и с помощью нее сделал пустой файл. и уже в Code::Blocks добавил этот файл в проект и написал код меню. - так вообще правильно или нет? Но влюбом случае у меня была все та же ошибка и я на всякий случай перенес ее в основной файл.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2012, 16:18
Ответы с готовыми решениями:

Работа с ресурсами файла
Моя задача написать программу в среде Builder C++ которая будет изменять версию заданного файла...

Работа с ресурсами: извлечение файла на жесткий диск
Господа у меня в программе в ресурсах лежит файл .exe каким образом я могу его извлеч на жёсткий...

Где почитать о работе с ресурсами в WinAPI и Visual Studio?
Интересует работа с .gif и картинками. Хочу научиться добавлять их в приложение и уметь выгружать...

Где почитать как пользоваться ресурсами при проектировании GUI
Где почитать как пользоваться ресурсами при проектировании GUI не могу найти информацию о том как...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
4
Исследователь
316 / 315 / 24
Регистрация: 06.04.2011
Сообщений: 870
24.02.2012, 02:20 2
Не знаю как там насчет создания res-файлов в Code::Blocks, не работал в нем. Но, возможно, там можно создать файл .rc - файл проекта ресурсов. Тогда туда и надо вставлять этот код.
И вместо wincl.lpszMenuName="Main" напишите wincl.lpszMenuName=MAKEINTRESOURCE(Main).
0
25 / 25 / 5
Регистрация: 21.04.2011
Сообщений: 141
24.02.2012, 16:34  [ТС] 3
не помогает если wincl.lpszMenuName="Main" заменить на wincl.lpszMenuName=MAKEINTRESOURCE(Main) то выдается ошибка
Each undeclared identifier is reported only once for each function it appears in.

и еще такой вопрос чем .rs отличается от .res?
0
Ni-san
17.06.2012, 11:24 4
чем .rs отличается от .res?
не .rs, а .rc - это неоткомпилированный файл ресурсов, доступный для редактирования. .res - уже откомпилированный и готовый для использования.

`Main' does not name a type
- возможно, есть смысл изменить название. Все-таки 'main' - зарезервированное слово
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30907 / 20222 / 7883
Регистрация: 22.10.2011
Сообщений: 35,098
Записей в блоге: 6
17.06.2012, 11:41 5
Цитата Сообщение от Ni-san Посмотреть сообщение
возможно, есть смысл изменить название. Все-таки 'main' - зарезервированное слово
main - зарезервированное слово, Main - нет. Не надо ничего менять, достаточно просто правильно оформить RC-файл:

myrc.rc
Код
#include <windows.h>
#include "resource.h"

Main MENU DISCARDABLE
BEGIN
  POPUP "&Фон"
  BEGIN
    MENUITEM "&Синий", MI_BLUE
  END
END
в файле resource.h за-define-ить Main и MI_BLUE, скажем, так:

C++
1
2
#define Main 102
#define MI_BLUE 105
, добавить к проекту myrc.rc, и работать с меню:

C++
1
2
3
// ...
wincl.lpszMenuName=MAKEINTRESOURCE(Main);
// ...
. Да, у меня Code::Blocks, скопировал эти отрывки кода из работающего приложения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2012, 11:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Работа с ресурсами.
Какая функция отвечает за удаление ресурса из exe проги во время её работы или по завершению...

Работа с ресурсами
Всем доброго времени суток, с наступившим новым годом! Есть проблема: Я создал две процедуры,...

Работа с ресурсами
Такой вопрос - например, я &quot;засунул&quot; базу данных в ресурсы, как только программа запускается, эта...

Работа с ресурсами
Вообщем вся картина на картине :) Вот Main.cpp void error(char code) { cout &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.