Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Win32 Popup menu в несколько колонок / 11 сообщений из 11, страница 1 из 1
12.09.2018, 17:25
    #39701668
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
Как сделать 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
12.09.2018, 18:03
    #39701689
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
есть подозрение, что 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
12.09.2018, 18:10
    #39701693
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
Я бы для начала попробовал переделать этот кусок в
Код: 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
12.09.2018, 18:48
    #39701711
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
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
12.09.2018, 19:39
    #39701722
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
13thя тебя просил не писать в моих тредах. Ты только срач разводишь, ни одного камента по делу от тебя ещё не было.
Ну, значит не судьба тебе...
...
Рейтинг: 0 / 0
12.09.2018, 19:39
    #39701723
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
Кроме того, где-то ты врёшь, поскольку пятую строку ты фактически пропускаешь и "Violet" в
твоём меню быть физически не может.[/quote]
Да нет, не пропускает: InsertMenuItem выполняется всегда, а если 5-я строка - то еще раз InsertMenuItem(вставить разделитель). А "фиолет" попадает после разделителя, т.к. инкремент переменной цикла выполняется непосредственно перед проверкой на "== 5".
...
Рейтинг: 0 / 0
12.09.2018, 19:41
    #39701724
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Win32 Popup menu в несколько колонок
Котовасияинкремент переменной цикла выполняется непосредственно перед проверкой на "== 5".

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

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

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


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