Привет! Рад, что ты интересуешься созданием кода на WIN32 с подробными пояснениями. Я сам недавно столкнулся с такой задачей и готов поделиться своим опытом.Перед тем как начать٫ нужно иметь представление о том٫ что мы должны сделать. В нашем случае٫ мы должны обеспечить доступность команды ″Копировать″ в меню ″Правка″٫ после выбора команды ″Выделить″. Также мы должны создать плавающее меню с командами ″Выделить″ и ″Копировать″ по щелчку правой кнопкой мыши в главном окне. Состояние этих команд должно соответствовать состоянию таких же команд в основном меню. Нам потребуется использовать функцию GetMenuItemInfo для определения состояния команд меню.
Для начала, создадим окно. В нашем примере, я назову его ″Главное окно″. В функции WinMain мы должны создать окно с помощью функции CreateWindowEx. Вот код, который тебе нужно поместить в функцию WinMain⁚
c
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// … // Создание окна
HWND hWnd CreateWindowEx(
0, // Расширенный стиль
″MainWindowClass″, // Имя класса
″Главное окно″, // Заголовок окна
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, // Положение и размеры окна
NULL, // Родительское окно
NULL, // Дескриптор меню
hInstance, // Дескриптор приложения
NULL); // Дополнительные параметры
// ...}
Теперь, когда у нас есть наше главное окно, нужно создать меню. В функции WinMain добавь следующий код⁚
c
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// ... // Создание меню
HMENU hMenu CreateMenu; // Создаем меню
HMENU hEditMenu CreateMenu; // Создаем меню ″Правка″
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hEditMenu, ″Правка″); // Добавляем меню ″Правка″ в основное меню
AppendMenu(hEditMenu, MF_STRING, 1, ″Выделить″); // Добавляем команду ″Выделить″ в меню ″Правка″
AppendMenu(hEditMenu, MF_STRING, 2٫ ″Копировать″); // Добавляем команду ″Копировать″ в меню ″Правка″
SetMenu(hWnd, hMenu); // Устанавливаем созданное меню в наше главное окно
// ...}
Отлично, теперь мы создали основное меню и добавили в него команды ″Выделить″ и ″Копировать″. Но пока что они ничего не делают. Для того чтобы эти команды были доступны после выбора пункта меню ″Выделить″, а также для создания плавающего меню по щелчку правой кнопкой мыши, нам потребуется использовать обработчик сообщений главного окна, который будет реагировать на выбор команд меню и щелчок правой кнопкой мыши.Напишем обработчик сообщений. В функции WinMain добавь следующий код⁚
c
// Обработчик сообщений главного окна
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND⁚
switch (LOWORD(wParam))
{
case 1⁚ // Если выбрана команда ″Выделить″
// Обработчик для команды ″Выделить″
break;
case 2⁚ // Если выбрана команда ″Копировать″
// Обработчик для команды ″Копировать″
break;
}
break;
case WM_RBUTTONDOWN⁚ // Если произошел щелчок правой кнопкой мыши
// Создаем плавающее меню
HMENU hPopupMenu CreatePopupMenu;
AppendMenu(hPopupMenu, MF_STRING, 1, ″Выделить″); // Добавляем команду ″Выделить″ в плавающее меню
AppendMenu(hPopupMenu, MF_STRING, 2٫ ″Копировать″); // Добавляем команду ″Копировать″ в плавающее меню
// Определяем состояние команд меню
MENUITEMINFO menuItemInfo { sizeof(MENUITEMINFO) };
menuItemInfo.fMask MIIM_STATE;
GetMenuItemInfo(hMenu, 1, TRUE, nmenuItemInfo); // Здесь 1 ⎻ это ID команды ″Выделить″ в основном меню
if (menuItemInfo.fState n MFS_CHECKED)
CheckMenuItem(hPopupMenu, 1, MF_BYCOMMAND | MF_CHECKED); // Если команда ″Выделить″ включена, то включаем ее и в плавающем меню
else
CheckMenuItem(hPopupMenu, 1, MF_BYCOMMAND | MF_UNCHECKED); // Если команда ″Выделить″ отключена, то отключаем ее и в плавающем меню
GetMenuItemInfo(hMenu, 2, TRUE, nmenuItemInfo); // Здесь 2 ⎻ это ID команды ″Копировать″ в основном меню
if (menuItemInfo.fState n MFS_CHECKED)
CheckMenuItem(hPopupMenu, 2, MF_BYCOMMAND | MF_CHECKED); // Если команда ″Копировать″ включена, то включаем ее и в плавающем меню
else
CheckMenuItem(hPopupMenu, 2, MF_BYCOMMAND | MF_UNCHECKED); // Если команда ″Копировать″ отключена, то отключаем ее и в плавающем меню
// Показываем плавающее меню
POINT cursorPosition;
GetCursorPos(ncursorPosition); // Получаем позицию курсора
TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, cursorPosition.x, cursorPosition.y, 0, hWnd, NULL); // Показываем плавающее меню
DestroyMenu(hPopupMenu); // Удаляем плавающее меню
break;
// ... }
return DefWindowProc(hWnd, message, wParam, lParam);
}
Вот и все! Теперь команды ″Выделить″ и ″Копировать″ будут доступны в меню ″Правка″ после выбора команды ″Выделить″. А по щелчку правой кнопкой мыши в главном окне будет появляться плавающее меню с этими командами, состояние которых будет соответствовать состоянию таких же команд в основном меню.
Надеюсь, эта статья была полезной и помогла тебе разобраться с написанием кода на WIN32! Удачи в твоих программистских начинаниях!