С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 21.02.2014
Сообщений: 14

WinAPI создание меню

27.02.2014, 18:34. Показов 5221. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, форумчане!
Прошу вашей помощи!!! С WinAPI раньше не имена дела и ели как в просторах интернета нашла статью про то, как создать меню на WinAPI.

А вот и сам код:
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include "stdafx.h"
#include "Win32Project2.h"
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
HINSTANCE hInst;                        // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];              // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
 
// Отправить объявления функций, включенных в этот модуль кода:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
    // Инициализация глобальных строк
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WIN32PROJECT2, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT2));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT2));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WIN32PROJECT2);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
Но так как раньше не сталкивалась, не могу реализовать следующее:
1) Переместить пункт «О программе» в меню «Файл». (просто в данном коде пункт «О программе» лежит в отдельной вкладке)
2) При выборе пункта «О программе» функцией MessageBox выводить на экран окно. Как я поняла в данном коде выводиться не через функцию MessageBox.
3) Привязать горячие клавиши (как указано на картинке)

Пожалуйста, помогите преобразовать мною выше упомянутый код под мое задание или предложите свое решение! Главное cделать это средствами WinAPI и результат должен быть как на картинке. Выручайте!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2014, 18:34
Ответы с готовыми решениями:

Вложенное меню в WinAPI
Здравствуйте! Подскажите. Я создаю меню с помощью CreateMenu(), потом добавляю туда элементы меню, но как сделать вложенное меню? Чтоб,...

Меню в программе WinApi
Господа как создать меню,если можно простенький исходник посмотреть!!! Заранее всем огромное спасибо!!!

Строка меню средствами WINAPI
Здравствуйте. Недавно начал учить программирование под Windows за книгой "Владимир Давыдов - Visual C++. Разработка Windows-приложений с...

4
1 / 1 / 0
Регистрация: 21.02.2014
Сообщений: 14
27.02.2014, 21:55  [ТС]
HELP!!! неужели никто не знает как это реализовать?! Выручайте!
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
28.02.2014, 06:00
Это не весь код. Код, "отвечающий" за создание меню находится в другом файле - файле ресурсов. В нем есть секция начинающаяся со строки
C++
1
IDC_WIN32PROJECT2 MENUEX
ниже нее будет структура меню, там можно переупорядочить пункты меню.
Правда, в случае Visual Studio там будет просто само меню. Тогда все решается простым перетаскиванием
0
1 / 1 / 0
Регистрация: 21.02.2014
Сообщений: 14
28.02.2014, 15:03  [ТС]
GrayWolf, Пример из данной статьи показался мне трудным, поэтому я сама с нуля начала создавать меню. Пока удалось разместить пункты «О программе» и «Выход» в одну вкладку «Файл», как показано на картинке. Но теперь не знаю, как сделать так, чтобы при клике по пункту «О программе» с помощью функции MessageBox появлялось бы окно с информацией о программе. Знаю, как выглядит сама функция MessageBox, но не знаю, как ее объединить, да еще привязать горючие клавиши! Сказывается нехватка опыта! Сразу видно, что вы знающий человек! Пожалуйста, помогите новичку! Выручайте! Заранее благодарю! =)

Добавлено через 50 минут
GrayWolf, вот что с нуля сама начала делать. Этот код более легче я так думаю чем предыдущий.
Кликните здесь для просмотра всего текста
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
#include "WinAPI.h"
#include "windows.h"
#include "CommCtrl.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void AddMenus(HWND);
 
#define IDM_FILE_ABOUT_PROGRAM 1
#define IDM_FILE_QUIT 2
 
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PWSTR lpCmdLine, int nCmdShow)
{
    MSG  msg;
    WNDCLASSW wc = { 0 };
    wc.lpszClassName = L"WinAPI";
    wc.hInstance = hInstance;
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    wc.lpfnWndProc = WndProc;
    wc.hCursor = LoadCursor(0, IDC_ARROW);
 
    RegisterClassW(&wc);
    CreateWindowW(wc.lpszClassName, L"WinAPI",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        100, 100, 200, 150, 0, 0, hInstance, 0);
 
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
        AddMenus(hwnd);
        break;
 
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDM_FILE_ABOUT_PROGRAM:
            Beep(50, 100);
            break;
        case IDM_FILE_QUIT:
            SendMessage(hwnd, WM_CLOSE, 0, 0);
            break;
        }
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
 
    return DefWindowProcW(hwnd, msg, wParam, lParam);
}
 
int AboutProgramMessageBox()
{
    int msgboxID = MessageBox(
        NULL,
        (LPCWSTR)L"Информация о программе",
        (LPCWSTR)L"О программе",
        MB_OK
        );
}
 
void AddMenus(HWND hwnd)
{
    HMENU hMenubar;
    HMENU hMenu;
 
    hMenubar = CreateMenu();
    hMenu = CreateMenu();
 
    AppendMenuW(hMenu, MF_STRING, IDM_FILE_ABOUT_PROGRAM, L"&О программе");
    AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL);
    AppendMenuW(hMenu, MF_STRING, IDM_FILE_QUIT, L"&Выход");
    AppendMenuW(hMenubar, MF_POPUP, (UINT_PTR)hMenu, L"&Файл");
    SetMenu(hwnd, hMenubar);
}

Не знаю куда и как привязать функцию мессечбокс к пункту "о программе" и помогите с реализацией горячих клавиш, пожалуйста!=)
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
03.03.2014, 09:36
Ваша тема перекликается с этой, почти один в один. Ответ оставил там.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2014, 09:36
Помогаю со студенческими работами здесь

Вылезает ошибка с написанием меню (WinAPI)
Я писал пробную менюшку по учебнику (Ганеева), вылезла ошибка печальная :( В чем дело? Код: #include...

WinAPI как считать названия пунктов меню?
Пытаюсь сделать это с помощью функции GetMenuItemInfo, но не понимаю, какое значение нужно задать для fMask и в каком поле структуры...

Создание меню (чтобы открывались ссылки на вкладках меню)
есть FAQ?

Как убрать строку меню (MenuBar) в простом WinAPI проекте
На картинке выше показано меню, которое нужно убрать. Заранее спасибо за помощь.

Как рисовать картинки в пунктах меню на чистом WinApi Delphi
У меня лежит меню в ресурсах. Загружаю его так: SetMenu(hwin,LoadMenu(HInstance, 'MAINMENU')); А потом что делать с ним не знаю. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru