Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2023, 08:00   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Menu, Создание динамического меню.

Ещё раз здравствуйте! Вопрос назрел следующий, если я хочу создать меню динамически, как создавал окна диалоговых панелей, только здесь структуры MENUEX_TEMPLATE_HEADER, MENUEX_TEMPLATE_ITEM, думал делать по аналогии с диалоговыми окнами, не получается, Вызов функции создания меню LoadMenuIndirect() завершается с ошибкой 13. Я думаю, что заполняю структуры не верно, хотелось бы получить дельный совет...
Вот как я пытаюсь реализовать создание меню.
Код:
HMENU CreateMenu()
{
	BYTE* p, * pmenuTempl;
	p = pmenuTempl = (BYTE*)LocalAlloc(LPTR, 512);
	if (!p)
	{
		MessageBox(NULL, TEXT("Can't memory allocated"),
			TEXT("Error"), MB_OK);
		return (HMENU)NULL;
	}

	MENUEX_TEMPLATE_HEADER* lpmth;
	MENUEX_TEMPLATE_ITEM* lpmti;

	lpmth = (MENUEX_TEMPLATE_HEADER*)p;
	lpmth->wVersion = 1;
	lpmth->wOffset = 4;
	lpmth->dwHelpId = 0;

	p = (BYTE*)(lpmth + 1);
	LPWSTR szDst;
	ULONG_PTR ui = 0;
	//lpmti = (MENUEX_TEMPLATE_ITEM*)p;
	//lpmti->dwHelpId = 0;
	//lpmti->dwType = MFT_STRING;
	//lpmti->dwState = MFS_ENABLED;
	//lpmti->menuId = CM_FILE_OPEN;
	//lpmti->bResInfo = 0;
	//LPWSTR szDst = (LPWSTR)&lpmti->szText;
	////p = (BYTE*)(lpmti + 1);
	////LPWSTR szDst = (LPWSTR)p;
	//wmemcpy_s(szDst, 512, TEXT("Open"), 5);
	//p = (BYTE*)(szDst + _tcslen(TEXT("Open")));

	//ULONG_PTR ui = (ULONG_PTR)p;
	//ui += 3;
	//ui >>= 2;
	//ui <<= 2;
	//p = (BYTE*)ui;

	////2
	//lpmti = (MENUEX_TEMPLATE_ITEM*)p;
	//lpmti->dwHelpId = 0;
	//lpmti->dwType = MFT_STRING;
	//lpmti->dwState = MFS_ENABLED;
	//lpmti->menuId = CM_FILE_CREATE;
	//lpmti->bResInfo = 0;
	//szDst = (LPWSTR)&lpmti->szText;

	//wmemcpy_s(szDst, 512, TEXT("Create"), 7);
	//p = (BYTE*)(szDst + _tcslen(TEXT("Create")));
	//ui = (ULONG_PTR)p;
	//ui += 3;
	//ui >>= 2;
	//ui <<= 2;
	//p = (BYTE*)ui;

	////3
	//lpmti = (MENUEX_TEMPLATE_ITEM*)p;
	//lpmti->dwHelpId = 0;
	//lpmti->dwType = MFT_STRING;
	//lpmti->dwState = MFS_ENABLED;
	//lpmti->menuId = CM_FILE_SAVE;
	//lpmti->bResInfo = 0;
	//szDst = (LPWSTR)&lpmti->szText;
	//wmemcpy_s(szDst, 512, TEXT("Save"), 5);
	//p = (BYTE*)(szDst + _tcslen(TEXT("Save")));
	//

	//ui = (ULONG_PTR)p;
	//ui += 3;
	//ui >>= 2;
	//ui <<= 2;
	//p = (BYTE*)ui;

	//4
	lpmti = (MENUEX_TEMPLATE_ITEM*)p;
	lpmti->dwHelpId = 0;
	lpmti->dwType = MFT_STRING;
	lpmti->dwState = MFS_ENABLED;
	lpmti->menuId = CM_FILE_QUIT;
	lpmti->bResInfo = 0x80;
	szDst = (LPWSTR)&lpmti->szText;
	wmemcpy_s(szDst, 512, TEXT("Exit"), 5);
	p = (BYTE*)(szDst + _tcslen(TEXT("Exit")));

	ui = (ULONG_PTR)p;
	ui += 3;
	ui >>= 2;
	ui <<= 2;
	p = (BYTE*)ui;


	HMENU hMenu = LoadMenuIndirect((MENUTEMPLATEW*)(MENUEX_TEMPLATE_HEADER*)pmenuTempl);

	if (!hMenu)
	{
		DWORD er = GetLastError();
	}
	LocalFree(LocalHandle(pmenuTempl));

	return hMenu;
}
apofioz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание popum menu c radioitem phpmullin Общие вопросы Delphi 14 08.06.2016 11:53
Создание динамического массива Павел_95 Помощь студентам 2 09.01.2013 18:29
Событие у динамического меню alekola Общие вопросы Delphi 3 08.03.2012 10:47
Создание метода Click у динамического меню Alessi Общие вопросы Delphi 2 23.03.2009 11:01
List/MENU или Jump Menu с mysql vanDJ PHP 0 09.02.2009 11:19