powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Win32 Popup menu в несколько колонок
11 сообщений из 11, страница 1 из 1
Win32 Popup menu в несколько колонок
    #39701668
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать Popup menu в несколько колонок?
Вроде есть специальный сепаратор MFT_MENU BAR BREAK, но почему-то не работает. Делаю так:
Код: plaintext
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.
	HMENU hMenu = ::CreatePopupMenu();
	vector<wstring> vItems;
	vItems.push_back(wstring(L"Red"));
	vItems.push_back(wstring(L"Green"));
	vItems.push_back(wstring(L"Blue"));
	vItems.push_back(wstring(L"Brown"));
	vItems.push_back(wstring(L"SkyBlue"));
	vItems.push_back(wstring(L"Violet"));
	vItems.push_back(wstring(L"Orange"));
	vItems.push_back(wstring(L"DkYellow"));
	vItems.push_back(wstring(L"Teal"));
	vItems.push_back(wstring(L"Yellow"));
	vItems.push_back(wstring(L"Aqua"));
	vItems.push_back(wstring(L"Crimson"));
	vItems.push_back(wstring(L"Lime"));
	vItems.push_back(wstring(L"Pink"));

	for (size_t i = 0; i < vItems.size();)
	{
		MENUITEMINFOW mii = {0};
		mii.cbSize        = sizeof(mii);
		mii.fMask         = MIIM_ID|MIIM_FTYPE|MIIM_STRING|MIIM_STATE;
		mii.fType         = MFT_STRING;
		mii.dwTypeData    = const_cast<LPWSTR>(vItems[i].c_str());
		mii.wID           = i++;
		::InsertMenuItemW(hMenu, mii.wID, TRUE, &mii);

		if (i == 5)
		{
			MENUITEMINFOW mi2 = {0};
			mi2.cbSize        = sizeof(mii);
			mi2.fMask         = MIIM_FTYPE;
			mi2.fType         = MFT_MENUBARBREAK;
			mi2.wID           = i++;
			::InsertMenuItemW(hMenu, mi2.wID, TRUE, &mi2);
		}
	}
	POINT ptCursor = {0};
	GetCursorPos(&ptCursor);
	TrackPopupMenu(hMenu, TPM_NONOTIFY | TPM_RETURNCMD, ptCursor.x, ptCursor.y, 0, m_hWnd, NULL);



Получаю:
Red
Green
Blue
Brown
SkyBlue
------------
Violet
Orange
DkYellow
Teal
Yellow
Aqua
Crimson
Lime
Pink

а нужно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Red     | Violet
Green   | Orange
Blue    | DkYellow
Brown   | Teal
SkyBlue | Yellow
          Aqua
          Crimson
          Lime
          Pink





По некоторым причинам надо сделать на чистом Win API, прошу MFC или Qt не предлагать.
Использую VS2010, Windows 10.
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701689
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть подозрение, что popup menu это ни разу ни menu bar, sub menu или shortcut menu, хотя как правило popup menu создается на базе или как sub menu - нужно попробовать тоже самое, но для меню верхнего уровня. Если я прав, то должно работать.

либо ты забыл указать MIIM_ID, хотя индекс в цикле присваиваешь.

Код: plaintext
1.
2.
mi2.fMask = MIIM_ID|MIIM_FTYPE;
mi2.wID = i++;
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы для начала попробовал переделать этот кусок в
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
mii.cbSize        = sizeof(mii);
		mii.fMask         = MIIM_ID|MIIM_FTYPE|MIIM_STRING|MIIM_STATE;
		mii.fType         = MFT_STRING;
		mii.dwTypeData    = const_cast<LPWSTR>(vItems[i].c_str());
		mii.wID           = i++;
		if (i == 5)
		{
			mii.fType |= MFT_MENUBARBREAK;
		}
		::InsertMenuItemW(hMenu, mii.wID, TRUE, &mii);


Кроме того, где-то ты врёшь, поскольку пятую строку ты фактически пропускаешь и "Violet" в
твоём меню быть физически не может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701711
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrumесть подозрение, что popup menu это ни разу ни menu bar, sub menu или shortcut menu, хотя как правило popup menu создается на базе или как sub menu - нужно попробовать тоже самое, но для меню верхнего уровня. Если я прав, то должно работать.

Действительно, в MSDN постоянно используется термин Shortcut menu. Попробую меню первого уровня.


Cerebrumлибо ты забыл указать MIIM_ID, хотя индекс в цикле присваиваешь.

Код: plaintext
1.
2.
mi2.fMask = MIIM_ID|MIIM_FTYPE;
mi2.wID = i++;


Неа. Там дальше идёт ::InsertMenuItemW(hMenu, mi2.wID, TRUE, &mi2);, где TRUE - это параметр fByPosition. Так что всё вставляется куда надо. Ну и не долго проверить, я сделал и MIIM_ID|MIIM_FTYPE вариант - результат такой же.
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701722
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thя тебя просил не писать в моих тредах. Ты только срач разводишь, ни одного камента по делу от тебя ещё не было.
Ну, значит не судьба тебе...
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701723
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, где-то ты врёшь, поскольку пятую строку ты фактически пропускаешь и "Violet" в
твоём меню быть физически не может.[/quote]
Да нет, не пропускает: InsertMenuItem выполняется всегда, а если 5-я строка - то еще раз InsertMenuItem(вставить разделитель). А "фиолет" попадает после разделителя, т.к. инкремент переменной цикла выполняется непосредственно перед проверкой на "== 5".
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасияинкремент переменной цикла выполняется непосредственно перед проверкой на "== 5".

И ещё раз - внутри этого блока. Т.е. при i == 5 оно автоматически дойдёт до 6.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701727
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКотовасияинкремент переменной цикла выполняется непосредственно перед проверкой на "== 5".

И ещё раз - внутри этого блока. Т.е. при i == 5 оно автоматически дойдёт до 6.
Да, точно.
Ну, значит, из серии: "настоящий код не покажу, сами додумывайте".
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39701728
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияНу, значит, из серии: "настоящий код не покажу, сами додумывайте".

Да нет, код вполне настоящий, он действительно даёт горизонтальный разделитель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39702362
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Давайте обсуждать тему а не участников
...
Рейтинг: 0 / 0
Win32 Popup menu в несколько колонок
    #39702819
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, ничего не надо обсуждать, я сам разобрался.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Win32 Popup menu в несколько колонок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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