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

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер. Есть задача - доработать программу так, чтобы при нажатии на пункт меню 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2012, 22:47
Ответы с готовыми решениями:

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

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

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

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

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,544
Записей в блоге: 8
13.06.2012, 23:31 2
Переменную b опиши как статическую, чтобы ее значение сохранялось между вызовами, тогда должно сработать. А сейчас у тебя при каждом заходе в функцию выполняется b = 1.
1
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
13.06.2012, 23:38  [ТС] 3
Спасибо. Работает. А какой функцией можно целиком очистить окно?а то получается что там надписи накладываются и некрасиво
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,544
Записей в блоге: 8
14.06.2012, 00:19 4
GetClientRect (получаешь координаты клиентской области) + InvalidateRect (объявляешь эту область невалидной, система очистит ее при перерисовке)
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
14.06.2012, 16:48  [ТС] 5
Ну я вот так вот добавил эти функции. и когда один раз нажимаешь на кнопку меню, окно полностью чистое(а должно быть "было"), а когда второй раз, то появляется "стало". Я просто эти функции не использовал, подскажите как правильно?
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
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,544
Записей в блоге: 8
14.06.2012, 18:59 6
Я бы вообще по получению 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
14.06.2012, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2012, 18:59
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru