С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 35
1

Перерисовывание содержимого WM_PAINT

08.01.2014, 12:13. Показов 1166. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В WM_PAINT вывожу данные из массива циклом, в WM_KEYDOWN изменяю часть массива при нажатии определенных клавиш и пытаюсь с помощью InvalidateRect() обновить экран чтобы содержимое WM_PAINT по новому отрисовало но массив рисуется тот же что до изменения. вопрос: как правильно перерисовать WM_PAINT? ну и я наверно не правильно использую InvalidateRect()?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2014, 12:13
Ответы с готовыми решениями:

WM_PAINT
На главном окне- статик. По сообщению WM_PAINT и при необходимости рисую на нем. Все как описано не...

Виснет WM_PAINT
Я долго ломал голову как мне сделать OnPaint чтобы ничего не тормозило и отрисоввывалось быстро....

WM_PAINT и tpanel
Как отслеживать в 2007 сообщение WM_Paint для tpanel Пишу код procedure WMPAINT(var Msg:...

WM_PAINT зацикливается
Подскажите, пожалуйста, с обработкой сообщения перерисовки. Вот так нормально работает без...

6
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.01.2014, 13:11 2
Покажи код, а то экстрасенсы на новогодних каникулах.
0
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 35
08.01.2014, 13:31  [ТС] 3
объявляю массив
C++
1
2
3
4
5
6
7
8
int M_figure [8] [8] = {{9820, 9822, 9821, 9818, 9819, 9821, 9822, 9820},
                             {9823, 9823, 0, 9823, 9823, 9823, 9823, 9823},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 9823, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {9817, 9817, 9817, 9817, 9817, 9817, 9817, 9817},
                             {9814, 9816, 9815, 9813, 9812, 9815, 9816, 9814}};
нажатие клавиши

C++
1
2
3
4
5
6
case WM_KEYDOWN:
{
   if(wParam==VK_LEFT)
     M_figure [2] [3] = 9820;   
   InvalidateRect(hWnd, NULL, TRUE);   
}
ну и сам 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
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
case WM_PAINT:
 
hdc = BeginPaint(hWnd, &ps);
        RECT rect;
        HFONT hFont;
        SetBkMode(hdc, TRANSPARENT);
 
        for (j=0;j<600;j+=75)
             for (i=0;i<600;i+=75)
                
             {    _k=j/75;
                  _t=i/75;
                 HBRUSH MyBrush,OldBrush;
                 kolor = kolor_1;              
                 if (M [_k] [_t] == 0)  
                 {kolor = 255;}             
                 MyBrush = CreateSolidBrush(RGB(kolor,kolor,kolor));
                OldBrush=(HBRUSH) SelectObject(hdc,MyBrush);
                Rectangle(hdc,j,i,f+j,f+i);
             SelectObject(hdc,OldBrush);
             DeleteObject(MyBrush);
        }
        hFont = CreateFont(48,0,0,0,FW_REGULAR,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
                CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, VARIABLE_PITCH,TEXT("Impact"));
            SelectObject(hdc, hFont);
            
        for (i=0;i<=7;i+=1)
        {
            y_figure+=75;
            x_figure = -60;
            for (j=0;j<=7;j+=1)
        {
        figure = M_figure[i][j];
        
        x_figure+=75;
        switch (figure)
        {
    case 9812:
        TextOut(hdc,x_figure,y_figure,L"\u2654",1);
        break;
    case 9813:      
        TextOut(hdc,x_figure,y_figure,L"\u2655",1);
    break;
    case 9814:
        TextOut(hdc,x_figure,y_figure,L"\u2656",1);
        break;
    case 9815:
        TextOut(hdc,x_figure,y_figure,L"\u2657",1);
        break;
    case 9816:
        TextOut(hdc,x_figure,y_figure,L"\u2658",1);
        break;
    case 9817:
        TextOut(hdc,x_figure,y_figure,L"\u2659",1);
        break;
    case 9818:
        TextOut(hdc,x_figure,y_figure,L"\u265A",1);
        break;
    case 9819:      
        TextOut(hdc,x_figure,y_figure,L"\u265B",1);
    break;
    case 9820:
        TextOut(hdc,x_figure,y_figure,L"\u265C",1);
        break;
    case 9821:
        TextOut(hdc,x_figure,y_figure,L"\u265D",1);
        break;
    case 9822:
        TextOut(hdc,x_figure,y_figure,L"\u265E",1);
        break;
    case 9823:
        TextOut(hdc,x_figure,y_figure,L"\u265F",1);
        break;
    default:
        TextOut(hdc,x_figure,y_figure,L"",0);       
        }
        }
        }
        EndPaint(hWnd, &ps);
        break;
0
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.01.2014, 15:02 4
M_figure случайно не локальный в оконной функции?
0
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 35
08.01.2014, 15:12  [ТС] 5
Цитата Сообщение от Somebody Посмотреть сообщение
M_figure случайно не локальный в оконной функции?
объявляю в WndProc как и все перемеренные. При срабатывании WM_KEYDOWN записывается элемент как и нужно. когда держу долго кнопку влево начинает мерцать окно вернее что нарисовано
0
2836 / 1645 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
08.01.2014, 15:15 6
Ну так раз M_figure локальная, она заново инициализируется при каждом входе в функцию. Сделай её static.
1
0 / 0 / 0
Регистрация: 26.06.2013
Сообщений: 35
08.01.2014, 15:22  [ТС] 7
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    
 
    int i,j,_k=0,_t=0,x_figure=-100,y_figure=-60,kolor=0,kolor_1=100;
    int x=30,y=30,f=75;
    int metric[4]={0};
    int wfont;
    int hRasLines;
    char figure_out;
 
    
    
    int M [8] [8] = { {0,1,0,1,0,1,0,1}, 
                     {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1}, 
                     {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1},
                     {1,0,1,0,1,0,1,0}, {0,1,0,1,0,1,0,1},{1,0,1,0,1,0,1,0}};
 
    
    int M_figure [8] [8] = {{9820, 9822, 9821, 9818, 9819, 9821, 9822, 9820},
                             {9823, 9823, 0, 9823, 9823, 9823, 9823, 9823},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 9823, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0},
                             {9817, 9817, 9817, 9817, 9817, 9817, 9817, 9817},
                             {9814, 9816, 9815, 9813, 9812, 9815, 9816, 9814}};
Добавлено через 2 минуты
Цитата Сообщение от Somebody Посмотреть сообщение
Ну так раз M_figure локальная, она заново инициализируется при каждом входе в функцию. Сделай её static.
мне ее менять нужно постоянно и чтобы она запоминала эти изменения. разве с static так получится?

Добавлено через 4 минуты
Somebody, спасибо за помощь все заработало. а так я более мение правильно делаю? или костыли придумал?
0
08.01.2014, 15:22
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2014, 15:22
Помогаю со студенческими работами здесь

В WM_PAINT не обновляется
В событиях WM_KEYDOWN и классе, где изменяется переменная, переменная изменяется. Т.е код на вывод...

OpenGL + WM_PAINT
У меня нет доступа к HWND окна. Есть только доступ к событию WM_PAINT и HDC, полученного в...

Перехват сообщения WM_PAINT
Здравствуйте, возникла такая проблема - нужно периодечески обновлять граф, нарисованный средствами...

Помогите с сообщением WM_PAINT
Привет всем.создал класс который рисует окружность внутри квадрата и выводит на экран это все...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru