С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282

Изменение текста при нажатии пункта меню

13.06.2012, 22:47. Показов 3042. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Есть задача - доработать программу так, чтобы при нажатии на пункт меню Change появлялся один текст, а при повторном нажатии на этот же пункт меню, исходный текст заменялся на другой. и так циклично. Подскажите, где не так?

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
#include <windows.h>
#include "resource.h"
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){      //оператор обработки сообщений
    HDC hdc;
    PAINTSTRUCT ps;
    bool a = true;
    switch(uMsg){
        case WM_CLOSE:
            DestroyWindow(hWnd);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(7);
            return 0;
        case WM_COMMAND:
            switch(LOWORD(wParam)){
        case ID_FILE_EXIT:
            if(MessageBox(hWnd,"Вы действительно хотите выйти?","Предупреждение",MB_YESNO) == IDYES)
                SendMessage(hWnd,WM_CLOSE,0,0);
            //DestroyWindow(hWnd);
            return 0;
        case ID_ABOUT:
            MessageBox(hWnd,"пользователь","Информация",MB_OK);
            return 0;
            }
        case ID_CHANGE:
            int b = 1;
            if (b == 1){
                hdc = GetDC(hWnd);
                TextOut(hdc, 20, 20, "было", 4);
                ReleaseDC(hWnd, hdc);
                b--;
            }
            else{
                hdc = GetDC(hWnd);
                TextOut(hdc, 40, 40, "стало", 5);
                ReleaseDC(hWnd, hdc);
                b++;
            }
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    //1. Регистрация класса окна
 
    WNDCLASS wc={0};
    wc.style = CS_VREDRAW|CS_HREDRAW;                                       //битовая маска
    wc.lpfnWndProc = WndProc;                                               //адрес оконной процедуры
    //wc.cbClsExtra;
    wc.cbWndExtra = sizeof(HWND);
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION);
    wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    wc.lpszClassName = "My window";
 
    if (!RegisterClass(&wc))                                                //проверка на регистрацию
        return 0;
    //2. Создание самого класса окна
 
    HWND hwnd = CreateWindow(   wc.lpszClassName,
                                "My window",
                                WS_OVERLAPPEDWINDOW,//|WS_HSCROLL|WS_VSCROLL,
                                CW_USEDEFAULT,                              //x
                                0,                                          //y
                                CW_USEDEFAULT ,                             //Width
                                0,                                          //Height
                                NULL,
                                NULL,
                                hInstance,
                                NULL);
    if (!hwnd)                                                              //проверка на создание окна
        return 0;
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);                                                     // handle to window
 
    //3. Очередь сообщений
    MSG ms;
    while (GetMessage(&ms,NULL,NULL,NULL)){
        DispatchMessage(&ms);
    }
 
    return ms.wParam;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2012, 22:47
Ответы с готовыми решениями:

Изменение цвета фона приложения при нажатии на пункт меню
Здравствуйте. Впервые столкнулся с Win Api 32. Суть проблемы: был создан простой калькулятор. Далее, по заданию необходимо с помощью...

Как при нажатии пункта в контекстном меню вывести что то на окно
Как при нажатии пункта в контекстном меню вывести что то на окно, читал документацию не нашёл. например нажатие на эксель пишет в label...

Изменение свойств компонентов при выборе пункта меню
у меня в TMainMenu, есть несколько элементов, каждому из которых соответствуют на форме нужные элементы (копки, надписи, картинки и т.д.)....

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.06.2012, 23:31
Переменную b опиши как статическую, чтобы ее значение сохранялось между вызовами, тогда должно сработать. А сейчас у тебя при каждом заходе в функцию выполняется b = 1.
1
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
13.06.2012, 23:38  [ТС]
Спасибо. Работает. А какой функцией можно целиком очистить окно?а то получается что там надписи накладываются и некрасиво
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2012, 00:19
GetClientRect (получаешь координаты клиентской области) + InvalidateRect (объявляешь эту область невалидной, система очистит ее при перерисовке)
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
14.06.2012, 16:48  [ТС]
Ну я вот так вот добавил эти функции. и когда один раз нажимаешь на кнопку меню, окно полностью чистое(а должно быть "было"), а когда второй раз, то появляется "стало". Я просто эти функции не использовал, подскажите как правильно?
P.S. когда ставлю false в InvalidateRect, то ничего не происходит, т.к. фон не меняется..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (b == 1){
                RECT rect;
                GetClientRect(hWnd,&rect);
                InvalidateRect(hWnd,&rect,true);
                hdc = GetDC(hWnd);
                TextOut(hdc, 20, 20, "было", 4);
                ReleaseDC(hWnd, hdc);
                b--;
            }
            else{
                hdc = GetDC(hWnd);
                TextOut(hdc, 20, 20, "стало", 5);
                ReleaseDC(hWnd, hdc);
                b++;
            }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
14.06.2012, 18:59
Я бы вообще по получению ID_CHANGE изменял только индекс отображаемой строки, в рисовал бы саму строку по WM_PAINT:

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
// перенести в начало функции WndProc
        static int b = 1;
// и задать столько строк, сколько нужно
        char *str[2] = {"было", "стало"};
 
// ... и сами обработчики:
 
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            TextOut(hdc, 20, 20, str[b], strlen(str[b])); // Рисуем нужный текст
            EndPaint(hWnd, &ps);
            return 0;
// ...
 
        case ID_CHANGE:
 
            RECT r;
            hdc = GetDC(hWnd);
            GetClientRect(hWnd, &r);
            InvalidateRect(hWnd, &r, TRUE); // Перерисовать фон в WM_PAINT
            
            // Изменяем только индекс отображаемой строки:
            if (b == 1) b--;
            else b++;
            
            ReleaseDC(hWnd, hdc);
            return 0;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2012, 18:59
Помогаю со студенческими работами здесь

Смещение текста пункта меню при наведении
Всем привет! Я создал меню сайта, но когда него наводиш курсор, то текст под меню начинает &quot;бегать &quot; по екрану и становится после...

Изменение картинки\содержимого фрейма\видео при выборе пункта меню
Здравствуйте. Подскажите пожалуйста, можно ли, и как, если можно, сделать следующую вещь: Есть меню (хоть простой список), в центре...

Тема Traveler При нажатии пункта меню идёт перенаправление не на внутренние страницы сайта, а на сайт поставщи
Перед покупкой скачал тему Traveler (0), обнаружил в ней 4 глюка. Я начинающий, с кодом знаком мало. Дабы сравнить глючность, качнул ещё...

Изменение текста при нажатии
Пускай имеем div с текстом. Как сделать так, что бы при нажатии на данный текст появлялся input text с написанным внутри текстом из div и...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Изучаю 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% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru