Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
#1

При перемещении окно виснет - C++ WinAPI

10.01.2017, 11:27. Просмотров 169. Ответов 2
Метки нет (Все метки)

Добрый день!
Написал программу в code blokc, так вот программа иногда виснет, например когда начинаю ее перемещать по экрану туда сюда, или когда часто в программе выполняется InvalidateRect(hwnd, NULL, TRUE);
В чем может быть причина?
Код к сожалению получился большой......
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hcomboBox, htextBox, hchekBox, hcomboBox_HRazm, hBtn_clear;
    RECT krug = {612, 189, 646, 235};
    RECT krug1 = {559, 139, 596, 181};
    RECT stoyka = {665, 435, 774, 581};
    RECT ynit = {460, 422, 549, 578};
    RECT antenna = {502, 36, 678, 112};
    static POINT point;
    int wmId, wmEvent, koll;
    PAINTSTRUCT ps;
    static int sx, sy, x, y;
    HDC hdc, hDc, hdC;
    HBITMAP hBitmap;
    static HDC memBit;
    static BITMAP bm;
    HBRUSH greenBrush = CreateSolidBrush(RGB(192,230,192));
 
    switch (message)                  /* handle the messages */
    {
    case WM_CREATE:
            //создаем кнопку
            hBtn_clear = CreateWindow("BUTTON", "Стереть", BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP, 385, 565, 65, 25, hwnd, (HMENU)ID_BUTTON_CLEAR, hInst, NULL);
            // Создаем список
            hcomboBox = CreateWindow("COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD |
            LBS_WANTKEYBOARDINPUT, 10, 80, 160, 600, hwnd, (HMENU) ID_LIST, hInst, NULL);
            razm_vek = vect_tarif.size();
            for (int a = 0; a < razm_vek; ++a)
            {
                SendMessage(hcomboBox,CB_ADDSTRING,0,(WPARAM)vect_tarif[a].c_str());
            }
            htextBox = CreateWindow("Edit", NULL, WS_VISIBLE | WS_CHILD,
            10, 30, 350, 22,
            hwnd, (HMENU) ID_TEXTBOX, hInst, NULL);
            hchekBox = CreateWindowEx(0,"BUTTON",0, WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
            10, 120, 14, 14, hwnd, (HMENU)IDB_CHECKBOX, hInst,  NULL);
           //создание комбобокса выбора высоты размещения
            hcomboBox_HRazm = CreateWindow("COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD |
            LBS_WANTKEYBOARDINPUT, 250, 80, 110, 300, hwnd, (HMENU) ID_CB_H, hInst, NULL);
            SendMessage(hcomboBox_HRazm,CB_ADDSTRING,0,(WPARAM)_T("Н < 20"));
            SendMessage(hcomboBox_HRazm,CB_ADDSTRING,0,(WPARAM)_T("20 < H < 50"));
            SendMessage(hcomboBox_HRazm,CB_ADDSTRING,0,(WPARAM)_T("50 < H < 70"));
            SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)greenBrush);//изменение цвета фона
            //загружаем изображение
            hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));//создание изображения
            GetObject(hBitmap, sizeof(bm), &bm);//получаем информацию об изображении
            hdc = GetDC(hwnd);
            memBit = CreateCompatibleDC(hdc);
            std::cout << hBitmap << '\n';
            if(SelectObject(memBit, hBitmap)) std::cout << "Рисунок выбран" << '\n';
            ReleaseDC(hwnd, hdc);
        return 0;
    case WM_SIZE:
        sx = LOWORD(lParam);
        sy = HIWORD(lParam);
        break;
    //вывод координат мышки
    case WM_LBUTTONDOWN:
 
        break;
    case WM_LBUTTONUP://определение нажатия кл в регионе и вывод диалога
        if(peererisovka || peererisovka1){DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG3), hwnd, Vvod_RLL);break;}
        if(peererisovka2){DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG4), hwnd, Vvod_stoyka);break;}
        if(peererisovka3){DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG5), hwnd, Vvod_ynita);break;}
        if(peererisovka4){DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG6), hwnd, Vvod_anten);break;}
        break;
    case WM_MOUSEMOVE://определение попадания мышки в регион
        hDc = GetDC(hwnd);
        point.x = LOWORD(lParam);
        point.y = HIWORD(lParam);
        //определение 1 круга
        if(PtInRect(&krug, point)){
           TextOut(hDc, 541, 238, "Добавить в расчет антену РЛЛ",28); peererisovka  = TRUE;
           }
        if(!PtInRect(&krug, point) && peererisovka)
            {  InvalidateRect(hwnd, NULL, TRUE); peererisovka  = FALSE; }
        //определение второго круга
        if(PtInRect(&krug1, point)){
            TextOut(hDc, 541, 238, "Добавить в расчет антену РЛЛ",28); peererisovka1  = TRUE;}
        if(!PtInRect(&krug1, point) && peererisovka1){
            InvalidateRect(hwnd, NULL, TRUE); peererisovka1  = FALSE; }
        //определение стойки
        if(PtInRect(&stoyka, point)){
            TextOut(hDc, 486, 374, "Добавить в расчет размещение стойки",35); peererisovka2  = TRUE;}
        if(!PtInRect(&stoyka, point) && peererisovka2){
            InvalidateRect(hwnd, NULL, TRUE); peererisovka2  = FALSE; }
        //определение юнита
         if(PtInRect(&ynit, point)){
            TextOut(hDc, 486, 374, "Добавить в расчет размещение юнита",35); peererisovka3  = TRUE;}
        if(!PtInRect(&ynit, point) && peererisovka3){
            InvalidateRect(hwnd, NULL, TRUE); peererisovka3  = FALSE; }
        //определение антенны
        if(PtInRect(&antenna, point)){
            TextOut(hDc, 450, 120, "Добавить в расчет размещение антенн или RX",42); peererisovka4  = TRUE;}
        if(!PtInRect(&antenna, point) && peererisovka4){
            InvalidateRect(hwnd, NULL, TRUE); peererisovka4  = FALSE; }
        ReleaseDC(hwnd, hDc);
        break;
    case WM_PAINT:
        hdC = BeginPaint(hwnd, &ps);
        SetBkColor(hdC, RGB(192,230,192));
        TextOut(hdC, 10, 5, _T("Введите название расчета"), 24);
        TextOut(hdC, 10, 60, _T("Выберите:  регион            :          высоту размещения"), 57);
        TextOut(hdC, 30, 120, _T("Использовать в расчетах разовые платежи"), 39);
        if(vibran_region)
        {
            TextOut(hdc, 100, 400, vect_tarif[nom_combobokc].c_str(), 20);
        }
        if(IsC) TextOut(hdC, 10, 140, _T("В расчеты будут включены: выдача ТУ и т.д."), 42);
        else TextOut(hdc, 10, 140, _T("ЧЕКБОКС НЕ УСТАНОВЛЕН "), 21);
        BitBlt(hdC, 450, 0, bm.bmWidth, bm.bmHeight, memBit, 0, 0, SRCCOPY);
        koll = vect_peshat.size();
        if(vect_peshat.size() > 0)
        {
            TextOut(hdC, 10, 165, "Ч Е К :", 7);
            int hag = 180;
            for(int a = 0; a < koll; ++a)
            {
                TextOut(hdC, 10, hag, vect_peshat[a].c_str(), vect_peshat[a].size());
                hag = hag + 16;
            }
        }
        std::cout << vect_peshat.size() << '\n';
        EndPaint(hwnd, &ps);
        break;
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
            {
            case ID_CB_H:
                if(HIWORD(wParam) == CBN_SELENDOK)//обработка выбранного региона
                {
                std::cout << "Выбрана высота размещения" << '\n';
                nom_CB_h_razm = SendMessage(hcomboBox_HRazm, CB_GETCURSEL, 0, 0);
                if(Hcek) rashet_stoimosti();
                InvalidateRect(hwnd, NULL, TRUE);
                }
            break;
            case IDB_CHECKBOX:
                std::cout << "Сработал чек бокс" << '\n';
                IsC = SendMessage(hchekBox, BM_GETCHECK, 0, 0);// проверить, стоит ли галочка
                InvalidateRect(hwnd, NULL, TRUE);//команда на перересовку
                break;
            case ID_LIST:
                if(HIWORD(wParam) == CBN_SELENDOK)//обработка выбранного региона
                {
                std::cout << "Выбран регион"<< '\n';
                nom_combobokc = SendMessage(hcomboBox, CB_GETCURSEL, 0, 0);
                std::cout << vect_tarif[nom_combobokc] << '\n';
                char * ptrEnd;
                char uuu[300];
                int s = 0;
                for(int a = 19; a<=vect_tarif[nom_combobokc].size(); ++a)//цикл выделения цифр
                {
                    uuu[s] = vect_tarif[nom_combobokc][a];
                    s++;
                }
                dlina_str_vek = s;
                proverka_tohki(uuu);//функцтя проверки запятой
                tarif1 = strtod(uuu, &ptrEnd);//преобразование строки в число
                tarif2 = strtod(ptrEnd, &ptrEnd);
                tarif3 = strtod(ptrEnd, &ptrEnd);
                tarif4 = strtod(ptrEnd, NULL);
                std::cout << tarif1 << " " << tarif2 << " " << tarif3 << " " << tarif4 << '\n';
                vibran_region = TRUE;
                if(Hcek) rashet_stoimosti();
                InvalidateRect(hwnd, NULL, TRUE);
                }
                break;
            case ID_BUTTON_CLEAR:
                MessageBox(hwnd, "Вы уверены, что хотите удалить все расчеты?", "", MB_OKCANCEL);
                if (IDYES)
                {
                if(vect_peshat.size() > 0) vect_peshat.clear();//очищаем вектор печати
                if(spisok_anten.size() > 0) spisok_anten.clear();//вектор списка антенн
                if(spisok_RLL.size() > 0) spisok_RLL.clear();
                okFunkcia = FALSE;
                Hcek = FALSE;
                InvalidateRect(hwnd, NULL, TRUE);
                Sleep(100);
                }
                break;
            case ID_MENY_TARIF:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, Vvod_tarifov);
                break;
            case IDM_O_PROG:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, Oprogramme);
                break;
            case ID_MENU_VIXOD:
                DestroyWindow(hwnd); break;
                default: return DefWindowProc(hwnd, message, wParam, lParam);
            }
        break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 11:27     При перемещении окно виснет
Посмотрите здесь:

C++ WinAPI При выборе пункта меню "New" не появляется дочернее окно hChild
C++ WinAPI Окно
C++ WinAPI При перемещении сплиттер оставляет следы на контролах
C++ WinAPI Программа виснет на CreateWindowEx
C++ WinAPI Окно не перерисовывается при разворачивании
При запуске программы вылетает окно "Приложение будет закрыто" C++ WinAPI
C++ WinAPI Окно прыгает при каждом нажатии мышки
C++ WinAPI Постоянный вывод координат в окно при движении курсора мыши
Не отображается дочернее окно MDI при обработке сообщения WM_COMMAND C++ WinAPI
C++ WinAPI Как сделать,чтобы при нажатии на кнопку открывалось дочернее окно?
C++ WinAPI Как увеличить окно при нажатии "подменю"?
C++ WinAPI Не появляется окно при компиляции

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoshaM
38 / 38 / 12
Регистрация: 02.06.2016
Сообщений: 85
10.01.2017, 17:31     При перемещении окно виснет #2
Цитата Сообщение от eagl69 Посмотреть сообщение
В чем может быть причина?
В 17 строке, там при каждом вызове оконно процедуры создается новая кисть.
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 478
10.01.2017, 18:22  [ТС]     При перемещении окно виснет #3
Большое спасибо, я уже и не знал что делать все пробовал, а вот на счет этого так и не подумал....
Yandex
Объявления
10.01.2017, 18:22     При перемещении окно виснет
Ответ Создать тему
Опции темы

Текущее время: 13:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru