С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

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

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

10.01.2017, 11:27. Просмотров 209. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 11:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При перемещении окно виснет (C++ WinAPI):

При перемещении сплиттер оставляет следы на контролах - C++ WinAPI
Суть в том что когда я двигаю сплиттер меняя размер левого или правого окна, сплиттер оставляет следы и не добавляется столбец в...

MessageBox: Как сделать так, чтобы если окно модальное, при клике на родительское окно MessageBox мигал? - C++ WinAPI
Здравия всем! Никак не найду нужный MB_*, как можно сделать так, чтобы если сделать MessageBox модальным, при клике по родительскому...

Окно не перерисовывается при разворачивании - C++ WinAPI
Написать две программы, каждая из которых создает окно. На первом из них должны быть созданы две группы RadioButton. В первой из них...

Не появляется окно при компиляции - C++ WinAPI
Перестало появляться окно при компиляции, хотя раньше все работало нормально. Сперва думал проблема с VS, попробовал на другом ПК с более...

Окно прыгает при каждом нажатии мышки - C++ WinAPI
Окно при каждом нажатии мышки случайным образом прыгает и меняет название на количество сделанных прыжков. Добавлено через 3 часа 2...

Постоянный вывод координат в окно при движении курсора мыши - C++ WinAPI
Написать программу, выводящую на экран монитора окно размером 600 на 600 пикселей, координаты верхнего угла 15, 25 пикселей. При движении...

2
GoshaM
61 / 61 / 16
Регистрация: 02.06.2016
Сообщений: 142
10.01.2017, 17:31 #2
Цитата Сообщение от eagl69 Посмотреть сообщение
В чем может быть причина?
В 17 строке, там при каждом вызове оконно процедуры создается новая кисть.
1
eagl69
4 / 9 / 1
Регистрация: 12.10.2011
Сообщений: 499
10.01.2017, 18:22  [ТС] #3
Большое спасибо, я уже и не знал что делать все пробовал, а вот на счет этого так и не подумал....
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2017, 18:22
Привет! Вот еще темы с ответами:

Не отображается дочернее окно MDI при обработке сообщения WM_COMMAND - C++ WinAPI
Всем привет. Нужна помощь. Не могу понять почему не работает именно в WM_COMMAND! Вызываю окно из WM_CREATE все нормально. Окно...

Как сделать,чтобы при нажатии на кнопку открывалось дочернее окно? - C++ WinAPI
Как сделать,чтобы при нажатии на кнопку открывалось дочернее окно?

Создается окно и тут же закрывается. Как заставить окно оставаться рабочим открытым? - C++ WinAPI
Как заставить окно оставаться рабочим открытым? Скопировал с одного исходника код (с++ WinApi) для создания окна. И оно сразу...

Создать окно поверх главного окна, чтобы главное окно было доступно - C++ WinAPI
здравствуйте. подскажите пожалуйста как сделать окно поверх главного окна, но чтобы главное окно было доступно, как в word окно &quot;поиск&quot;....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.