Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10

Структура Windows. Оконная процедура. Обработка сообщений. Файл ресурсов

30.09.2022, 09:15. Показов 2453. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стиль класса: перерисовка окна при изменении вертикального или
горизонтального размера; обработка двойного нажатия мыши, если курсор
находится в пределах окна; окно приложения имеет тень.
Тип иконки: IDI_APPLICATION.
Тип курсора: IDC_ARROW.
Цвет фона окна: белый.
Имя класса окна: имя студента (на английском языке).
Стиль окна: окно имеет заголовок, рамку и горизонтальную полосу
прокрутки, создается изначально минимизированное окно.
Позиция окна: верхний угол в координатах (10, 30) высота 300, ширина
400 точек.
Создать три своих иконки в файле ресурсов. С помощью пунктов меню
организовать изменение иконок в заголовке окна и в трее. Программа должна содержать
меню, в котором есть пункт "О программе", выбрав который, вызывается диалоговое
окно с информацией о студенте. Диалоговое окно должно содержать 3 кнопки:
"ОК", "Закрыть", "Подробнее".
При нажатии кнопки закрытия программы пользователю должно
выводиться всплывающее окно с запросом на подтверждение закрытия окна, которое
будет содержать текст "Вы уверены?" и 2 кнопки: "Да, закрыть все равно" и "Нет,
продолжить работу". Нажатие кнопки "Да, закрыть все равно" должно
приводить к закрытию программы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2022, 09:15
Ответы с готовыми решениями:

Оконная процедура
Общий вопрос. Вот при создании окна через функ-ю CreateWindows , через параметр Lparam можно что-то передать в оконную процедуру...

Асинхронная оконная процедура
Почему когда я пытаюсь поместить оконную процедуру в другой процесс, окно не отвечает?

Оконная процедура в классе
Доброго времени суток! Пишу с телефона,так что без кода,постараюсь объяснить все на словах. Пишу окно на АПИ.Суть в том,что хочу...

12
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
30.09.2022, 09:48
Не понимаю, вы что-то спрашиваете или хотите чтобы за вас сделали задание??
0
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
30.09.2022, 11:06  [ТС]
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
#include <windows.h> // підключення бібліотеки з функціями API
 
// Глобальні змінні:
HINSTANCE hInst;    //Дескриптор програми 
LPCTSTR szWindowClass = "QWERTY";
LPCTSTR szTitle = "ПЕРША ПРОГРАМА";
 
// Попередній опис функцій
 
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Основна програма 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
    int nCmdShow)
{
    MSG msg;
 
    // Реєстрація класу вікна 
    MyRegisterClass(hInstance);
 
    // Створення вікна програми
    if (!InitInstance(hInstance, nCmdShow))
    {
        return FALSE;
    }
    // Цикл обробки повідомлень
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;       //стиль вікна
    wcex.lpfnWndProc = (WNDPROC)WndProc;        //віконна процедура
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;             //дескриптор програми
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);       //визначення іконки
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);     //визначення курсору
    wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW + 0); //установка фону
    wcex.lpszMenuName = NULL;               //визначення меню
    wcex.lpszClassName = szWindowClass;         //ім’я класу
    wcex.hIconSm = NULL;
 
    return RegisterClassEx(&wcex);          //реєстрація класу вікна
}
 
// FUNCTION: InitInstance (HANDLE, int)
// Створює вікно програми і зберігає дескриптор програми в змінній hInst
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
    hInst = hInstance; //зберігає дескриптор додатка в змінній hInst
    hWnd = CreateWindow(szWindowClass,  // ім’я класу вікна
        szTitle,                // назва програми
        WS_OVERLAPPEDWINDOW,            // стиль вікна
        CW_USEDEFAULT,          // положення по Х   
        CW_USEDEFAULT,          // положення по Y    
        CW_USEDEFAULT,          // розмір по Х
        CW_USEDEFAULT,          // розмір по Y
        NULL,                   // дескриптор батьківського вікна   
        NULL,                   // дескриптор меню вікна
        hInstance,              // дескриптор програми
        NULL);              // параметри створення.
 
    if (!hWnd)  //Якщо вікно не творилось, функція повертає FALSE
    {
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);         //Показати вікно
    UpdateWindow(hWnd);                 //Оновити вікно
    return TRUE;
}
 
// FUNCTION: WndProc (HWND, unsigned, WORD, LONG)
// Віконна процедура. Приймає і обробляє всі повідомлення, що приходять в додаток
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rt;
 
    switch (message)
    {
    case WM_CREATE:                 //Повідомлення приходить при створенні вікна
        break;
 
    case WM_PAINT:              //Перемалювати вікно
        hdc = BeginPaint(hWnd, &ps);    //Почати графічний вивід    
        GetClientRect(hWnd, &rt);       //Область вікна для малювання
        DrawText(hdc, "Привіт, світ!", -1, &rt, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hWnd, &ps);        //Закінчити графічний вивід  
        break;
 
    case WM_DESTROY:                //Завершення роботи
        PostQuitMessage(0);
        break;
    default:
        //Обробка повідомлень, які не оброблені користувачем
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
НЕ СОВСЕМ, Я ПРОСТО НЕ ПОНИМАЮ КАК СДЕЛАТЬ ПОСЛЕДНИЕ 4 ПУНКТА ВОТ ПРИМЕР
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
30.09.2022, 14:38
Добавляете case WM_CLOSE:
вызов MessageBoxW(.... MB_YESNO) , точно не помню как оно правильно пишется
далее проверять что вернул мессаджбокс, и либо ничего не делать, либо PostQuitMessage
0
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
30.09.2022, 16:40  [ТС]
А моежете показать как в коде это будет выглядеть??

Добавлено через 2 минуты
А моежете показать как в коде это будет выглядеть??
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
30.09.2022, 16:46
Лучший ответ Сообщение было отмечено ramsuum как решение

Решение

otv_mes - должен быть типа int.
C++
1
2
3
4
5
6
7
 case WM_CLOSE:
     otv_mes = MessageBox(hWnd, "Вы уверены?", "Заголовок сообщения (сам напишешь)", MB_YESNO | MB_ICONQUESTION);
     if (otv_mes == IDYES)
     {
         SendMessage(hWnd, WM_DESTROY, 0,0);
     }
     break;
1
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
30.09.2022, 17:50  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
otv_mes - должен быть типа int.
Спасибо большое, а вот это еще хотел узнать(Создать три своих иконки в файле ресурсов. С помощью пунктов меню
организовать изменение иконок в заголовке окна и в трее.) Как это записать?
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
03.10.2022, 14:28
Цитата Сообщение от ramsuum Посмотреть сообщение
Спасибо большое, а вот это еще хотел узнать(Создать три своих иконки в файле ресурсов. С помощью пунктов меню
организовать изменение иконок в заголовке окна и в трее.) Как это записать?
Файлы ресурсов:

resource.h

Code
1
2
3
4
5
6
#define     IDI_ICON_1  1
#define     IDI_ICON_2  2
#define     IDI_ICON_3  3
 
#define     IDR_MENU_HENDLE     4
#define IDM_ZAMENA          5
resource.rc

Code
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
#include "resourse.h"
 
IDI_ICON_1      ICON DISCARDABLE "icon1.ico"
IDI_ICON_2      ICON DISCARDABLE "icon2.ico"
IDI_ICON_3      ICON DISCARDABLE "icon3.ico"
 
//меню
IDR_MENU_HENDLE MENUEX DISCARDABLE          
BEGIN
    MENUITEM "&Замена",                   IDM_ZAMENA
END
в main.cpp

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDc;
    PAINTSTRUCT ps;
    RECT rect;
    HICON Icon_Inst, Icon_Inst_Sm;
    static HINSTANCE hInst;
        int otv_mes;
    
    switch (uMsg)
    {
        case WM_CREATE:
            hInst = GetModuleHandle(NULL);
            Icon_Inst = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_1)); //LoadIcon используется для загрузки 
//только иконок стандартного размера, можно использовать вместо нее LoadImage
            Icon_Inst_Sm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); //загружаем малую иконку
            SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)Icon_Inst); //установка большой иконки
            SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)Icon_Inst_Sm); //установка малой иконки
            break;
            
        case WM_PAINT:
            hDc = BeginPaint(hWnd, &ps);    
            GetClientRect(hWnd, &rect);             
            EndPaint(hWnd, &ps);            
            break;
            
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case IDM_ZAMENA:
                    Icon_Inst = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_2));
                    Icon_Inst_Sm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_3), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
                    SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)Icon_Inst);
                    SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)Icon_Inst_Sm);
                    break;
            }
            break;
 
        case WM_CLOSE:
                      otv_mes = MessageBox(hWnd, "Вы уверены?", "Заголовок", MB_YESNO | MB_ICONQUESTION);
                      if (otv_mes == IDYES)
                      {
                            SendMessage(hWnd, WM_DESTROY, 0,0);
                      }
                      break;
 
        case WM_DESTROY:
                        DestroyIcon(Icon_Inst_Sm);
            PostQuitMessage(0);
            break;
            
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
1
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
03.10.2022, 14:40  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Файлы ресурсов:
resource.h
КодВыделить код
#define IDI_ICON_1 1
#define IDI_ICON_2 2
#define IDI_ICON_3 3
#define IDR_MENU_HENDLE 4
#define IDM_ZAMENA 5
resource.rc
КодВыделить код
#include <windows.h>
#include "resourse.h"
IDI_ICON_1 ICON DISCARDABLE "icon1.ico"
IDI_ICON_2 ICON DISCARDABLE "icon2.ico"
IDI_ICON_3 ICON DISCARDABLE "icon3.ico"
//меню
IDR_MENU_HENDLE MENUEX DISCARDABLE
BEGIN
MENUITEM "&Замена", IDM_ZAMENA
END
в main.cpp
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDc;
    PAINTSTRUCT ps;
    RECT rect;
    HICON Icon_Inst, Icon_Inst_Sm;
    static HINSTANCE hInst;
        int otv_mes;
switch (uMsg)
    {
        case WM_CREATE:
            hInst = GetModuleHandle(NULL);
            Icon_Inst = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_1)); //LoadIcon используется для загрузки
//только иконок стандартного размера, можно использовать вместо нее LoadImage
            Icon_Inst_Sm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); //загружаем малую иконку
            SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)Icon_Inst); //установка большой иконки
            SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)Icon_Inst_Sm); //установка малой иконки
            break;
case WM_PAINT:
            hDc = BeginPaint(hWnd, &ps);   
            GetClientRect(hWnd, &rect);            
            EndPaint(hWnd, &ps);           
            break;
case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case IDM_ZAMENA:
                    Icon_Inst = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_2));
                    Icon_Inst_Sm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_3), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
                    SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)Icon_Inst);
                    SendMessage(hWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)Icon_Inst_Sm);
                    break;
            }
            break;
case WM_CLOSE:
                      otv_mes = MessageBox(hWnd, "Вы уверены?", "Заголовок", MB_YESNO | MB_ICONQUESTION);
                      if (otv_mes == IDYES)
                      {
                            SendMessage(hWnd, WM_DESTROY, 0,0);
                      }
                      break;
case WM_DESTROY:
                        DestroyIcon(Icon_Inst_Sm);
            PostQuitMessage(0);
            break;
default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
Спасиьо Вам)
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
03.10.2022, 14:53
Да не за что)), иконки "icon1.ico", "icon2.ico", "icon3.ico" должны находиться в папке с проектом. После компиляции и создания файла exe, их двоичный код уже будет записан в программу. Переносить их вместе с программой не нужно.
0
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
15.10.2022, 13:29  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Да не за что
А моежет показать как код будет выглядеть в общем, а то я делаю и не получается почему-то
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
17.10.2022, 10:56
Лучший ответ Сообщение было отмечено ramsuum как решение

Решение

Вот файлы проекта.
Вложения
Тип файла: rar KBF1.rar (7.2 Кб, 23 просмотров)
1
0 / 0 / 0
Регистрация: 08.06.2022
Сообщений: 10
17.10.2022, 11:03  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
KBF1.rar (7.2 Кб, 0 просмотров)
Спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2022, 11:03
Помогаю со студенческими работами здесь

Оконная процедура в классе
Как вставить простую оконную процедуру в класс?Ставил вот так: class Form { private: static LRESULT WINAPI...

Оконная процедура - что это?
Выдержка из msdn.microsoft.com - &quot;Наряду с функцией WinMain в каждом классическом приложении Windows также должна быть определена функция...

Оконная процедура не знает, что мышь ушла
{ RECT ClientRectangle; HDC Context; PAINTSTRUCT Paint; std::string s; ...

Обработка сообщений от Windows
Доброго времени суток! Программе будет поступать сообщение (из другой проги) через функцию PostMessage. Нужно обработать данные которые...

Обработка сообщений windows
Никак не могу понять как реализовать обработку сообщений windows в частности WindowProc() Есть код на delphi, не получается реализовать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru