Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с написанием Resource Script

33K
01 ноября 2008 года
Pro2005
26 / / 01.11.2008
Юзаю в данный момент книгу "Win32 Основы программирования" Автор написал что использовать VC v.6.0
Так вот в чем моя проблема ....
Вот он дает такой код:
Код:
//файл 6-1.h
#define MI_ABOUT 100
#define MI_EXIT 101
#define MI_NEW 102

LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM,LPARAM);
void OnCommand ( HWND, int, HWND, UINT );
void OnDestroy ( HWND );

BOOL CALLBACK DlgProc ( HWND, UINT, WPARAM, LPARAM );
BOOL DlgOnInitDialog ( HWND, HWND, LPARAM );
void DlgOnCommand ( HWND, int, HWND, UINT );


//файл 6-1.rc
#include "6-1.h"
Main MENU {
   POPUP "&Файл" {
     MENUITEM "&О программе..." , MI_ABOUT
     MENUITEM SEPARATOR
     MENUITEM "В&ыход", MMI_EXIT
    }
}

About DIALOG 60,15,93,50
STYLE WS_SYSMENU | WS_CAPTION |WS_POPUP|DS_MODALFRAME
CAPTION "О программе"{
   CTEXT "Автор программы..", -1,12,4,72,25
   PUSHBUTTON "Закрыть", IDOK, 27,32,43,12
}

//файл 6-1.cpp
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include "6-1.h"

HINSTANCE hInstance;

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE, LPSTRM int){
   char szClassName [] = "ClassName";
   char szTitle [] = "Title";
   MSG msg;
   WNDCLASS wc;
   hInstance = hInst;
   memset ( &wc, 0, sizeof(wc));
   wc.lpfnWndProc = WndProc;
   wc.hInstance = hInst;
   wc.hIcon = LoadIcon ( NULL, IDI_APPLICATION );
   wc.hbrBackground = GetStockBrush ( WHITE_BRUSH );
   wc.lpszMenuName = "Main";
   wc.lpszClassName = szClassName;

   RegisterClass ( &wc );

   HWND hWnd = CreateWindow ( szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 350, 200, HWND_DESKTOP, NULL, hInst, NULL );
   ShowWindow ( hWnd, SW_SHOWNORMAL );
   ..... И так далее :)


Проблема в том что я не могу понять файл *.rc
я его создаю... на как такого редактора кода нет...
Пытаюсь с помощью блокнота отредактировать ( все там удалить и вставить свой код)
но он выдает ошибку....error RC2104: undefined keyword or key name: MI_ABOUT ( потом MI_EXIT )
Объясните пожалуйста может это я что то неправильно делаю???
37K
01 ноября 2008 года
Lady Cygna
17 / / 31.05.2008
Используй вместо макросов MI_ABOUT, MI_EXIT, MI_NEW макросы
IDOK, IDCANCEL, IDYES.
562
01 ноября 2008 года
tarekon
175 / / 19.08.2003
Цитата: Lady Cygna
Используй вместо макросов MI_ABOUT, MI_EXIT, MI_NEW макросы
IDOK, IDCANCEL, IDYES.



Это неправильный совет. Всё равно что
-Доктор, когда я хожу, у меня побаливает нога.
-Ну так перестаньте ходить!

Проблема в том, что компилятор сообщений почему-то не может найти вышеупомянутые идентификаторы в файле 6-1.h (или не может найти сам файл). Какие-нибудь еще сообщения об ошибках появляются?

397
02 ноября 2008 года
SergPas
527 / / 03.02.2007
Цитата:
Пытаюсь с помощью блокнота отредактировать ( все там удалить и вставить свой код)
но он выдает ошибку....error RC2104: undefined keyword or key name: MI_ABOUT ( потом MI_EXIT )
Объясните пожалуйста может это я что то неправильно делаю???


По поводу файлов ресурсов: создавайте этот файл ручками, так как редактор ресурсов много чего лишнего туда добавляет...
Код, который Вы привели, не содержит ошибок и должен компилироваться без ошибок в случае, если в файл 6-1.rc добавить директиву:

 
Код:
#include <windows.h>

В случае отсутствия этой строки компилятор ругнется...
562
02 ноября 2008 года
tarekon
175 / / 19.08.2003
Цитата: SergPas
По поводу файлов ресурсов: создавайте этот файл ручками, так как редактор ресурсов много чего лишнего туда добавляет...
Код, который Вы привели, не содержит ошибок и должен компилироваться без ошибок в случае, если в файл 6-1.rc добавить директиву:
 
Код:
#include <windows.h>

В случае отсутствия этой строки компилятор ругнется...



Добавлять Windows.h в ресурсы - слишком тяжелое и не совсем корректное решение - компилятор сообщений не обязан, вообще говоря, уметь понимать всё то, что описано в windows.h. Недаром для него был сделан отдельный файл

 
Код:
#include "winres.h"           // extract from windows header
Комментарии говорят за себя.

Лучше сделать так, как делает сам редактор ресурсов - создать для идентификаторов (MI_ABOUT, MI_EXIT) отдельный заголовочный файл и включать в *.rc именно его.

В итоге, должно получиться что-то вроде:
6-1rc.h
 
Код:
#define MI_ABOUT 100
#define MI_EXIT 101
#define MI_NEW 102


6-1.rc
Код:
#include "6-1rc.h"
Main MENU {
   POPUP "&Файл" {
     MENUITEM "&О программе..." , MI_ABOUT
     MENUITEM SEPARATOR
     MENUITEM "В&ыход", MMI_EXIT
    }
}

About DIALOG 60,15,93,50
STYLE WS_SYSMENU | WS_CAPTION |WS_POPUP|DS_MODALFRAME
CAPTION "О программе"{
   CTEXT "Автор программы..", -1,12,4,72,25
   PUSHBUTTON "Закрыть", IDOK, 27,32,43,12
}


6-1.h
 
Код:
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM,LPARAM);
void OnCommand ( HWND, int, HWND, UINT );
void OnDestroy ( HWND );

BOOL CALLBACK DlgProc ( HWND, UINT, WPARAM, LPARAM );
BOOL DlgOnInitDialog ( HWND, HWND, LPARAM );
void DlgOnCommand ( HWND, int, HWND, UINT );


6-1.cpp
Код:
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include "6-1.h"
#include "6-1rc.h"

HINSTANCE hInstance;

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE, LPSTRM int){
   char szClassName [] = "ClassName";
   char szTitle [] = "Title";
   MSG msg;
   WNDCLASS wc;
   hInstance = hInst;
   memset ( &wc, 0, sizeof(wc));
   wc.lpfnWndProc = WndProc;
   wc.hInstance = hInst;
   wc.hIcon = LoadIcon ( NULL, IDI_APPLICATION );
   wc.hbrBackground = GetStockBrush ( WHITE_BRUSH );
   wc.lpszMenuName = "Main";
   wc.lpszClassName = szClassName;

   RegisterClass ( &wc );

   HWND hWnd = CreateWindow ( szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 350, 200, HWND_DESKTOP, NULL, hInst, NULL );
   ShowWindow ( hWnd, SW_SHOWNORMAL );
   ..... И так далее :)
33K
02 ноября 2008 года
Pro2005
26 / / 01.11.2008
Всем СПАСИБО. С присоединением windows.h все прекрасно заработало.:):):)
397
02 ноября 2008 года
SergPas
527 / / 03.02.2007
Цитата:
Добавлять Windows.h в ресурсы - слишком тяжелое и не совсем корректное решение - компилятор сообщений не обязан, вообще говоря, уметь понимать всё то, что описано в windows.h


И тем не менее практика показывает, что так называемый "компилятор сообщений" обрабатывает и понимает всё то, что описано в windows.h
На приведённый Вами код компилятор будет ругаться, так как ничего не знает о макроконстантах WS_SYSMENU, WS_CAPTION, WS_POPUP, DS_MODALFRAME, которые и описаны в заголовочном файле windows.h... Не хотите включать этот файл в файл ресурсов - отлично, не включайте... но только в файле ресурсов 6-1.rc или в заголовочном файле 6-1rc.h объявите эти макроконстанты так, как это сделано в windows.h...

562
02 ноября 2008 года
tarekon
175 / / 19.08.2003
Цитата: SergPas
И тем не менее практика показывает, что так называемый "компилятор сообщений" обрабатывает и понимает всё то, что описано в windows.h
На приведённый Вами код компилятор будет ругаться, так как ничего не знает о макроконстантах WS_SYSMENU, WS_CAPTION, WS_POPUP, DS_MODALFRAME, которые и описаны в заголовочном файле windows.h... Не хотите включать этот файл в файл ресурсов - отлично, не включайте... но только в файле ресурсов 6-1.rc или в заголовочном файле 6-1rc.h объявите эти макроконстанты так, как это сделано в windows.h...



И все-таки, Вы не правы.

Нигде не заявлено, что компилятор сообщений это обязан понимать. Придется переносить код на другую среду разработки - welcome to hell... probably.

Если быть точным, от WS_* константы объявлены не в windows.h, а в winuser.h. В своем посте я написал про winres.h файл (кстати, очепятался - правильно winresrc.h). В этом файле содержится, среди прочих, включение файла winuser.rh (заметьте, это другой файл!), в котором есть все необходимые идентификаторы. Именно его, а не windows.h, надо включать - синтаксис и используемые в нём конструкции гораздо проще. Да и компилируется он на порядок быстрее.

З.Ы. Кстати, компилятор ресурсов от VS 2008 вообще не требует включения этих файлов (что, собственно, меня и подвело)...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог