M@gelearn Ответов: 2

Мне нужна помощь с меню SDI..


В моем проекте SDI у меня есть обширное меню, и я создаю кнопку с именем Close, чтобы пользователь мог закрыть все элементы статического редактирования изображений и т. д., которые появляются после нажатия элемента меню. Так что у меня есть это в WM_COMMAND:

case IDBCLOSE: // Close Sub menu Items
            {
                SendMessage((HWND)hShaD1, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD2, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD3, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD4, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD5, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD6, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD7, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD8, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD9, WM_CLOSE, 0, 0);
                SendMessage((HWND)hShaD10, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt1, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt2, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt3, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt4, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt5, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt6, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt7, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt8, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt9, WM_CLOSE, 0, 0);
                SendMessage((HWND)hMArt10, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav1, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav2, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav3, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav4, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav5, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav6, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav7, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav8, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav9, WM_CLOSE, 0, 0);
                SendMessage((HWND)hJav10, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM1, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM2, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM3, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM4, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM5, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM6, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM7, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM8, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM9, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPassM10, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow1, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow2, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow3, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow4, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow5, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow6, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow7, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow8, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow9, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBow10, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButElemSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButSShiftSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButSummDSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButColdSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButLightSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButFireSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButDefSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButOffSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButCombPSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButWarSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButMastSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButCombBSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButSummNSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButPoisSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButCursSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButArtsSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButDisSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButTrapSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButJavSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButPassSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hButBowSkill, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hSkillStatic, WM_CLOSE, 0, 0);
                SendMessageW((HWND)hSkillEdit, WM_CLOSE, 0, 0);
                SendMessage((HWND)hAmazonB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hAssassinB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hNecromancerB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBarbarianB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPaladinB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hSorceressB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hDruidB, WM_CLOSE, 0, 0);
                SendMessage((HWND)hAmazonS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hAssassinS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hNecromancerS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hBarbarianS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hPaladinS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hSorceressS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hDruidS, WM_CLOSE, 0, 0);
                SendMessage((HWND)hReadOnly, WM_CLOSE, 0, 0);
                SendMessage((HWND)hStatic, WM_CLOSE, 0, 0);
                SendMessage((HWND)hCBdesc, WM_CLOSE, 0, 0);
                SendMessage((HWND)hCSdesc, WM_CLOSE, 0, 0);
                SendMessage((HWND)hCloseAll, WM_CLOSE, 0, 0);
                SendDlgItemMessage(hMainWindow, IDC_STATUS, SB_SETTEXT, 1,
                                   (LPARAM)"ver. 1.00");
                PlaySound(MAKEINTRESOURCE(IDW_SUBMENU), NULL, SND_RESOURCE | SND_ASYNC);
                return DefWindowProcW(hWnd, msg, wp, lp);
            }


Ну, есть вариант, что пользователь хочет нажать непосредственно другой пункт меню, и он игнорирует кнопку закрытия .. Поэтому для каждого элемента подменю я должен отправить WM_CLOSE, чтобы закрыть текущий открытый.
Мой вопрос заключается в том, как избежать всех этих сообщений и как я могу трансформировать
дело IDBCLOSE в макро .. так что я пишу только одну строку, а не этот маразм ?

Что я уже пробовал:

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

Richard MacCutchan

Это все независимые окна или дочерние окна вашего главного окна?

Greg Utas

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

2 Ответов

Рейтинг:
17

Rick York

Если то, что упоминает Карстенк, не позаботится об этом, я бы попросил подменю добавить себя в список, когда они откроются, или сделать это за них, если они не могут. Когда вы хотите закрыть их все, вы просто проходите по списку и закрываете каждую запись в списке. Очевидно, вам нужно только сохранить дескриптор в списке. Поскольку это C++, этот список может быть вектором. Это было бы для меня. Я бы предположил, что вы должны добавить их в список самостоятельно, поэтому создайте функцию, которую вы можете вызвать, которая открывает подменю, делает все, что вам нужно, и добавляет его в список.


M@gelearn

Ну, спасибо тебе, Рик .. это было правильное решение. Я могу сказать вам, что я сохранил около 10 000 строк в своем проекте с вектором.
Еще раз спасибо вам..! 5 :)

Рейтинг:
0

KarstenK

Один из способов-использовать массивы для этой команды. Но лучше лучше структурировать код с помощью классов и сделать очистку в обработчике сообщений в экземпляре. Для этого вы должны проверить, откуда берутся все эти HWND.

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

Что за бардак :-/