powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление ресурсов к проекту
13 сообщений из 13, страница 1 из 1
Добавление ресурсов к проекту
    #32621066
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть в том, что делаю проект Vstudio6, тип проекта
win32 application - без мастеров, добавляю в него два *.h и два *.cpp
в них наследую классы соответственно от CFrameWnd и CWinApp
пишу код запускаю все работает, теперь следующий шаг - добавляю меню, иконку и курсор, делаю Insert->Resource
добавляю получившийся файл к проекту, рисую меню, картинки и т.д.

потом запускаю проект и смотрю в отладчике что у меня вызов
LoadIcon ("ID_ICO_ARROW")
или
LoadCursor (...)

возвращают всегда нуль т.е. не находят ресурса..., пробовал через MAKEINTRESOURCE таже фигня,

кусок кода
Create (.... , "MY_MENU", ...)
также сыпется - не может найти ресурс меню, и ресурсы диалоговых окон,

что я сделал не так, по памяти последний раз поступал также пару месяцев назад все работало - забыл что ли какой важный камешек???
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621181
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LoadIcon(ID_ICO_ARROW)
Без кавычек
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621219
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>> LoadIcon(ID_ICO_ARROW)
Sorry, зарапортавался, если бы в коде написал неправильно, то оно бы
не скомпилилось, а так компилится но всегда эти функции LoadXXX ()
возвращают нуль - вот в чем беда.
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621224
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу, вообще задурили

Код: plaintext
1.
2.
3.
4.
5.
6.
HICON LoadIcon(
   LPCTSTR lpszResourceName 
) const;
HICON LoadIcon(
   UINT nIDResource 
) const;
оба варианта возможны, но это так к слову, проблемы это не решает.
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621313
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что говорит GetLastError() ?
А что если посмотреть в resource.h этот идентивикатор и подставить в
LoadIcon((LPCTSTR)цыфру_сюда)?

А если воспользовать функцией LoadImage? (которая, кстати, лучше, чем LoadIcon...)
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621513
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежели без мастеров, так может

Код: plaintext
1.
2.
3.
HICON LoadIcon(
    HINSTANCE hInstance,
    LPCTSTR   lpIconName
   );

???
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32621625
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	HICON hi = LoadIcon (AfxGetApp ()->m_hInstance , "IDI_ICON1");
	DWORD e_code = GetLastError ();

	LPVOID lpMsgBuf;
	if (!FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		e_code,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
		(LPTSTR) &lpMsgBuf,
		 0 ,
		NULL ))
	{
		AfxMessageBox ("Cannot Format Message" , MB_OK ,  0 );
		throw global_amba ();
	}

	AfxMessageBox( (LPCTSTR)lpMsgBuf, MB_OK | MB_ICONINFORMATION ,  0 );
	LocalFree( lpMsgBuf );

	Create (NULL , "Clipboard Test", WS_OVERLAPPEDWINDOW, rectDefault , NULL, "IDR_MENU1");

получил месага бокс - "указанный тип ресурса в файле образа отсутствует"
чтобы не обвинили в идиотизме вот вам пример картинки с деревом проект
(приложено)
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32622294
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
HICON hi = LoadIcon (AfxGetInstanceHandle() , (LPCTSTR)IDI_ICON1);

Код: plaintext
HICON hi = LoadImage(AfxGetInstanceHandle(),(LPCTSTR)IDI_ICON1,IMAGE_ICON, 16 , 16 ,LR_DEFAULTCOLOR)

И покажи на картинке закладку с ресурсами и с этой иконкой, на всякий случай :)
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32623042
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало, наконец, но вопросов больше чем было до ошибки, далее пример рабочего кода с комментариями и вопросом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
HICON hi = LoadIcon (AfxGetInstanceHandle() , (LPCTSTR)IDI_ICON1);
	LPCTSTR whatIsThis = (LPCTSTR)IDI_ICON1;
	//здесь значение whatIsThis = "" (0x00000066)
	//из файлов ресурса я выдрал строку 
	//#define IDI_ICON1                        102 
	//разумеется что  102  ( 10  s/s) ===  66  ( 16  s/s)


	HICON hi2 = LoadIcon (AfxGetApp ()->m_hInstance , "IDI_ICON1");
       // здесь как сыпался так и теперь сыплюсь

	HICON hi3 = (HICON)LoadImage(AfxGetInstanceHandle(),(LPCTSTR)IDI_ICON1,IMAGE_ICON, 16 , 16 ,LR_DEFAULTCOLOR);
// тоже все работает
	HCURSOR h_cur = LoadCursor (AfxGetInstanceHandle() ,  (LPCTSTR) IDC_CURSOR1);
	CBrush cbrush;
	cbrush.CreateHatchBrush (HS_CROSS , RGB ( 255  ,  0  ,  255 ));

	const char * cName = AfxRegisterWndClass ( 0  , h_cur , cbrush , hi3);

	
	Create (cName , "Clipboard Test", WS_OVERLAPPEDWINDOW, rectDefault , NULL, (LPCTSTR)IDR_MENU1);
и вот такой вариант тоже работает
Код: plaintext
HICON alsoGood = AfxGetApp ()->LoadIcon (IDI_ICON1);

Итак вопрос: получается что на вход загрузить ресурс можно передавать только число с идентификатором ресурса - но тут я достал с полки книжку и вижу там пример кода где загрузка того же меню идет через строку.
И получается также что хотя в msdn есть две версии функции LoadIcon, & etc.
отличающиеся параметрами

msdn2003
HICON LoadIcon(
LPCTSTR lpszResourceName )
const;

HICON LoadIcon(
UINT nIDResource )
const;
Parameters
lpszResourceName
Points to a null-terminated string that contains the name of the icon resource. You can also use a CString for this argument.
nIDResource
Specifies the ID number of the icon resource.

Но первый вариант не будет работать если подать строку содержащую имя данного ресурса, т.е. в msdn написана фигня в доказательство привожу картинку где внизу в debug-watch значение переменной alsoBad = 0,
прав ли я или как ?
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32623517
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторт.е. в msdn написана фигня
Гы, когда я был маленький, то тоже радостно бегал к большим людям с криком: "Я нашёл ошибку в заголовке WinAPI!!!" Причём, правки этих ошибок помогали, проги начинали работать правильно (пример тому TCHAR неправильно использованный) но большие умные люди хитро ухмылялись и говорили мне, в чём я не прав. И я грустный шёл работаь дальше... :)
Ну это так... ЛО.

авторправ ли я или как ?
Или как.
Ты сам дал имена своим ресурсам типа 0х66 или 122, причём дефайном!
Дефайны при компиляции заменяются начисто, забывая свои текстовые идентификаторы.

Поэтому
Код: plaintext
LoadIcon (AfxGetApp ()->m_hInstance , "IDI_ICON1");
Компилятор сроду не поймёт, что ты думал тут 0х66, ибо он не телепат :)

Про
msdn2003 lpszResourceName
Points to a null-terminated string that contains the name of the icon resource.
всё правильно.
Ресурсы могут иметь строчные идентификаторы.
Для примера, открой ресурсы обычного виндовского калькулятора, там основная иконка названа как "Calc" или открой телнет, там иконка названа как "TELNET".
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32623820
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>> ы, когда я был маленький, то тоже радостно бегал к большим людям с криком: "Я нашёл ошибку в заголовке WinAPI!!!" Причём, правки этих ошибок помогали, проги начинали работать правильно ( ...

Может сейчас размахнуться и переписать все win api под себя, никто за команду не хочет :)

Ок, понял, но еще остался вопрос, я свято верил что имя которое я задаю
в
Код: plaintext
LoadIcon (AfxGetApp ()->m_hInstance , "IDI_ICON1");
берется из файла ресурсов, что #define после компиляции пропадают это факт.
Код: plaintext
1.
2.
3.
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1               ICON    DISCARDABLE     "icon1.ico"
и в программе существуют два параллельных способа использования по идентификатору и по символьному имени.
если я неправ и это имя исчезает то зачем тогда создавать версию функции которая принимает на вход поинтер на char * - LPCTSTR
ведь это одно и тоже что и просто unsigned int - DWORD и прочее - 4 байта и в африке 4-е байта
когда я увидел фрагмент кода с этим преобразованим я оочень удивился, получается ведь получающийся LPCTSTR указывает не на строку а на фиг знает что, и для нас важным является только значение данного указателя, а не то что находится по нему.
Что самое прикольное я держу перед собой буку по MFC - старый шилдт, за 19.. год и у него в подобной ситуации используется

автор
LoadCursor ("MYCURSOR")

да и сам помню что делал также и все работало, сорсов старых под руками к сожалению нет, последний раз писал на mfc довольно давно.
...
Рейтинг: 0 / 0
Добавление ресурсов к проекту
    #32623902
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, в документации все написано:

автор
lpIconName
Points to a null-terminated string that contains the name of the icon resource to be loaded. Alternatively, this parameter can contain the resource identifier in the low-order word and zero in the high-order word. Use the MAKEINTRESOURCE macro to create this value.

То есть если старший байт равен нулю, то параметр воспинимается как числовой индентификатор, в противном случае как указатель на строку. Очевидно, заранее предполагается, что данные не могут располагаться в в младших 65 к памяти , что и гарантирует что в старшем слове указателя всегда будет число, отличное от нуля. Почему разрабы из MS так задумали, спросить лучше у них.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Добавление ресурсов к проекту
    #33197353
Cliff6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поскольку с такой же проблемой продолбался несколько дней напролет (голову свернул), а в инете инфы на этот вопрос вообще никакой (все говорят, что можно так и так, но про маленькую особенность все молчат) оставляю для потомков.
Дело в том, что с такой же ситуацией я столкнулся разгребая часть чужих сурсов, пытаясь переделать под себя. Там речь шла о Тул-Баре с загрузкой скинов..

Поскольку весь код (кроме указанного LoadIcon) этого тулбара успешно заработала после непродолжительной доработки напильником, хотелось бы, чтобы и эта часть работала как у разработчика. Причем, если грузить непосредственно по ID (а не по строке), все работает ОК. Но это меня неустраивало как кастрация кода разработчика, ибо там через имя ресурса была допустима загрузка из скинов.

Я кучу времени сравнивал свою прогу и прогу, откуда я выцеплял этот тулбар, пытаясь разобраться. Решение нашлось абсолютно случайно, когда я уже забил на это и продолжил набивать ресурсы иконками.

Дело в том, что идентификатор ресурса может быть указан в кавычках .
Причем разницы в .rc файле никакой (!) - что с кавычками, что без - так и не понял, где это уточняется, но поменять можно в окне properties.

По умолчанию идентификаторы создаются без кавычек - в этом и был подводный камень. Но как-то случайно при переименовании этих идентификаторов они оказались в кавычках и выделились из общего списка ресурсов.

Удачи :)

P.S. Извините за объем текста - эмоции по прошествии почти недельных мучений.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление ресурсов к проекту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]