Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431
1

Рисование на окне из другой функции

13.02.2016, 20:20. Показов 1715. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно нарисовать на окне края из другой функции.
Вот мой "нерабочий" метод
C++
1
2
3
4
5
6
7
        case WM_CREATE:
        {
            // create borders
            std::thread thr(Drawing::RainbowColor, 50, hWnd);
            thr.detach();
            break;
        }
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
namespace Drawing
{
    //Функция отрисовки бордеров у окна размером в 1px
    void DrawBorder(HWND hWnd, HDC hdc, Color borderColor)
    {
        RECT rect;
        GetClientRect(hWnd, &rect);
        SelectObject(hdc, GetStockObject(DC_PEN));
        SelectObject(hdc, GetStockObject(DC_BRUSH));
        SetDCPenColor(hdc, RGBColor(borderColor));
        Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
    }
 
    void RainbowColor(int Speed, HWND hWnd)
    {
        PAINTSTRUCT ps;
        while (true)
        {
            for (int i = 0; i < 700; i ++)
            {
                HDC hdc = BeginPaint(hWnd, &ps);
                Sleep(Speed); // thread sleep. Too fast.
                DrawBorder(hWnd, hdc,Rainbow(i));
                EndPaint(hWnd, &ps);
            }
        }
    }
 
    Color Rainbow(int progress)
    {
        auto div = (abs(progress % 100) * 6);
        auto ascending = ((div % 1) * 255);
        auto descending = 255 - ascending;
        Color retColor;
        switch (div)
        {
        case 0:
            retColor.R = 255;
            retColor.G = ascending;
            retColor.B = 255;
            break;
        case 1:
            retColor.R = descending;
            retColor.G = 255;
            retColor.B = 0;
            break;
        case 2:
            retColor.R = 0;
            retColor.G = 255;
            retColor.B = ascending;
            break;
        case 3:
            retColor.R = 0;
            retColor.G = descending;
            retColor.B = 255;
            break;
        case 4:
            retColor.R = ascending;
            retColor.G = 0;
            retColor.B = 255;
            break;
        default: // case 5:
            retColor.R = 255;
            retColor.G = 0;
            retColor.B = descending;
            break;
        }
        return retColor;
    }
ну и структура Color с дефайном
C++
1
2
3
4
5
6
7
8
9
10
11
#define RGBColor(Color) RGB(Color.R, Color.G, Color.B)
 
namespace Drawing
{
    struct Color
    {
        BYTE Alpha = 0;
        BYTE R = 0;
        BYTE G = 0;
        BYTE B = 0;
    };
У меня не работает отрисовка анимации бордера у окна.

Добавлено через 2 часа 6 минут
upd1: мне это нужно делать не в WM_PAINT, и в отдельном потоке.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2016, 20:20
Ответы с готовыми решениями:

Рисование в окне
Здравствуйте. Я пишу программу средствами WIN API на C++. У меня такой вопрос: Есть ли встроенные...

Рисование в окне
Есть задача - рисование различных картинок при клике левой и правой кнопкой мыши. Решил вот так: ...

Рисование в окне
Здраствуйте! Помогите в написании программы (MFC):1) окно которое вызывает арифметическое...

Рисование в чужом окне
Собственно, я понимаю как рисовать, мне больше интересно 2 момента: 1) Если я просто буду рисовать...

3
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
14.02.2016, 19:18 2
Словами опишите что хотите получить.
0
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431
14.02.2016, 20:06  [ТС] 3
ок. Опишу тупым языком.
У меня есть окно.
Надо нарисовать у него бордеры.
Бордеры должны быть анимированы.
Пример : https://github.com/Nummer/Dest... g/releases (C#)
Мне это надо реализовать на C++ WinAPI
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
15.02.2016, 00:25 4
Лучший ответ Сообщение было отмечено Nummerok как решение

Решение

То есть ваше окно? В вашей программе, вашего процесса? Просто непонятно что есьм "из другой функции".
Чем вам не нравится WM_PAINT?
Использовать BeginPaint/EndPaint можно только внутри WM_PAINT. Иначе использовать Get*DC/ReleaseDC.
1
15.02.2016, 00:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2016, 00:25
Помогаю со студенческими работами здесь

Рисование на окне диалога
Здравствуйте. Наследуюсь от CPaintDc. class CMyPaintDC:public CPaintDC { public: ...

Рисование в графическом окне
Всем здравствуйте. Мы нарисовали на PictureBox средствами GDI+ или API графический примитив....

Рисование в окне (mfc c++)
Задание: разработать программу, позволяющую рисовать эллипсы в окне мышью. Предусмотреть в меню...

Рисование в чужом окне
всем привет как рисовать текст в чужом окне не используя своего окна и не имея его


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

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