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

WM_PAINT перестает перерисовывать окно

15.12.2009, 18:17. Показов 6191. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!!!
Такая проблема...делаю игру на Visual C++...игра типа арканоида(внизу платформа, сверху квадратики, мячом эти квадраты сбиваются)...в WM_TIMER меняются координаты мяча и вызывается через SendMessage WM_PAINT... собственно все в принципе работает и все бы хорошо, но через некоторое время на экране все зависает, то есть перестает программа перерисовывать экран ...отслеживал, координаты мяча меняются, следовательно просто не перерисовывается окно...

Добавлено через 39 минут
если нужны куски кода, отпишитесь - я пришлю
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2009, 18:17
Ответы с готовыми решениями:

При добавлении WM_PAINT перестаёт отрабатывать ToolTips
Друзья, не могу понять :-( Вот пишу для примера так void CreateHint(HWND hwnd, char* strTT) { HWND hwndTT; TOOLINFO...

Как перерисовывать окно в Win32 API?
Здравствуйте, при нажатие срелочки вверх должен выводиться текст, но возникает ошибка(использована неинициализированная локальная...

Сколько раз в секунду можно перерисовывать окно?
Окно ввода(точнее статик), с какой максимальной частотой можно изменять его?

8
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
15.12.2009, 21:30
Советую почитать о действительный и недействительный областях.

но если ты совсем лентяй, могу посоветовать вместо SendMessage() применять функцию
C++
1
InvalidateRect(hWnd, NULL, TRUE);
1
1 / 1 / 0
Регистрация: 15.12.2009
Сообщений: 11
15.12.2009, 21:34
а можно запустить циклом
0
azatb)4
16.12.2009, 07:48
но ведь SendMessage() вызывает WM_PAINT и я смотрел - там выполняются функции рисования клеток, мяча и т.д., но на окне все это не оттображается...
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.12.2009, 10:10
azatb)4, еще раз повторяю...
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Советую почитать о действительный и недействительный областях.
0
1 / 1 / 0
Регистрация: 12.07.2012
Сообщений: 5
12.07.2012, 10:05
Так и не понял что надо! Тоже через таймер всё движется, обновляется, сначала всё нормально, потом минут через 5 появляется хрень, а потом и вовсе окно становится полностью белым!
Только столкнулся с WinApi, помогите пожалуйста, не пойму в чём проблема!

Вот нормально идёт таймер:


Потом случается вот это:

Но таймер продолжает работать и циферки меняются!

Потом просто перестаёт обновляться, а дальше и вовсе всё окно белым становится! Ну т.е. оно не зависает, а просто белое...(
0
1 / 1 / 0
Регистрация: 12.07.2012
Сообщений: 5
12.07.2012, 10:26
Вот код)

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
#include <iostream>
#include <windows.h>
#include <ctime>  
 
// time_t ntime;
unsigned ntime;
RECT rc;
RECT r; 
 
LRESULT CALLBACK DCDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    HDC hdc;
    PAINTSTRUCT PaintStruct;
    SetTimer(hWnd,1,30,NULL);
 
char buffer[256] ="time: "; 
char temp[128];
 
    switch (Message) { 
 
case WM_TIMER: 
ntime++;
    InvalidateRect(hWnd,&rc,false);
    break;
                             
case WM_PAINT : 
 
hdc = BeginPaint (hWnd, &PaintStruct);
SetRect(&rc, 0, 0, 500, 500);
 
            
SetRect(&r, 500, 0, 600, 500);
FillRect(hdc, &r, HBRUSH(CreateSolidBrush(RGB(25,25,25))));
FillRect(hdc, &rc, HBRUSH(CreateSolidBrush(RGB(0,0,0))));
 
sprintf_s(temp, "%d",ntime);
strcat(buffer,temp);
TextOut(hdc, 20, 270, buffer, 25);
EndPaint(hWnd,&PaintStruct);    
 break;
 
       case WM_DESTROY :
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
        
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[] = "DCDemo";
 
 
    /* Регистрация класса окна */
    /* Заполнение структуры WNDCLASS */
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = DCDemoWndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = "MyMenu";
    WndClass.lpszClassName = szClassName;
    
 
    if ( !RegisterClass(&WndClass) ){
        MessageBox(NULL, "Can't register class!", "ERROR!", MB_OK);
        return 0;
    }
    
    hWnd = CreateWindow(szClassName, "Игра", WS_OVERLAPPEDWINDOW,// | WS_VSCROLL | WS_HSCROLL, 
        500, 200, 600, 500, NULL, NULL, hInstance, NULL); //500 от левого края 200 от верха 600 ширина 500 высота 
    if (!hWnd) {
        MessageBox(NULL, "Can't create window!", "ERROR!", MB_OK);
        return 0;
    }
    
    
    /* показать окно */
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    
    /* Обработка сообщений */
    while (GetMessage(&Msg, NULL, 0, 0)) {
 
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
 
    return Msg.wParam;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
12.07.2012, 10:40
Лучший ответ Сообщение было отмечено volvo как решение

Решение

У тебя ресурсы утекают. Зайди в TaskManager и посмотри на количество GDI Objects твоего приложения. Ибо кисть, созданную через CreateSolidBrush надо удалять, а ты этого не делаешь. Вот тебе и причина: со временем программа перестает себя адекватно вести.
1
1 / 1 / 0
Регистрация: 12.07.2012
Сообщений: 5
12.07.2012, 11:39
UI, спасибо большое!) Так и думал что где-то утечка, но не знал где... Вот что значит глянул недопример в интернете - без нужного создания и удаления -_-

Отрывок где изменил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
                             
case WM_PAINT : 
 
HBRUSH Brush;
hdc = BeginPaint (hWnd, &PaintStruct);
 
Brush = CreateSolidBrush(RGB(25,25,25));
SetRect(&r, 500, 0, 600, 500);
FillRect(hdc, &rc, Brush);
DeleteObject(Brush);
 
Brush = CreateSolidBrush(RGB(0,0,0));   
SetRect(&rc, 0, 0, 500, 500);
FillRect(hdc, &r, Brush);
DeleteObject(Brush);
 
sprintf_s(temp, "%d",ntime);
strcat(buffer,temp);
TextOut(hdc, 20, 270, buffer, 25);
EndPaint(hWnd,&PaintStruct);    
break;
 
case WM_DESTROY :
Сделал так - всё нормик!)

Если не удалять каждый раз - опять происходит утечка...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2012, 11:39
Помогаю со студенческими работами здесь

Не могу отправить окну сообщение WM_PAINT (точнее, не могу перерисовать окно)
Смотрите оконную функцию она в самом низу. Всё остальное шаблонный код по созданию окна. #include &lt;windows.h&gt; #include...

Перестает обновляться окно
Приветствую. Написал игру &quot;хальма&quot;. Все работает хорошо, но через какое-то время, а именно где-то ходов через 15-20, при очередном ходе,...

Активное окно перестает быть активным
Активное окно перестает быть активным. Открыл Word - печатаешь, потом понимаешь, что просто стучишь по клаве. Не весело, и очень часто к...

Окно премьера (Adobe Premiere Pro CS5) перестаёт быть активным
Проблема следующая: Я делаю захват видео (F5) нажимаю на просмотр (Play) и если я переключаюсь на другое окно допустим alt+tab на...

Программа перестает отвечать после сворачивания или перехода на другое окно
Такая проблема. Программа перестает отвечать после сворачивания. То есть если если включить, она работает, потом сворачиваешь, или...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru