Проблема с написанием Resource Script
Так вот в чем моя проблема ....
Вот он дает такой код:
#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 )
Объясните пожалуйста может это я что то неправильно делаю???
IDOK, IDCANCEL, IDYES.
IDOK, IDCANCEL, IDYES.
Это неправильный совет. Всё равно что
-Доктор, когда я хожу, у меня побаливает нога.
-Ну так перестаньте ходить!
Проблема в том, что компилятор сообщений почему-то не может найти вышеупомянутые идентификаторы в файле 6-1.h (или не может найти сам файл). Какие-нибудь еще сообщения об ошибках появляются?
но он выдает ошибку....error RC2104: undefined keyword or key name: MI_ABOUT ( потом MI_EXIT )
Объясните пожалуйста может это я что то неправильно делаю???
По поводу файлов ресурсов: создавайте этот файл ручками, так как редактор ресурсов много чего лишнего туда добавляет...
Код, который Вы привели, не содержит ошибок и должен компилироваться без ошибок в случае, если в файл 6-1.rc добавить директиву:
В случае отсутствия этой строки компилятор ругнется...
Код, который Вы привели, не содержит ошибок и должен компилироваться без ошибок в случае, если в файл 6-1.rc добавить директиву:
В случае отсутствия этой строки компилятор ругнется...
Добавлять Windows.h в ресурсы - слишком тяжелое и не совсем корректное решение - компилятор сообщений не обязан, вообще говоря, уметь понимать всё то, что описано в windows.h. Недаром для него был сделан отдельный файл
Лучше сделать так, как делает сам редактор ресурсов - создать для идентификаторов (MI_ABOUT, MI_EXIT) отдельный заголовочный файл и включать в *.rc именно его.
В итоге, должно получиться что-то вроде:
6-1rc.h
#define MI_EXIT 101
#define MI_NEW 102
6-1.rc
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
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
#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 );
..... И так далее :)
И тем не менее практика показывает, что так называемый "компилятор сообщений" обрабатывает и понимает всё то, что описано в windows.h
На приведённый Вами код компилятор будет ругаться, так как ничего не знает о макроконстантах WS_SYSMENU, WS_CAPTION, WS_POPUP, DS_MODALFRAME, которые и описаны в заголовочном файле windows.h... Не хотите включать этот файл в файл ресурсов - отлично, не включайте... но только в файле ресурсов 6-1.rc или в заголовочном файле 6-1rc.h объявите эти макроконстанты так, как это сделано в 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 вообще не требует включения этих файлов (что, собственно, меня и подвело)...